我经常听说其他语言更适合于多核/并发编程,如Clojure、Scala、Erlang等,但我有点困惑,为什么我需要担心多核,Java/.NET VM不应该自动处理吗?如果不是,背后的原因是什么?
是不是因为提到的这些语言是函数式的,并且比非函数式语言有一些固有的优势?
发布于 2011-08-16 22:30:00
你需要注意的原因是处理器通常不会变得更快。取而代之的是,它们中的更多正在以附加内核的形式添加到计算机中。为了让程序能够利用额外的处理器,一般来说,它必须使用多个线程来实现。Java和大多数其他语言不会自动在程序中使用更多的线程。这是您需要手动执行的操作。
有些人喜欢像Scala、Erlang和F#这样的函数式语言,而不是多线程编程中的非函数式语言。函数式语言在默认情况下至少是浅层不变的,因此在理论上更容易在多线程的情况下使用。
这里有一篇关于这个主题的很好的文章。
发布于 2011-08-16 22:31:04
函数式语言有一个固有的优势,即大多数函数/方法调用都是幂等的,而且它们通常会大量使用“不变性”。
在使用不可变的“东西”时进行并发操作要比使用可变的“东西”容易得多。
但不管怎样:你需要担心并发性,因为我们将使用越来越多的核心和,而不是,越来越快的时钟。Java / C#不能自动地使你的程序并发:你仍然需要自己做艰苦的工作。
发布于 2011-08-16 22:31:51
在普通命令式语言的情况下,默认情况下不会从平台获得太多帮助。没有一个编译器足够聪明,可以并行化正常的命令式代码。
但是,有各种帮助库可以在不同的平台上为您提供帮助。例如,.NET中的任务并行库允许您这样做,例如:
Parallel.ForEach(files, file =>
{
Process(file);
});纯函数式语言总是具有最小共享状态的好处,这意味着这样的代码更容易并行化。
https://stackoverflow.com/questions/7079774
复制相似问题