【问题标题】:von-Neumann machines and Lambdas冯诺依曼机器和 Lambdas
【发布时间】:2010-10-20 08:21:59
【问题描述】:

Brian 在他对问题 "Are side effects a good thing?" 的论证中的前提很有趣:

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

我对这些方法的并列感到困惑。我不能把它们看成黑白的。什么是证明价值:

计算机是 von-Neumann 机器,旨在与效果很好地配合使用 [1]

最后一部分让我很困惑:

而不是被设计为与 lambdas [2] 配合使用

Lambda 是否用作函数式编程的符号?还是它们是函数式编程的委婉语?真正的信息是什么?

在什么意义上,前提[1]和[2]的部分是对的?回复中隐藏的前提是什么?有人可以证明最初的前提吗?冯诺依曼机器和 Lambda 究竟是如何工作的?

【问题讨论】:

    标签: lambda von-neumann


    【解决方案1】:

    我不完全确定你在问什么,但当我读到它时,你在问他所说的 lambdas 是什么意思?

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

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

    Lambda 演算没有副作用的概念,因此基于此原理的机器不会区分“CPU 可以访问的内容”(本质上是我们的寄存器)和“可以间接访问的内容”(我们的 RAM )。这样一台机器中的一切都将基于函数原理,即函数接受一个或多个参数,并返回一个新值,从不修改现有值。 (不,我不确定这在硬件中是如何工作的...... :))

    这是否回答了您的问题?

    【讨论】:

    • 你为什么使用“有限”这个词?你是指生产力这个词吗?我知道用函数式语言做大多数事情是非常困难的,因此效率较低。但是,我认为最大的问题是对它们进行创新的难度。你不能采取自然的试错法。最好用其他语言测试,然后逐步用函数式语言实现。 “功能性”硬件是个有趣的想法。
    • 我的意思是最纯粹意义上的“有限”。我们的计算机依赖于副作用。副作用是让您的 CPU 将有意义的数据读入它能够操作的寄存器中的原因。副作用是如何将此数据存储为应用程序状态的一部分。我不是在谈论语言,而是在谈论我们的硬件是如何工作的。
    • 显然,我不知道我们的计算机是如何工作的。不得不看一些读物。感谢您的回复!
    【解决方案2】:

    这里更深入地了解的意思,不过看看其他人是否同意或他们要说什么会很有趣。

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

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

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

    (我认为我的沟通不够好,而且我对许多我不确切知道的细节也不太准确,但希望你能在这里理解我论文的要点。)

    【讨论】:

    • 你是对的,有些语言确实为原始类型标签(基本上是指针/非指针)保留了一点,但我不确定这一切与你原来的问题有什么关系。你是对的,一个围绕不变性和其他 FP 属性设计的机器,它看起来与我们的冯诺依曼机器非常不同。这正是您询问的另一个线程的答案的重点。所以我不确定你在问什么。 :)
    • @Brian:别担心走弯路,我觉得如果我们要做一个功能性硬件,我们会遇到更大的问题。不知何故,我觉得这些问题是数学问题。当我向我的讲师询问函数式编程的现状时,他提到了一些数学问题。该问题的目的是进行公开讨论。我在你的写作中也想过同样的事情,很明显,我不是唯一一个在想它们的人:)
    猜你喜欢
    • 2011-02-16
    • 2015-04-03
    • 2015-01-05
    • 2020-08-03
    • 2023-03-02
    • 2010-12-20
    • 2014-08-02
    • 1970-01-01
    • 2020-02-07
    相关资源
    最近更新 更多