多核/并发编程与.NET/Java

4

我经常听到其他语言被推广为更适合多核/并发编程,如Clojure、Scala、Erlang等等。但我有点困惑,为什么我需要担心多个核心,Java/.NET虚拟机不应该自动处理吗?如果不能,背后的原因是什么?

这是因为那些提到的语言是函数式的,并且具有某些内在优势,非函数式语言没有这些优势吗?

4个回答

1
你需要关注的原因是,处理器通常不会变得更快。相反,它们以额外的核心的形式添加到计算机中。为了让程序利用额外的处理器,通常必须使用多个线程来完成。Java和大多数其他语言不会自动在程序中使用更多的线程。这是你需要手动完成的事情。
一些人喜欢使用函数式语言(如Scala、Erlang和F#)进行多线程编程,而不是非函数式语言。函数式语言往往默认至少是浅不可变的,因此从理论上讲,在多线程环境中更容易使用。
以下是一篇关于这个主题的非常好的文章:

1

函数式编程语言具有固有的优势,即大多数函数/方法调用是幂等的,并且它们通常大量使用“不可变性”。

在使用不可变的“东西”进行并发操作时,比使用可变的“东西”要容易得多。

但无论如何:您需要担心并发性,因为我们将使用更多和更多的核心而不是更快的时钟。 Java / C#不能自动使您的程序并发:您仍然必须自己努力。


0
在普通命令式语言的情况下,默认情况下,平台并不能提供太多帮助。没有编译器足够聪明,可以将普通命令式代码并行化。
然而,在不同的平台上,有各种辅助库可以帮助您。例如,.NET 中的任务并行库允许您执行以下操作:
Parallel.ForEach(files, file => 
{
   Process(file);
});

纯函数式语言总是具有最小共享状态的优点,这意味着这样的代码更容易并行化。


0

我从未编写过函数式语言的程序,但据说它们更容易进行并发编码,因为状态不会改变(或者改变得不多),这样你就可以在两个线程上同时拥有相同的对象。如果在Java中两个线程同时拥有相同的对象,则必须非常小心,并使用一些特殊的同步构造,以便两个线程在必要时可以“看到”对象处于相同的状态。

当前编程中的问题是,每个人都习惯了按顺序执行任务,但硬件正在向多核移动。我们必须完全改变编码和思考代码的方式。目前,在Java或C#中进行多核编程基本上只是带有一些技巧的顺序编码,以使其可并行化。函数式编程是否将成为所需的范式转变?我不知道。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接