读书笔记(III) 计算机程序的构造与解释

来源:互联网 发布:网络看电视直播 编辑:程序博客网 时间:2024/06/05 10:46

图片

 

该书在一定程度上可以理解为程序设计的方法论,不仅对过程定义和数据的组织进行抽象,而且对软件设计进行了抽象归纳。首先就让读者站在原则和程序设计的制高点上,看的都是本质的东西。
 
附记: 2011-05-18
其实这本书是在讲解一门语言,这门语言是最古老的语言之一,但又是功能最强大的一门语言。纵观软件业语言发展,结果发现现有语言都或多或少有这门古老语言的影子。我们早说过一门语言核心的东西不是语法,而是其背后的思想。语言的思想在理论计算机科学中称为:计算模型,在软件工程学中称为:编程范式,哲学层面上称为:方法论。这些编程范式是隽永的,是具有永恒的价值的,这些不能被 各种语法糖、函数库所代替的。
总结一下,SICP中涉及的编程范式几乎囊括现有的编程范式:命令式编程泛型式编程函数式编程逻辑式编程面向对象模型事件驱动模型并发模型元语言模型等等,然而SICP的价值还有待于我们的发掘。
编程,我们还有很多~~~~~ :)
 

点击进入书籍详情页

计算机程序的构造和解释(原书第2版)

作者:Harold Abelson

机械工业出版社

出版年:2004-02-01

综合评分:9.0

 

天啊! 还有比这更抽象的书吗?除了近世代数,实变和泛函,原来书可以这么抽象!

2010-11-12

 

这本书看的好纠结,完全和语法书不是一个级别的,速成简直不可能,我觉得有以下原因:

1) 书中的概念和方法描述抽象与计算机的具体应用,如果要深刻的理解这些需要非常扎实的实践和丰富的经验。

2) 对于在MIT以及Stanford中对入学者开的课程,显然不是电脑扫盲教育。受众显然是对计算机学科一腔热情的精英,并很可能他们已经在计算机学科上已经是高手级别了。

3) 设计面较广,包括程序的设计,数据的组织,甚至是编译以及计算模型等等都涉及。阅读压力很大

4) 采用LISP语言,这种前缀式表述语言首先就给读者造成压力。尽管习惯之后,表现出这种方式的优越性,但是需要一定的过程。

鉴于以上原因,我觉得对这本书的阅读体验必然是一个长久的过程,结合实践去理解抽象概念和方法背后蕴含的思想。

2010-11-13

 

这本书买来之后,真的是啃不下来。MIT那帮人真是群疯子,电脑扫盲教育都搞这么疯狂的课本,那帮人简直是群疯子。几十年的内功传给入门弟子,功没传完,人估计就残了。为了对这本书,也对这篇日志有个交代,把这些年自己的对如何像个计算机专业学生去思考问题进行归纳,将散见于各类书籍中的计算机科学思想记录在下,也是给这本书一个纪念,因为想必这本书无非想讲明这些道理吧。

贯穿计算机科学的重要思想:

(1) 计算机只能够解决离散有穷域问题,所以尝试将连续问题离散化求解

(2) 递归与栈是等价的,没有栈就实现不了递归,而递归必须利用栈结构存储信息。只是递归隐式的或显式应用栈。

(3) 循环和递归能力是等同的。事实上只要有了递归,就可以用线性递归代替循环结构。而有了循环,再利用栈结构,就可以模拟递归。

(4) 自顶向下思想和自底向上思想贯穿在计算机科学的软硬件上的方方面面,如算法设计中的递归与递推、硬件设计的分模块、软件工程组件技术。

(5) 事件驱动和时间驱动是两种基本的计算机模拟思想,应用极其广泛,例如在消息传递响应和操作系统设计,如时间分片,中断机制等。

(6)多数计算机问题都可以通过设计中间层解决。这一观点体现在软硬件设计中,如MMU、函数接口、面向对象等

(7)计算机的软硬件是等同的,软件能干的硬件就可以,硬件能做的,软件就可以模拟。

其他的通用思想:

(1) 复杂的问题可以分而治之,体现在多项算法设计思想中,如动态规划、分治法等

(2) 以空间换时间,或者以即时演算换空间,体现在预处理、利用重复子问题的动态规划、游戏动画的预渲染以及实时渲染等领域

2011-3-10

 

       基本上,上述思想就是SICP的主旨,不过在一些片段中可以窥见一些作者的深刻见地,这些见地散见于各个细节中,并且需要读者认真实践习题和代码才可以发现,今天,花了一点时间去实践,发现scheme语言果然非常的优雅,书写起来确实有一定的美感,泛递归的思想以及把过程和数据统一设计实现的思路都非常超越当时的时代,直至今日也仍然让人耳目一新。

2011-3-15

      

         最近的阅读,使我对SICP有了崭新的认识,才方知以前所谓的感想是肤浅。首先从SICP的结构上来说,《structure and interpretation of computer programs》,故名思义,这本书主要讲一个结构 和 解释 两个要义,其中一二三章主要讲解结构,即过程的组织,数据的结构,如何组织两者构建一个模拟系统。其中讲述了计算模式,计算模型以及模块化,几个程序设计的重要概念,例如线性递归与迭代,树递归;代换模型与环境模型,对象的封装问题。其中代换模型是第一章节就提出的问题,这也是函数式程序设计的主要思想,通过一种模式的匹配完成程序的设计,其可以理解成一种代数(用符号与值产生一种对应关系)的思想,他更抽象,但是设计优雅。另外,在第三章,当我们的程序引入了时间这个概念了,我们的程序似乎没有了以往的那种纯粹感,代之的是不断变化的环境(context),我们的符号和值不再是一成不变的对应关系。本质上来说,我们的程序不再是context-free的了,我们称这种计算模型为 环境模型,程序的运行结果依赖于上下文环境。如何展现这种环境和其所带有的约束呢?直接的办法就是引入局部变量,引入变量使程序拥有了模拟变化的能力(其实时间就是变化的一种方式),但是也带来了繁琐的设计细节,例如冲突和操作先后序以及模块化的困难;

         于是,为了维持函数式设计的纯粹和优雅,我们引入了 流 的概念。流其实是一种与将对象分离研究的不同的方法论。书中举了几个很经典的例子,如任意精度的pi值。本质上,流技术是基于 延迟求值 技术完成的,通俗来说,我们并不需要算出pi的很精确地值放在数据库中供检索(这样显然不够灵活),而是我们让 用户给一个精度,我们根据这个精度即可算出满足这个精度的数字给用户。事实上也是一种需求驱动(事件驱动)方案。

         流技术给了我们一种崭新的世界观。就我个人来说,环境模型 与 流技术 是两种世界观,这种对立与 数学中的黎曼积分与勒贝格积分,算法分析中的传统方法和平摊分析,物理学中的粒子学说和波动学说(事实上,SICP的作者也点到了,但是这显然不是SICP的主题,就没有细说)是有异曲同工之妙的。在SICP中,举了一个形象的例子说明,相同的过程产生不同结果:随机数的产生。因为事实上,尽管计算机产生了统计上很合理的随机数,但是事实上,每一步仍然是确定的,只不过作为输入(随机种子)作为局部变量作为对象的一部分因封装而隐藏起来了。在SICP看来,尽管一个函数产生的结果依赖于时间(环境),但是从全局上看,这个函数根本没有发生变化,所谓变化中不变就是这个道理。在随机数角度来看,尽管我们的随机数不断的随环境变化,但是本源:统计属性,概率密度函数等等没变。这也就是为什么勒贝格积分在概率论研究中这么重要的原因了。也许,我们可以说勒贝格积分更加的雅致,黎曼积分总是要很多的繁琐处理,但是就像 代换模型 和 环境模型 一样,我们都不可单一的使用它们。勒贝格积分适合理论的研究,黎曼积分则适合工程应用。反观函数式程序设计(lisp,haskell等)和命令式程序设计(C,C++等大多数商业语言)也是相似的境遇吧。

       现在,我们反观以前对 计算机世界的重要思想(七个广泛思想)的总结。尽管有点形而上,但是我们会发现:类似的,在SICP中处处渗透着作者对学科的洞察力和远见卓识,并期望一个入门者应当深刻体会这些观点,方可以在不仅理论研究以及工程项目开发上游刃有余。

       

         另则,继续上面关于书结构的话题。SICP的后两章:4.元语言 5.寄存器模型,主要讲述 语言的解释 和 执行的。这两章节还正在阅读中,还需要一定实践支持。暂且不讨论。

                 2011-3-20

刚刚粗略看完第三章,第四章简单的翻了一番,简单的说,第四章作者要叫我们去编一个解释器,用LISP编一个解释自己(自己的语言子集)的解释器,看上去似乎很疯狂,但是确实在很多的平台上应用很多,比如脚本语言中神奇的eval函数,可以在运行的过程中对程序进行动态的定制和更改,另外matlab就是用自己的语言解释自己,其中做了一些处理和优化,在进行解释的(典型的元语言模型)。看着一部分,需要一些功夫,因为后两章讲述的东西显然和前三章不同。

2011-3-20: 21:25

程序去生成程序是一个奇妙的想法,然而却在我们的实践中十分的常见,例如编译器的预处理器(其在编译期对程序进行改动)、编译器的编译器Lex和Yacc、宏(可以在编译期,也可以在运行期实现。)等等。最神奇的就是脚本语言提供的eval() 函数了。我第一次见到eval这种神奇的用法,是在阅读mathboy(蔡同学)的matlab源码时看到的。简单的说,他将要执行的程序做成一个文本,然后再执行这个文本中的命令。通过这种处理我们可以做出一些匪夷所思的功能出来,例如动态的命名变量名等,但最重要的是可以动态的创建想要的程序和函数。当然C和C++这种静态命令式语言也可以通过函数指针表实现,但是由于C和C++语言给我的固有隐性,我总是以为一旦程序写就,则不可以进行变动。可想而知,eval函数给我的震撼,也让我一直不思其解,为什么要用这样的技巧呢?其实脚本语言的一大功能就是对程序进行定制,如此处理则更方便了。与预处理器、模板不同的是其可以在程序的运行期对程序进行定制。

2011-5-27

       

0 0
原创粉丝点击