计算机程序的构造和解释(原书第2版)
最新书摘:
-
非常不勇敢2020-01-14将数值作为“简单数据”看待实际上完全是一种虚张声势。事实上,对于数值的处理是任何程序设计语言里最错综复杂而且也最迷惑人的事项之一,其中涉及的典型问题包括:某些计算机系统区分了整数(例如2)和实数(例如2.71)。那么实数2.00和整数2不同吗?用于整数的算术运算是否与用于实数的运算相同呢?用6除以2的结果是3还是3.0?我们可以表示的最大的数是多少?最多能表示的精度包含了多少个十进制位?整数的表示范围与实数一样吗?显然,上述这些问题以及许多其他问题,都会带来有关舍入和截断误差的一系列问题一一这就是数值分析的整个科学领域。因为我们在本书中主要关心的是大规模程序的设计,而不是数值技术因此将忽略对这些问题的讨论。本章中有关数值的实例将没有常规的舍入动作,而如果对非整数使用具有有限的十进制位数精度的算术运算,就会看到这方面的情况。
-
大句哥哥2015-05-05当然, 我们能够将大量复杂事物隐藏起来, 这并不意味着该机器的设计是不实际的, 因为我们总能用一些更简单的基本操作来取代这些复杂的基本操作
-
Shiva2012-05-11习题1.6(define (new-if predicate then-clause else-clause)(cond (predicate then-clause) (else else-clause)))(define (sqrt-iter guess x)(new-if (good-enough? guess x)guess(sqrt-iter (improve guess x) x)))
-
[已注销]2012-04-08并发的基本现象是共享状态在不同进程间的同步,或迫使进程间通信所产生的事件按照某种特定的顺序进行;从本质上看,在并发控制中,任何时间概念都必然与通信有内在的联系;有意思的是,时间与通信之间的这种联系也出现在相对论里,在那里的光速(可能用于同步事件的最快信号)是与时间和空间有关的基本常量;在处理时间和状态时,我们在计算模型领域所遭遇的复杂性,事实上可能就是物理世界中最基本的复杂性的一种反映。
-
xiaoliable2019-12-13In this book the use of ``program' is focused on the creation, execution, and study of programs written in a dialect of Lisp for execution on a digital computer. Using Lisp we restrict or limit not what we may program, but only the notation for our program descriptions.
-
王靖2014-04-101.3 用高阶函数做抽象
-
王靖2014-04-101.2 过程与它们所产生的计算
-
王靖2014-04-101.1 程序设计的基本元素
-
ziyoudefeng2013-01-17对于迭代过程,一般来说,迭代计算过程就是那种其状态可以用固定数目的状态变量描述的计算过程;而与此同时,又存在着一套固定的规则,描述了计算过程在从一个状态到下一状态转换时,这些变量的更新方式;还有一个结束检测,它描述这一计算过程应该终止的条件。
-
[已软注销]2012-09-20In section 5.5 we will study a simple compiler that translates Scheme programs into sequences of instructions that can be executed directly with the registers and operations of the evaluator register machine.
-
tertio2012-11-22一般而言,匹配是一种代价高昂的工作,因为我们希望避免将完整的匹配应用于数据库里的每一个元素,通常可以通过将这个过程分解为快速的粗略匹配和最终匹配而达到加速的目的.其中的粗略匹配过滤数据库,为最终匹配产生出很小的一组候选.我们也可以仔细安排这个数据库,使得粗略匹配的工作在数据库的构造过程中完成,而不是等着需要找出候选的时候再做.这称为数据库的索引....
-
tertio2012-11-22本章开始时提出了一个目标,那就是构造出一些计算模型,使其结构能够符合我们对于试图去模拟的真实世界的看法。我们可以将这一世界模拟为一集相互分离的、受时间约束的、具有状态的相互交流的对象。或者可以将它模拟为单一的、无时间也无状态的统一体。每种观点都有其强有力的优势,但就其自身而言,又没有一种方式能够完全令人满意。我们还在等待一个大统一的出现。
-
tertio2012-11-22对象模型对世界的近似在于将其分割为独立的片段,函数式模型则不是沿着对象的边界去做模块化。当“对象”之间不共享的状态远远大于它们所共享的状态时,对象模型就特别好用。这种对象观点失效的一个地方就是量子力学,在那里,将物体看做独立粒子就会导致悖论和混乱。将对象观点和函数式观点合并可能与程序设计的关系不大,而是与基本认识论有关的论题。
-
tertio2012-11-22物理中也类似,当我们观察一个正在移动的粒子时,我们说该粒子的位置(状态)正在变化,然而,从粒子的世界线的观点看,这里根本就不涉及任何变化
-
tertio2012-11-22在处理变动数据对象的共享问题时,最微妙的地方正好就反应了3.1.3节里提出的有关"同一"和"变化"的基本问题.我们在那里说过,如果希望这个语言里容许做修改,那么每个复合对象就必须有一个"标识",这应该是某种不同于构造起它的那些片段的东西.在lisp里,我们所认为的"同一"也就是检查课题之间的eq?,采用指针相等表示.这是因为在大部分lisp实现里,一个指针本质就是一个存储地址,在这里"解决"对象标识的方式,是假设数据对象"本身"也是一些信息,存储在计算机中某一些特定的存储位置,对于简单的lisp程序而言,这也就足够了.但是这并不是解决计算模型中"同一"问题的一般性方法.
-
tertio2012-11-22...开发出一种有用的,具有一般意义的框架,以描述不同类型的对象之间的关系(这在哲学中称为"本体论").看来是一件极其困难的工作.在10年前存在的混乱和今天存在的混乱之间的主要差异在于,今天已经有了一批各式各样的并不合适的本体理论,它们已经被嵌入到数量过多而又先天不足的各种程序设计语言里.举例来说,面向对象语言的大部分复杂性---以及当前各种面向对象语言之间细微的而且使人迷惑的差异的核心,就是对类型之间通用型操作的处理....事实上,我们的猜想是,如果没有知识表示和自动推理工作的帮助,这些问题是无法仅仅通过计算机语言设计的方式合理处理的.
-
tertio2012-11-22术语"闭包"来自于抽象代数,在抽象代数里,一集元素称为在某个运算(操作)之下封闭,如果将该运算作用于这一集合的元素,产生出的仍然是该集合里的元素.然而lisp社团(很不幸)还用术语"闭包"描述另一个与此毫不相干的概念.闭包也是一种为带有自由变量的过程而用的实现技术.本书没有采用闭包这一术语的第二种意义.
-
tertio2012-11-22说明性描述和行动性描述有着内在的联系,就像数学和计算机科学有内在的联系一样.举个例子,说一个程序产生的结果"正确",就是给出了一个有关该程序性质的说明性语句.存在着大量的研究工作,其目标就是创建起一些技术,设法证明一个程序是正确的.在这一领域中有许多技术性困难,究其根源,都出自需要在行动性语句(程序是有它们构造起来的)和说明性语句(它们可以用于推导出某些结果)之间转来转去
-
tertio2012-11-22虽然代换模型看起来似乎非常简单,但令人吃惊的是,给出代换过程的严格数学定义却异常复杂.问题在于,用作过程中形式参数的名字,可能会与该过程可能应用的那些表达式中的(同样)名字相互混淆.在逻辑和程序设计的语义学文献里,关于代换的充满错误的定义有一个很长的历史.
-
tertio2012-11-22将数值作为"简单数据"看待实际上完全是作为一种虚张声势.事实上,对于数值的处理是任何程序设计语言里最错综复杂而且也最迷惑人的事项之一.其中涉及的典型问题包括: 某些计算机系统区分了整数(例如2)和实数(例如2.71).那么实数2.00和整数2不同吗?用于整数的算术运算是否与用于实数的运算相同呢?用6除以2的结果是3还是3.0?我们可以表示的最大的数是多少?最多能表示的精度包含了多少个十进制位?整数的表示范围与实数一样吗?......