计算机程序的构造和解释 笔记(一)
发布网友
发布时间:2024-10-01 10:17
我来回答
共1个回答
热心网友
时间:2024-10-19 17:49
计算机科学与程序员之间存在紧密联系,即便是最基础的CRUD操作,理解解释器的工作原理也是十分必要的。尽管SICP在当今可能显得有些过时,甚至MIT已经停止教授该课程,但这并不妨碍我们在业余时间对其进行研究。
这本书与《深入理解计算机系统》和《算法导论》一样,是计算机科学入门的经典教材。尽管入门难度较大,但对于像我这样的初学者来说,制作读书笔记显得尤为重要。
在阅读本书之前,需要了解其使用的编程语言——Scheme方言,它属于著名的Lisp语言家族。关于Lisp的特性,可以参考相关资料。
Scheme是Lisp的三大方言之一,由于Lisp的特性,其语言变种众多。
要使用Scheme进行开发,可以下载Racket,它是继承自Scheme的Lisp方言,下载地址如下:
第一章:构造过程抽象
本章主要介绍了如何将最基本的数据和操作组合成复杂的过程,并如何对这些过程进行抽象和命名,以便将它们作为单元操作。这两种能力是所有语言都具备的基本能力。
1.前缀式是Lisp的运算表达式方式,与Java的中缀式不同,也与我们传统的数学学习有所冲突。不过,这两种表达方式可以通过树结构轻松地互相转换。
2.在解释器对组合式进行求值时,可以使用正则序和应用序两种求值方式来得到结果。正则序求值是一种“完全展开后再归约”的求值模型,而应用序求值是一种“先对参数求值后再应用”的求值模型。
3.递归与迭代之间的区别
递归是指计算式通过自我调用将复杂问题无限分解,这种方法可以使用有限的语句表示无限集合。迭代则是一个循环,与普通循环的区别在于,循环代码中参与运算的变量同时是保存结果的变量,当前保存的结果作为下一次循环计算的初始值。
以阶乘为例,我们可以用递归和迭代两种方式计算阶乘。递归方式通过不断调用自身来实现,而迭代方式则通过循环实现。
4.使用高阶函数进行抽象
高阶函数指的是将函数作为参数或返回值的函数。在Java 1.8之前,Java开发者只能使用匿名内部类来模拟这一特性。从Java 1.8开始,我们可以使用Java的Lambda表达式,但无论如何,在这一方面,Java都不如Lisp灵活。
在Lisp中,函数是一等公民,我们可以将函数与数据同等处理,进一步提升抽象的层次。例如,我们可以通过将f(x)作为参数传递,使用高阶函数抽象计算过程。
5.Lambda表达式
Lambda表达式是Java和Lisp等语言中的一种匿名函数,可以用来表示只使用一次即可丢弃的方法。
6.“一等公民”
在Lisp、JavaScript等函数式特性较强的方法中,函数被作为一等公民使用。这意味着函数可以作为变量赋值,可以作为其他函数的参数和结果,可以放入数据结构中。这一特性虽然强大,但难以掌握,但带来的能力也是格外强大的。
7.平方根计算及其抽象
本章内容以平方根计算为例,介绍了逐步*近法。在1.17节中,我们使用逐步*近法计算平方根。在本章结尾,我们将平方根问题转换为查找y→y/x的不动点问题,并抽象出一个通用的取不动点方法,这是本章的要点。