Parallel processing 函数式语言天生比它们的OO或命令式语言更具并行性吗?

Parallel processing 函数式语言天生比它们的OO或命令式语言更具并行性吗?,parallel-processing,functional-programming,Parallel Processing,Functional Programming,我一直在阅读和思考这个问题。人们似乎认为,在多核未来,函数式语言将变得更加流行。我是函数式编程的新手。我唯一接触的是学术,没有什么复杂到足以让这门语言真正走上正轨的程度 因此,据我所知,纯函数可以轻松透明地并行化。这是一个很好的特性,因为它意味着编写线程代码没有任何麻烦。然而,它似乎对串行代码没有多大帮助 Example: fooN( ... (foo3(foo2(foo1(0))))) 像这样的连续呼叫似乎是一个常见且有时不可避免的问题。对我来说,这些是并行化如此困难的根本原因。有些任务仅

我一直在阅读和思考这个问题。人们似乎认为,在多核未来,函数式语言将变得更加流行。我是函数式编程的新手。我唯一接触的是学术,没有什么复杂到足以让这门语言真正走上正轨的程度

因此,据我所知,纯函数可以轻松透明地并行化。这是一个很好的特性,因为它意味着编写线程代码没有任何麻烦。然而,它似乎对串行代码没有多大帮助

Example:

fooN( ... (foo3(foo2(foo1(0)))))

像这样的连续呼叫似乎是一个常见且有时不可避免的问题。对我来说,这些是并行化如此困难的根本原因。有些任务仅仅是(或似乎是)高度串行的。拥有“功能性思维”是否能让你更好地分解一些看似连续的任务?现有的函数式语言是否提供了透明的机制来更好地并行化高度串行的代码?最后,函数式语言是否天生比OO或命令式语言更具并行性?为什么?

函数式语言比命令式语言和OO语言更具并行性,因为它们是纯函数。但是,您是绝对正确的,如果您有这些类型的数据依赖项,您就不能将其并行化。函数式编程的主要价值在于使代码中存在的并行性更容易被发现和解释,因为只有数据依赖关系,而不是共享的可变状态,才可能成为阻碍


事实上,由于大多数普通程序员很难使用纯函数式语言,而且完全禁止可变状态的严厉政策可能效率低下,因此允许强制编写单个函数体的想法引起了一些热议,但不允许跨功能的副作用。换句话说,所有要并行化的函数都必须是纯函数。然后,可以为局部变量设置可变状态,以使代码更易于编写和更高效,但仍然允许安全、轻松地自动并行化对这些纯函数的调用。例如,D语言的2.0分支正在对此进行探索。

主要是关于副作用。如果编译器知道某些代码段没有副作用,它可以根据代码结构进行优化,以并行运行其中一些代码段

考虑C#/上的linq,它是半功能的:

var someValues = from c in someArray
                where // some  comparisson with no side effects
                select c;

如果编译器知道表达式的每一部分都没有副作用,那么它就可以安全地将数组的不同部分分配给不同的内核来处理。实际上,有一个.aspalarell将出现在并行linq(plinq)上,它将实现这一点。问题在于它将无法强制执行无副作用位(在不支持它的语言/框架上),如果开发人员不知道,这可能会变得非常糟糕。正因为如此,他们将其明确化,但您可以看到,这一点会带来麻烦。

纯函数式语言(带有适当的monda)是未来的关键。你不需要成为一个不朽的程序员就可以改变它。你只需要换一种方式来处理问题。不同意。在小范围内短时间存在的可变状态(例如函数的局部变量)是一件好事,因为它使函数的实现更容易、更高效。当它成为问题时,是针对成员变量和全局变量。更容易是一个主观术语。我以前和你想的一样,现在我想的正好相反。我两次都是对的。