很抱歉,我无法在标题中更清楚地表达这个问题,但本质上是这样的:几乎所有的函数式语言都有允许通过尾递归处理变量列表的结构,比如这个错误的伪代码,它总结了一个数字列表:
sumup(0,A) -> A.
sumup(N,A) -> sumup(N) + A.
然而,函数式语言对我最大的吸引力之一是它们固有的并行性。尽管一个问题,比如总结一个数字列表,显然是相当可并行的,而且几乎可以肯定是分而治之最有效的解决方法,但我不知道语言特性会使这成为一种自然的编程方式。事实上,除非该语言具有允许读取基于函数的参数数量并基于索引检索参数的功能,否则我不知道一个如何能够这样做。是否有任何功能语言具有
假设我需要预先形成以下计算密集型任务
For i in range(100000000):
doComplexCalculationWithNoSideEffects(i)
我与之交谈的大多数人都告诉我,基本上任何现代环境(从Windows上的Java到OSX上的Swift )都将自动处理将此任务拆分到机器上任何可并行资源之间的问题。因此,如果我碰巧有16个核心,工作将自动在他们之间进行分配。
我的问题是:( 1)这是真的吗?如果是的话,这是什么?操作系统调度程序?编译器?我不喜欢编程中的魔法,在我的理解水平上,这正是我所看到的。
哦,如果我的知识完全是治疗性的,请指出我应该从哪里开始
还有另一个标题为“函数式并行的编程语言: F# vs Haskell”的线程,其中的OP声明“函数式编程具有不可变的数据结构,并且没有任何副作用,这本质上适合于并行编程”。
Jon Harrop在他的回答中认为:“并行仅仅是关于性能的,而纯粹的性能会降低性能。因此,如果你的目标是获得良好的性能,那么纯粹的函数式编程不是一个很好的起点。”
好吧,我不打算深入探讨函数式编程是否真的提高了性能;看起来这是一个实现问题。我感兴趣的是在概念层面上:
“不可改变的数据”和“无副作用”都是容易并行化所必需的吗?它们是充分条件还是必要条件?它们是保证数据独立性或交换性所必需的吗?欢迎参考学术文献。
作为一名主要与高级编程语言打交道的软件开发人员,我不确定我可以做些什么来适当地关注即将出现的多核计算机。我写的大多是普通的、要求不高的应用程序,然而,我认为知道我是否需要改变任何编程范例甚至是语言来掌握未来是很重要的。
因此,我的问题是:
How to deal with increasing multicore presence in day-by-day hacking?
我有兴趣学习并发编程,重点是应用程序/用户级别(而不是系统编程)。我正在寻找一种现代高级编程语言,它为编写并发应用程序提供了直观的抽象。我想把重点放在提高生产力和隐藏并发编程复杂性的语言上。
为了给出一些例子,我认为用C、C++或Java编写多线程代码并不是一个好的选择,因为IMHO降低了我的工作效率,而且他们的编程模型也不直观。另一方面,提高生产力和提供更直观抽象的语言,如Python和多处理模块、Erlang、Clojure、Scala等,将是很好的选择。
根据你的经验,你会推荐什么?为什么?
编辑:谢谢大家给出有趣的答案。如果不进行实际尝试,就很难得出结论,因为有许多优秀的候选者: Er