易燃物汇聚 YouTube 有声书与书评
计算机程序的构造和解释(JavaScript版) 封面

计算机程序的构造和解释(JavaScript版)

[美]哈罗德·阿贝尔森 [美]杰拉尔德·杰伊·萨斯曼 [德]马丁·亨茨 托拜厄斯·瑞格斯塔德

7428人在读
41.3万字总字数
¥51.6定价

有声书与视频解读 YouTube有声书 4 · 视频解读 28

内容简介

本书主要介绍计算的核心思想,采用的方法是为计算建立一系列概念模型。主要内容包括:构造过程抽象,构造数据抽象,模块化、对象和状态,元语言抽象,寄存器机器里的计算等。采用JavaScript作为实例分析,但并不拘泥于对语言的解释,而是通过这种语言来阐述程序设计思想。第1章介绍了计算过程以及函数在程序设计中扮演的角色。第2章在第1章的基础上提供了将数据对象组合起来形成复合数据,进而构造抽象的方法。第3章介绍了一些帮助我们模块化构造大型系统的策略。第4章通过元语言抽象探究如何在一些语言的基础上开发新语言的技术。第5章从寄存器机器的角度出发,通过设计寄存器机器,开发一些机制,实现重要的程序设计结构,同时给出一种描述寄存器机器设计的语言。本书揭示计算机程序设计思想的实质是改变了人们的思考方式:从命令式的观点去研究知识的结构。因此,本书所阐述的设计思想不仅适用于计算机程序设计,而且适用于所有工程设计。

读者书评

★★★★★

清晰地记起第一次读懂《计算机程序的构造和解释》(原书第2版,中文2004出版)的那种震撼。庆幸与它结缘的同时,我又懊悔,真正翻开第一页前,它竟被我静置在书箱十年。我本可以免除迷失十年的苦痛。就如掌握数理逻辑后的我,遗憾中学没有接触形式系统的良机。“种树的最好时机是十年前,其次是现在”,不要因为十年前的遗憾而自甘放纵,酿成新一个十年的遗憾。一小步一小步踏实的走,一页一页专注的读。渐渐地,我已经走了很远。或许我终将不过是又一个普通人,但这些宝贵的经历和体验已将今天通透的我与初日盲愚的我完全区分开来。 未读作品前,我困惑计算机行业日新月异,变化之大让人喘不过气来,舆论总是在追逐潮流,贩卖焦虑,昨天火爆全球的技术今天已是弃子,短命的新概念层出不同,编程语言和工具不是在淘汰中就是在淘汰的路上,新人一边卖力开干,一边担忧沦为旧人。“什么编程语言天下第一”这个没有意义的话题却经久不衰,它折射了我们对当下处境的焦虑,总奢想抓住一条捷径一劳永逸。越是急功近利,越是失望茫然,越是焦虑浮躁,越容易受骗。那么在千变万化眼花缭乱的表象中,有没有万变不离其宗的本质呢?本书告诉我们,计算机科学的本质是计算过程的形式化,其发展的关键是控制复杂度。千言万语无法道尽作品的优秀,无法道尽我曾经的煎熬,无法道尽我现在的明净。不如引用原书第1版配套视频(1984出版)的第一课开头(注:B站可观看),以“*****”分隔如下: ***** 计算机科学与计算机的关系不大,就如物理学不仅仅关于粒子加速器,生物学不全然是显微镜和培养皿,几何学也不是介绍如何使用测量仪器的。事实上,几何学最初之意是测量土地(从名字Geometry的词根词缀就能看出来),埃及为了计算和修理年复一年被尼罗河洪水所毁掉的牧田边界,建立了几何基础。任何一门科学起步之时,人们对它了解不深,很容易误将涉及的工具当作是它的本质。但当我们在几千年后回头重新审视这段历史,他们到底在干什么呢?实质上,他们已经开始对时间和空间进行形式化表述,并归纳出一套讨论数学真理的形式化方法,这直接导致了数学公理化,以及各种现代数学的产生,同时也指明了一种用于精确描述陈述性知识的方法。与此类似,未来的人们回过头审视我们,啊,这些20世纪的原始人不务正业地玩弄着叫计算机的小玩意呀,但他们真正在做什么呢,他们开始学习如何对计算过程进行形式化表述,即对“解决问题所形成的步骤序列”进行形式化表述。数学在形式化陈述性(命题式)知识,而计算机科学在形式化过程性(指令式)知识。比如,定义平方根sqrt(x): 1) 陈述性知识(What Is True) sqrt(x) 是这样一个数y,它的平方等于x,并且 y 大于或等于 0。 这是一个非常好的数学定义,它告诉了我们什么是x的平方根。但它没告诉我们如何去求x的平方根。 2) 与之对照,指令式知识(How To)是, sqrt(x): 1. 做一个粗糙的猜测g; 2.改进g: g = (g + x/g) / 2; 即把g更新为g和x/g两者的平均值 3.一直改进g直到它足够好; (注:此处“足够好”不够明确,需要进一步明示误差容忍度) 为了形式化地表述计算过程(procedure),我们选择编程语言Lisp。不用担心,Lisp的语法规则非常简单,几分钟就能学会。请不要感到惊讶,正如象棋的规则十分简单,几分钟后你就可以和任何人谈论规则,但这不等于你已经掌握了规则所蕴含的所有东西,五分钟无法成为大师(注:人工智能的顶尖人物Peter Norvig写过一篇文章《十年学会编程》),漫长的修炼是为了灵活运用这些规则达到目的(注:编程如写作,识字的人不等于能写出优秀作品。听一遍歌词只需3分半钟,抄写一遍不过10分钟,写出好词却需要十年的积累,厚积薄发,下笔如神)。 当然,编程并不是要告诉人们如何求平方根,如果这就是计算机科学的全部,那也没什么了不起的,既无趣也没难度。真正的问题来自于构建大规模系统,程序长度可能上千页(上千个文件),没人能将它装入脑袋。因此软件构造的真正技术难点在于控制复杂度,这就是计算机科学发展的关键,也构成了我们课程的所有余下部分… ***** 归纳两点,一个本质,一个关键: 1. 计算机科学的本质是计算过程的形式化,无关具体语言,无关物理机器。从上面的例子可以看到,即使我用中文陈述平方根的定义,也不会失去它的数学品格。即使我用中文写下平方根的求解步骤序列,也不会损坏它的算法本性。因此计算过程(算法)无关语言。然而要将计算过程形式化,又确实应当精心挑选一门语法简洁的编程语言,以免不当的语言带来不必要的额外复杂度,污染了算法的纯度。轻巧灵动的Lisp最能胜任,Python也相当优秀,而其它的过于沉重繁琐。另外,自然语言(中文,英文,法文等等)的表达能力远胜编程语言,但也因其强大丰富无所不包而容易产生歧义,编程语言可理解为自然语言的简化版,同理一阶谓词逻辑也是自然语言的精简版,数学书写系统又何尝不是呢。使用轻巧灵动的语言,编程犹如创作,无需强记语法和花哨招式,笔随心动,直指人心;使用轻巧灵动的语言,编程犹如数学解谜,一笔一纸足以推理演绎,将有限的符号排列组合成序列,组词成句,组句成段,谓之证明。计算过程的语形是符号演算,计算过程的语义是解决问题所形成的步骤序列(第1步,第2步,第3步,…)。 注:Javascript出身草率,诞生于互联网兴起的九十年代。最初它只是一门玩具语言,用于编写嵌套在网页里的几段小脚本,给单调的网页提供花花绿绿的动态特效,谈不上什么程序设计和规模控制,也完全不讲究性能。当年为了沾边火爆的Java,取了Javascript这名字,其实它俩一点关系都没有。Javascript的作者一周就完成了语言的原型。它借鉴了多种语言的特性,C语言的外表,裹着Lisp的核心。随着互联网的蓬勃发展,"网页"(Web pages)这个落后的概念被“网络程序”(Web apps)新概念取代,体验极差的单薄静态页面轮换,被丰富的程序互动所取代(一次加载,永无刷新)。从重度的页面设计(html,asp,jsp)转向大规模的程序设计(javascript,node.js),Javascript被委以重任,脱胎换骨,它的工业化标准程度不亚于Java。丰富的开发工具,超高的语言灵活度,使它成为一颗耀眼的明星。若从此更名Ecmascript,就不必活在Java的阴影下。Javascript本来就有一颗Lisp的心,越往后越趋向于Lisp。本书的序言也论述了,选用Javascript无损原书的原义。 2. 计算机科学的发展关键是控制复杂度。以上平方根的算法只有3条语句,倘若10条语句亦能轻松理解。然而上百条语句,甚至上百万条语句堆积在一起呢,非凡人能掌控。控制复杂度就成了构建大规模系统的关键。控制复杂度的核心是抽象,这就是本书各章的主题,过程抽象,数据抽象,模块化(面向对象),元语言抽象和机器抽象(寄存器机器模型,CPU和内存的运作模型)。 与其说它在教如何编程,不如说它在教如何抽象思维。计算机,数学,物理,逻辑,哲学,语言学,人工智能,不经意地在本书穿插交汇融合。以它为交点,我延伸至物理,数学,逻辑学,语言学,人工智能,哲学,又回到计算机科学。它们都统一在符号系统之下,一切都是符号演算。我对数学分析(微积分),线性代数,概率论,数理逻辑,逻辑哲学论,实体论,认识论,句法结构,文学理论和人工智能有了更深刻的理解。我不禁好奇,语言何以能言说世界,即语言何以能为世界建模?建模的确切含义是什么?由于模型不是事物本身,那么模型在何种意义上称为事物的模型呢?符号世界与现实世界是如何对应起来呢?后来我才领悟并爱上维特根斯坦在《逻辑哲学论》开篇的第二句话,“世界是事实的总和,不是事物的总和”。事物在语言里对应为词,事实对应为句子,在此不展开论述。在学习数理逻辑(一阶谓词逻辑)后,我明白,符号系统(形式系统)刻画现实世界的逻辑结构。形式语句的可证性与现实命题的真假对应起来,语句与事实对应起来了。人工智能是且只能是符号演算的机器吗?GEB真是一本奇书,哦,跑题了。 至今我仍时而随手翻阅《计算机程序的构造和解释》(网上也有MIT免费提供的英文版原著,在线阅读和PDF两种方式),并每隔一段时间完整重读一遍,每一次都有新的领悟。破损褶皱的书页上,是密密麻麻的彩线与注解。它的破旧,兑换成了我的新知。原书第2版会绝版吗?我是否该再买一本,伴我余生。我的墓志铭上刻着Lambda表达式,或许再来一句“世界是事实的总和,而非事物的总和” (The world is the totality of facts, not of things)。

★★★★★

SICP原版是用scheme语言描述的,这一版使用的JS。两个版本内容上没有很大差别(相比于所谓的python版的SICP来说)而JavaScript本身也参考了Scheme设计的,所以在语言的表达能力上也没有很大差距。甚至,因为JS比Scheme更普及,语法上更让人熟悉,这比原版上更容易让人阅读下去。SICP这本书本身的内容就更不需要质疑了

★★★★★

我十年前读过原版书,这个版本其实翻译的还可以,只不过很多没有必要翻译的并且还在随书代码中用到的专业词汇最好用原文呈现。仅仅在定义的时候提一下中文意思就可以了。对于这本书本身,我觉得是计算机科学入门最好的教程了。这本书并没有过多纠结计算机硬件或者软件的具体实现方法而是在一个很合理的抽象层讲明白了计算机科学中一些抽象问题的解决方法。

★★★★★

第一遍看的不太懂,结合Deepseek,草率的认为是教我们如何应对复杂性的系统性描述与说明,包括当现有语言不足以处理我们所面对的复杂性时,如何构造自己的解释器,这种复杂性包括空间上的复杂性和时间上的复杂性,具体有待于再一次阅读和发掘其中的宝藏。

★★★★★

看过 scheme 版本的 JS 还是 scheme 的徒子徒孙。 虽然但是,大厂用力推广的是不一样。 不过隔壁 scheme 的一个实现,Chez scheme 也不赖啊。 笑死。

★★★★★

js版本 是新加坡国立出的一个版本,配合他们给的playground来做一个太空游戏。挺好玩的。 如果不想学lisp,我更推荐伯克利的 cs 61A 是基于python的SCIP 资源更加丰富。

★★★☆☆

书是很好的书,然而译者水平极差,导致没能传达作者原本的意思。想要读这本书的读者,慎重考虑。依我之见,译者实在是误人子弟。

★☆☆☆☆

翻译狗屎一般,我可以负责任的说——但凡有点英文基础——英文版比这个中文版好读多了。评价只针对译本,原作堪称经典。

★★★★★

哈哈哈,正在想要不要学一点JS,如果只是普通的教程我就不看了。这个视角非常好!从高级语言看底层architecture,这比纯学一门语言,有用的多! ……暂时不看

★☆☆☆☆

JavaScript版就没意思了

书籍信息

作者[美]哈罗德·阿贝尔森 [美]杰拉尔德·杰伊·萨斯曼 [德]马丁·亨茨 托拜厄斯·瑞格斯塔德
出版社机械工业出版社
出版时间2024-01-26
ISBN9787111734635
分类计算机-编程设计
格式EPUB
完结状态连载中
章节数45