von-Neumann机器和Lambdas

时间:2009-04-18 22:57:18

标签: lambda von-neumann

布莱恩在他对问题"Are side effects a good thing?"的论证中的前提很有意思:

  

计算机是von-Neumann机器,旨在很好地处理效果(而不是设计为与lambda一起使用)

我对这些方法的并置感到困惑。我看不出它们是黑白的。什么是证据价值:

  

计算机是von-Neumann机器,设计用于效果良好[1]

最后一部分让我困惑:

  

而不是设计为与lambdas一起使用[2]

Lambdas是否用作功能编程的符号?或者它们是功能性编程的表现吗?什么是真实的信息?

在什么意义上,前提[1]和[2]的部分是对的?回复中隐藏的前提是什么?有人可以证明原始前提吗? von-Neumann机器和Lambdas如何真正起作用?

2 个答案:

答案 0 :(得分:6)

以下是 I 意味着更深入的内容,但看看其他人是否同意或者他们有什么要说的话会很有趣。

考虑一下计算机今天如何运作。你有硬件有整数和浮点寄存器,以及大量的随机存取存储器,以及大多数形式'基于读取该寄存器/存储单元的值的指令,将这个新值戳到这个寄存器中/细胞'。 (更新存储器单元在缓存行和一致性以及内存模型等方面具有各种性能影响。)整数为32或64位,几乎所有编程语言都表现出与硬件完全匹配的这些数据类型。几乎每个运行时都使用一个小的调用堆栈,其中堆栈分配的对象很便宜,而且一个更昂贵的“堆”可以在需要非堆栈生命周期时创建和销毁其他对象。

现在考虑大多数现代函数式编程语言。不变性是常态;你很少会用新的价值“捅”记忆。 (这意味着您创建了更多 new 对象,这意味着您可以分配更多。)Lambda和continuation是常态;你很少有对应生命周期对应的堆栈。 (实际上,一些FP运行时不使用堆栈;在CPS实现中,堆栈和程序计数器的概念是不合适的。)递归是一个循环结构,所以你至少需要'尾'调用才能消耗无论如何,堆栈。实际上一切都需要“堆”分配,当然你需要一个垃圾收集器。代数数据类型提供标记数据;从理论上讲,这些标签只需要额外的2或3位数据,但为了匹配运行时间,它们通常需要额外的内存字或更多内存。 ...我有点蜿蜒,但你在FP语言中最经常的事情往往与规模最差的事物完全对应在典型的计算机硬件架构和基本语言运行时上最昂贵的

不一定是这样。可以想象一个运行时避开堆栈的世界,并使堆/分配快速(而不是多线程应用程序的瓶颈)。可以想象这样一个世界,其中可互操作的整数类型具有29或60位,并且运行时/硬件使用该单词的额外剩余位用于例如GC,或代数类型标签,或诸如此类的东西。 (我认为一些FP实现/运行时会做一些这些技巧。)等等......重点是,如果你把现代函数语言作为给定的,然后围绕它设计运行时/硬件,它会看起来非常不同来自今天的典型硬件/运行时间。

(我认为我没有那么严肃地传达这一点,而且我对于我不确切知道的许多细节都不精确,但希望你能在这里找到我的论点的主旨。)

答案 1 :(得分:3)

我不完全确定你在问什么,但是当我读到它时,你问的是lambdas的含义是什么?

他指的是lambda calculus,它构成了函数式编程的大部分理论基础。它是(以及其他内容)描述和推理高阶函数的抽象符号。

冯·诺依曼机器基本上就是我们拥有的。程序由操作和访问商店(我们的RAM)的指令执行。也就是说,一切都是通过副作用隐式完成的。数据从RAM中的某个区域读取,稍后处理,然后写回RAM中的某些(可能是其他)区域。 如果没有副作用,CPU将仅限于操作打开电源时寄存器中发生的任何垃圾数据。

LAMBDA演算有没有副作用的观念,因此基于解决此原则一台机器不会有间“什么CPU可以访问”的区别(我们的寄存器,基本)和“有什么可以间接访问”(我们的RAM )。这种机器中的所有东西都将基于功能原理,带有一个或多个参数的函数,以及返回新值,从不修改现有值。 (不,我不确定这在硬件中会起作用......:))

这会回答你的问题吗?

相关问题