Essential SICP Primer

综述

本书以Lisp语言本身为例,完整而辨证的讲述了“计算机程序”的各种形而上形而下的问题:

  • 程序语言本身的要素(原语、组合手段、抽象手段)

  • 程序的计算模型(代换模型、环境模型,迭代、递归)

  • 程序的世界观(对象式、函数式)

  • 程序如何繁殖进化(元语言抽象)

  • 程序如何执行(编译、解释)

同时阐述了程序设计中常用的几大关键技术:

  • 寄存器与堆栈的使用(目前多数计算机的基本抽象)

  • 数据导向与通用型计算(涉及高阶过程,数据与过程的统一)

  • 并发程序设计(模型与时序的冲突)

  • 历史记忆法(即缓存)

  • 应用序与正则序,及背后的惰性求值/延时求值方法论

  • 迭代与尾递归的转换

后两种看似只是一种优化技术,实际上不止如此,它们牵扯到程序的合法性,运行结果的可预期性

还有几种特殊的程序设计技术:

  • 模拟时间分叉的非确定性计算

  • 模拟逻辑推理的逻辑程序设计

  • 模拟数学公式的约束系统设计

一、语言要素

每一种强有力的语言都提供了三种机制:

  • 基本表达形式,用于表示语言所关心的最简单的个体

  • 组合的方法,通过它们可以从较简单的东西出发构造出复合的元素

  • 抽象的方法,通过它们可以为复合对象命名,并将它们当作单元去操作

二、数据与过程的统一

第一级元素的特权:

  • 可以用变量命名

  • 可以提供给过程作为参数

  • 可以由过程作为结果返回

  • 可以包含在数据结构中

Lisp给了“过程”完全的第一级状态,而一般而言,我们可以将数据定义为:

  • 一组适当的构造函数(必选)和选择函数(必选)及改变函数(可选)

  • 为使这些函数成为一套合法表示,它们就必须满足的一组特定条件

这样,数据与过程在Lisp中就完全统一了

三、并发、时间与通信

并发的基本现象是共享状态在不同进程间的同步,或迫使进程间通信所产生的事件按照某种特定的顺序进行;从本质上看,在并发控制中,任何时间概念都必然与通信有内在的联系;有意思的是,时间与通信之间的这种联系也出现在相对论里,在那里的光速(可能用于同步事件的最快信号)是与时间和空间有关的基本常量;在处理时间和状态时,我们在计算模型领域所遭遇的复杂性,事实上可能就是物理世界中最基本的复杂性的一种反映

四、对象模型与函数式模型

从一个复杂过程中的一部分的观点出发,其它的部分看起来正在随时间变化,它们有着隐蔽的随时间变化的局部状态;如果我们希望去写程序,在计算机里用某种结构去模拟现实世界中的这类自然分解,那么就会做出一些不是函数式的对象--它们必须随着时间不断变化;我们用局部状态变量去模拟状态,用对这些变量的赋值模拟状态的变化;在这样做的时候,就是在用计算执行中的时间去模拟我们所在的世界里的时间,也就是把“对象”弄进了计算机

用对象来做模拟是威力强大的,也很直观,这一情况的主要根源,就在于它非常符合我们对自己身处其中并与之交流的世界的看法;然而,正如我们已经反复看到的这种模型也产生了对于事件的顺序的依赖,以及同步多个进程的棘手问题;避免这些问题的可能性推动着“函数式程序设计语言”的开发,这类语言里根本不提供赋值或者变动对象,在这样的语言里,所有过程实现的都是它们参数上的定义良好的数学函数,其行为不会变化;物理世界中也有这样的例子,当我们观察一个正在移动的粒子时,我们说该粒子的位置(状态)正在变化,然而,从粒子的世界线的观点看,这里根本就不涉及任何变化

然而,如果我们贴近观察,就会看到与时间有关的问题也潜入了函数式模型中,原因在于函数式模型与时间无关的特性是将提供时态、时序的责任推给用户方实现的,当用户方无法提供时态时,又要重新引入函数式风格致力消除的同一个问题

我们可以将这一世界模拟为一集相互分离的,受时间约束的,有局部状态的,相互交流的对象,或者也可以将世界看作一个大函数,是单一的,无时间的,无状态的统一体;对象模型对世界的近似在于将其分割为独立的片断,函数式模型则不是沿着对象间的边界去做模块化。当对象间不共享的状态远远大于它所共享的状态时,对象模型就特别好用。这种对象观点失效的一个地方是量子力学,在那里将物体看作独立的粒子就会导致悖论和混乱。将对象观点和函数观点统一起来可能与程序设计关系不大,而是与基本认识论有关。每种观点都有其强有力的优势,但就其自身而言,又没有一种方式能够完全令人满意,我们还在期待着一个大统一的出现

五、元语言抽象与通用机器

这里的深刻思想是,任一求值器都能模拟其它的求值器;这样,有关“原则上说什么可以计算”的概念(忽略掉所有有关时间和空间的实践性问题)就是与语言或计算机无关的了;它反映的是一个有关“可计算性”的基本概念;这一思想第一次是由图灵阐述的;图灵给出了一种简单的计算模型--现在被称为图灵机--并声称,任何“有效过程”都可以描述为这种机器的一个程序;图灵而后实现了一台通用机器,即一台图灵机,其行为就像是所有图灵机程序的求值器

六、编译与解释

编译可以大大提高程序执行的效率,解释则为程序开发和排除错误提供了一个更强大的环境,因为被执行的源代码在运行期间都是可用的,可用去检查和修改,此外,由于整个基本操作的库都在那里,我们可以在排除错误的过程中构造新程序,随时把它们加入系统中;

由于看到了编译和解释的互补优势,现代程序开发环境很推崇一种混合的策略,使得解释性程序和编译性程序可以互相调用;这就使程序员可以编译那些自己认为已经排除了错误的部分,从而取得编译方式的效率优势,而让那些正在进行交互式开发和排错的,还在不断变化的程序部分的执行仍然维持在解释模式中;还可以使程序员根据实际问题选择最合适的语言

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值