SICP - “计算机程序的结构和解释”
相同的解释会很好
有人可以解释一下元语言抽象吗
SICP 确实让我们明白了可以将代码和数据视为同一事物的观点。
在考虑通用图灵机(UTM 的输入只是程序的表示)或冯诺依曼架构(其中单个存储结构同时保存代码和数据)时,我理解了这一点,但 SICP 使这个想法更加清晰. Scheme (Lisp) 在这里有所帮助,因为程序的语法与一般列表的语法完全相同,即 S 表达式。
一旦你有了代码和数据的“等价物”,很多事情突然变得容易了。例如,您可以编写具有不同评估方法(惰性、非确定性等)的程序。以前,我可能认为这需要对编程语言进行扩展;实际上,我可以自己将其添加到语言中,从而使核心语言最小化。再举一个例子,你可以类似地实现一个面向对象的框架;再说一次,我可能天真地认为这需要修改语言。
顺便说一句,我希望 SICP 多提到一件事:类型。在编译时进行类型检查是一件了不起的事情。面向对象编程的 SICP 实现没有这个好处。
我还没有读过那本书,我只看过视频课程,但它教会了我很多。作为一等公民的职能让我兴奋不已。执行“变量”对我来说是非常新鲜的事情。看完这些视频后,我现在看待 JavaScript 和编程的方式发生了很大变化。
哦,我想我撒了谎,真正让我震惊的是 + 是一个函数。
我认为非常酷的是延迟评估的流。我认为关于生成素数的内容非常简洁。就像一个“PEZ”分配器,可以神奇地分配序列中的下一个素数。
我认为关于 SICP 最令人惊讶的事情是看到实际上需要多少原语才能使图灵完备的语言 - 几乎任何东西都可以从几乎什么都没有构建。
由于我们正在讨论 SICP,我将在http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/上插入我的视频讲座的标准插件,这是最好的介绍您可能希望在 20 小时内获得计算机科学。
A. Rex 的回答中的“数据和代码是同一件事”的一个例子让我非常深刻。
当我在俄罗斯被教 Lisp 时,我们的老师告诉我们语言是关于列表的:car、cdr、cons。真正让我吃惊的是你根本不需要这些函数——你可以编写自己的给定闭包。所以,Lisp 毕竟不是关于列表的!这是一个很大的惊喜。
我完全不熟悉的一个概念是协程的概念,即有两个函数做互补的工作,并让程序流控制在它们之间交替。
我读SICP的时候还在上高中,主要看第一章和第二章。对当时的我来说,我喜欢你可以用代码表达所有这些数学思想,并让计算机完成大部分脏活。
当我辅导 SICP 时,我对不同的方面印象深刻。一方面,数据和代码实际上是一回事的难题,因为代码是可执行数据。关于元语言抽象的章节对许多人来说是令人难以置信的,并且有许多带回家的信息。首先是所有规则都是任意的。这让一些学生感到困扰,特别是那些本质上是物理学家的学生。我认为美不在于规则本身,而在于研究规则的后果。代码中的一行更改可能意味着词法范围和动态范围之间的差异。
今天,尽管 SICP 对许多人来说仍然很有趣且富有洞察力,但我确实知道它已经过时了。一方面,它不教授调试技能和工具(我在其中包括类型系统),这对于在当今巨大的系统中工作至关重要。
我最惊讶的是实现语言是多么容易。那个人可以将 Scheme 的解释器写在黑板上。
读了SICP的一些章节后,我感受到了不同意义上的递归
我现在在“作为常规接口的序列”一节中,并且发现作为一等公民的过程的概念非常吸引人。此外,递归的应用是我在任何语言中从未见过的。
关闭。
来自主要的命令式背景(Java、C# 等——我大约一年前才第一次阅读 SICP,现在正在重新阅读),从函数角度思考对我来说是一个很大的启示;它彻底改变了我今天对工作的看法。
我阅读了本书的大部分内容(没有练习)。我学到的是如何在特定的层次上抽象现实世界,以及如何实现一门语言。
每章都有让我惊讶的想法:
前两章向我展示了两种抽象现实世界的方法:过程抽象和数据抽象。
第 3 章介绍了现实世界中的时间。这导致了状态。我们尝试分配,这会引发问题。然后我们尝试流。
第4章是元语言抽象,换句话说,我们通过构造一个评估器来实现一种新的语言,它决定了表达式的含义。
由于第 4 章中的求值器本身就是一个 Lisp 程序,它继承了底层 Lisp 系统的控制结构。因此,在第 5 章中,我们将借助抽象模型寄存器机深入研究真实计算机的逐步操作。
谢谢。