我经常听到其他语言被推广为更适合多核/并发编程,如Clojure、Scala、Erlang等等。但我有点困惑,为什么我需要担心多个核心,Java/.NET虚拟机不应该自动处理吗?如果不能,背后的原因是什么?
这是因为那些提到的语言是函数式的,并且具有某些内在优势,非函数式语言没有这些优势吗?
我经常听到其他语言被推广为更适合多核/并发编程,如Clojure、Scala、Erlang等等。但我有点困惑,为什么我需要担心多个核心,Java/.NET虚拟机不应该自动处理吗?如果不能,背后的原因是什么?
这是因为那些提到的语言是函数式的,并且具有某些内在优势,非函数式语言没有这些优势吗?
函数式编程语言具有固有的优势,即大多数函数/方法调用是幂等的,并且它们通常大量使用“不可变性”。
在使用不可变的“东西”进行并发操作时,比使用可变的“东西”要容易得多。
但无论如何:您需要担心并发性,因为我们将使用更多和更多的核心而不是更快的时钟。 Java / C#不能自动使您的程序并发:您仍然必须自己努力。
Parallel.ForEach(files, file =>
{
Process(file);
});
纯函数式语言总是具有最小共享状态的优点,这意味着这样的代码更容易并行化。
我从未编写过函数式语言的程序,但据说它们更容易进行并发编码,因为状态不会改变(或者改变得不多),这样你就可以在两个线程上同时拥有相同的对象。如果在Java中两个线程同时拥有相同的对象,则必须非常小心,并使用一些特殊的同步构造,以便两个线程在必要时可以“看到”对象处于相同的状态。
当前编程中的问题是,每个人都习惯了按顺序执行任务,但硬件正在向多核移动。我们必须完全改变编码和思考代码的方式。目前,在Java或C#中进行多核编程基本上只是带有一些技巧的顺序编码,以使其可并行化。函数式编程是否将成为所需的范式转变?我不知道。