【问题标题】:Concepts that surprised you when you read SICP?当您阅读 SICP 时让您感到惊讶的概念?
【发布时间】:2010-09-26 04:56:18
【问题描述】:

SICP - “计算机程序的结构和解释”

解释一下就好了

谁能解释一下元语言抽象

【问题讨论】:

  • stackoverflow.com/questions/1711/… 我说的这本书排在第三位
  • 你到底是如何在一个主观问题上悬赏的?尤其是与个人经历密切相关的?
  • 我也在想同样的事情?
  • 没有赏金就没有这个问题的答案
  • 那么换个问题吧。这就像将金牌授予具有最佳个人训练故事的游泳运动员 - 读起来很好,但不值得获得奖牌。

标签: sicp


【解决方案1】:

SICP 确实让我们明白了可以将代码和数据视为同一事物的观点。

我之前在考虑通用图灵机(UTM 的输入只是程序的表示)或冯诺依曼架构(其中一个存储结构同时保存代码和数据)时理解这一点,但 SICP 提出了这个想法清楚得多。 Scheme (Lisp) 在这里有所帮助,因为程序的语法与一般列表的语法完全相同,即 S 表达式。

一旦你拥有了代码和数据的“等价物”,很多事情突然变得容易了。例如,您可以编写具有不同评估方法(惰性、非确定性、)的程序。以前,我可能认为这需要对编程语言进行扩展;实际上,我可以自己将其添加到语言中,从而使核心语言最小化。再举一个例子,你可以类似地实现一个面向对象的框架;再说一次,我可能天真地认为这需要修改语言。

顺便说一句,我希望 SICP 多提到一件事:类型。在编译时进行类型检查是一件了不起的事情。面向对象编程的 SICP 实现没有这个好处。

【讨论】:

  • 嘿……用汇编语言编写让我将代码和数据视为同一事物。有时我仍然怀念它——重写跳转可能不是存储和处理程序状态最清晰的方法,但它确实简洁。 :-)
【解决方案2】:

我还没有读过那本书,我只看过视频课程,但它教会了我很多。作为一等公民的职能让我大吃一惊。执行“变量”对我来说是非常新鲜的事情。观看这些视频后,我现在看待 JavaScript 和编程的方式发生了很大变化。

哦,我想我撒了谎,真正让我印象深刻的是 + 是一个函数。

【解决方案3】:

我认为 SICP 最令人惊讶的事情是看到实际上需要多少原语才能使图灵完备的语言 - 几乎任何东西都可以从几乎没有构建。

由于我们正在讨论 SICP,我将在 http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/ 插入我的视频讲座的标准插件,这是您希望在 20 小时内获得的最好的计算机科学导论。

【讨论】:

    【解决方案4】:

    我认为真的很酷的是streams 延迟评估。我认为关于生成素数的内容非常简洁。就像一个“PEZ”分配器,可以神奇地分配序列中的下一个素数。

    【讨论】:

      【解决方案5】:

      A. Rex 的回答中的“数据和代码是同一件事”的一个例子让我深有体会。

      当我在俄罗斯学习 Lisp 时,我们的老师告诉我们语言是关于列表的:car、cdr、cons。真正让我吃惊的是你根本不需要这些函数——你可以编写自己的给定闭包。所以,Lisp 毕竟不是关于列表的!这是一个很大的惊喜。

      【讨论】:

      • 我也喜欢这种认识。
      【解决方案6】:

      我完全不熟悉的一个概念是 coroutines 的想法,即让两个函数做互补的工作并让程序流控制在它们之间交替。

      【讨论】:

        【解决方案7】:

        我读SICP的时候还在上高中,主要看第一章和第二章。对当时的我来说,我喜欢你可以用代码表达所有这些数学思想,并让计算机完成大部分脏活。

        当我辅导 SICP 时,我对不同的方面印象深刻。一方面,数据和代码实际上是一回事的难题,因为代码是可执行数据。关于元语言抽象的章节对许多人来说是令人难以置信的,并且有许多带回家的信息。首先是所有规则都是任意的。这让一些学生感到困扰,特别是那些本质上是物理学家的学生。我认为美不在于规则本身,而在于研究规则的后果。代码中的一行更改可能意味着词法作用域和动态作用域之间的区别。

        今天,尽管 SICP 对许多人来说仍然很有趣且富有洞察力,但我知道它已经过时了。一方面,它不教授调试技能和工具(我在其中包括类型系统),这对于在当今庞大的系统中工作至关重要。

        【讨论】:

          【解决方案8】:

          最让我惊讶的是,实现语言是多么容易。那个人可以将 Scheme 的解释器写在黑板上。

          【讨论】:

            【解决方案9】:

            看了SICP的一些章节后,我感受到了不同意义上的递归

            【讨论】:

              【解决方案10】:

              我现在在“作为常规接口的序列”一节中,并且发现作为一等公民的过程的概念非常有趣。此外,递归的应用是我在任何语言中从未见过的。

              【讨论】:

                【解决方案11】:

                关闭。

                来自主要的命令式背景(Java、C# 等——我大约一年前才第一次阅读 SICP,现在正在重新阅读),从函数式角度思考对我;它彻底改变了我对今天工作的看法。

                【讨论】:

                  【解决方案12】:

                  我阅读了本书的大部分内容(没有练习)。我学到的是如何在特定层次抽象现实世界,以及如何实现一门语言。

                  每一章都有让我惊讶的想法:

                  前两章向我展示了两种抽象现实世界的方法:过程抽象和数据抽象。

                  第 3 章介绍了现实世界中的时间。这导致了状态。我们尝试分配,这会引发问题。然后我们尝试流。

                  第 4 章是关于元语言抽象的,换句话说,我们通过构造一个评估器来实现一种新的语言,它决定了表达式的含义。

                  由于第 4 章中的求值器本身就是一个 Lisp 程序,它继承了底层 Lisp 系统的控制结构。因此,在第 5 章中,我们将借助抽象模型寄存器机深入研究真实计算机的逐步操作。

                  谢谢。

                  【讨论】:

                    猜你喜欢
                    • 2014-05-09
                    • 2016-12-11
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-10-30
                    • 2021-08-28
                    • 2014-06-28
                    相关资源
                    最近更新 更多