作者:哆啦356 | 来源:互联网 | 2022-12-06 15:15
我最近正在收听Martin Odersky的视频,他试图解释功能语言(例如Scala,当然不一定是 Scala)的基本优势,而不是 OOP或程序语言.
他解释说,摩尔定律最近使我们失败,因此为了使处理器"更快",而不是能够使核心中的晶体管数量增加一倍,CPU制造商只是提供更多核心.这反过来又使CPU可以通过并发/多线程应用程序更充分地利用CPU.因此主要的用处是:应用程序并发的越多,其代码的更多代码段在不同的内核上同时运行,并且CPU上的内核越多,程序执行的总体速度就越快.
到现在为止还挺好.
他未能解释的(或者更可能的是,我没有掌握的内容)是为什么像Scala 这样的函数式语言能够使其与其他非函数式语言更加并发.由于我们碰巧讨论的是JVM空间,让我们快速比较Java和Scala.什么是Scala程序,如果它是用纯Java实现的,会使并行化/并发化更加困难,特别是如果它全部编译为JVM字节码并在具有相同本机功能的相同JVM上运行??
意思是我有两个JVM应用程序,用Java编写的App1和用Scala编写的App2.他们都完成相同的任务并完成相同的任务.两者都被编译为JVM字节码,并在安装了相同JVM的同一台计算机上运行.Scala应用程序如何"利用"JVM功能使其更适合并发性而不是Java(因此,在具有更多内核的CPU上更快)?
1> Chaitanya Wa..:
当你说你的两个应用程序最终归结为JVM上的字节代码时,你是完全正确的.Scala可用于并发的大多数库和框架也可用于Java.然而,让Scala与众不同的是Scala内置的 对不变性的支持.Scala具有非常丰富的不可变集合,并且这种包含不变性的特性使得为并发和并行应用程序编写代码变得更加容易.Scala将用户从编写线程级代码中抽象出来,并让用户更专注于业务逻辑.期货API在此期间非常方便.
Scala包含函数式编程范例(即组合函数)并在actor中隔离可变状态,通过它可以消除您将遇到的所有典型并发问题,例如在Java中编写线程.这就是Scala被选为设计Spark的语言的原因.
现在,关于scala如何利用更多内核与其他非函数语言相比,你的问题的主要部分是: - scala中的Futures API有一个底层执行上下文,它只是一个可由开发人员配置的线程池.使用此API,您将能够利用所有核心.
@hotmeatballsoup你错过了这一点.Odersky没有声称Scala代码比等效的Java代码更快,这可能是荒谬的.他提出了更为可靠的主张*并行代码比顺序代码更快*(不是很有争议),并且它更容易在函数式语言中编写并行代码*.因此,Scala比Java更快,因为不可变性和更好的并发构造使编写快速代码变得更容易,而不是因为等效代码更快.
@hotmeatballsoup我没有数字来评论Java和Scala应用程序的执行时间.但是,如果您坐下来编写相同的代码来实现并行性和并发性,那么与Scala相比,开发人员用Java编写它会变得非常棘手.