6

我一直在阅读和思考这个问题。嗡嗡声似乎是在多核的未来,函数式语言将变得更加流行。我是函数式编程的相对菜鸟。我唯一的接触是学术性的,没有什么复杂到可以真正让这类语言通过它的步伐。

因此,据我了解,纯函数可以轻松透明地并行化。这是一个很棒的功能,因为它意味着编写线程代码没有任何麻烦。但是,它似乎对串行代码没有太大帮助。

Example:

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

像这样的串行调用似乎是一个常见的,有时是不可避免的问题。对我来说,这些是并行化如此困难的根源。有些任务只是(或似乎是)高度连续的。拥有“功能心态”是否可以让您更好地分解一些看似连续的任务?是否有任何现有的函数式语言提供透明的机制来更好地并行化高度串行的代码?最后,函数式语言本质上是否比 OO 或命令式语言更具可并行性,为什么?

4

2 回答 2

9

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

事实上,因为大多数普通程序员很难使用纯函数式语言工作,并且因为完全禁止可变状态的严厉政策可能效率低下,所以关于允许以命令方式编写单个函数体但不允许侧面的想法存在一些嗡嗡声跨职能的影响。换句话说,所有要并行化的函数都必须是纯函数。然后,您可以为局部变量设置可变状态,以使代码更易于编写和更高效,但仍允许安全、轻松地自动并行化对这些纯函数的调用。例如,D 语言的 2.0 分支正在探索这一点。

于 2009-03-11T02:55:22.893 回答
6

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

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

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

您正在指定要执行的操作的意图,如果编译器知道表达式的每一部分都没有副作用,它可以安全地分配数组的不同部分以在不同的内核上处理。实际上有一个 .AsParalell 将出现在并行 linq (plinq) 上,它将启用它。问题在于它无法强制执行无副作用位(在不支持它的语言/框架上),如果开发人员不知道,这可能会变得非常丑陋。因此,他们明确表示,但您可以看到这在此过程中造成了麻烦。

于 2009-03-11T02:57:33.857 回答