【SICP感应】1 工艺和替代模式

《计算机程序的构造和解释》这本书的目的不是要解释的编程语言的语法,它是一种。

不是在你的语句知识,但是,你要教的东西做什么。

这是一个过程,一个精神。

就是所谓的程序规则的模式。

书中用了很多的样例来诠释书名,我才疏学浅就不再举例往博客上推了。只归纳一点总结而已。

假设说程序是一种法术,那么控制奇妙的法术就是过程。

因此我们须要一门叫做Lisp的语言来唤醒这样的精神。从书中的解说中我们发现,Lisp语言的语法并不多,要记住这些语法并不难,但要理解这些规则的含义以及怎样使用这些规则,则是要上非常长的时间去修炼。深入理解了这些规则便会使你成为更优秀的程序猿。

在计算机科学中,这并非要告诉人们该怎样算平方根,作者也说了假设这是计算机科学的所有。那么便没什么了不起的。真正的问题是。当我们试图建立非常大的系统时,这一般是几千页长的计算机程序。

之所以能完毕这样的庞大的project,是由于有一些技术,用于控制这些大型系统的复杂性。而假设控制复杂性也是这门课的重点,某种意义上来说,这也解释了什么是真正的计算机科学。

作者举了一个样例,当一名project师正在设计一个由非常多实体构成的物理系统时。操心这个系统的project师不得不去解决容许误差和噪音的问题。而我是一个电气project师,我能够去非常easy的建立起一级或二级的放大器。你也能够设想建造一百万个放大器的级联。可是去建造这样一种东西是非常荒唐的事情,由于在建造这一百万个放大器的非常长时间之前,这些组件的噪音会得到放大。以至于这整个project没有了意义。

计算机科学负责处理理想化的组件,我们非常清楚的知道我们在将这些小程序和数据块放到一起。我们不必操心误差。那意味着在建立一个庞大的程序时。这和我能建立和我能想象的没有什么不同。

由于这些部分是我知道我想要的抽象的实体。

非常显然project师是非常准确的,因此相对于其它类型的project。你能够建立约束物理系统的限制,建立噪音和近视的限制,实行建设大型软件系统的限制是我们的思想局限。所以从这一点来看,计算机科学就像是project的一个抽象形式。用在所有的project中的一种技术,叫做黑盒抽象。

假设说求出X的平方根可能是一个复杂的整体的一套规则,那么终于会有,比方36的平方根,得出6。而真正重要的是。假设我想计算A的平方根加上B的平方根。那么你便能够用这个规则,而且将其看作一个无需知道内容的模块。由于从我们的角度来看。黑箱内有什么并不重要,由于我们不过想要知道他们的平方根的和。

这在C等各种语言中都有体现。比方给一个函数传入一个參数。我们并不须要知道这个函数的具体操作,不过须要它们的代码。当然了。这里所说的函数是别人写好的库。

书中有一个求平方根的样例。为了去做些什么,我们须要去做一个猜想,而且不断的去改进它。

这里我们能够做一个黑盒,上面写着“平方根”。这里是一个过程,它本身就是关于通用的战略的整体战略第一个关键——将黑盒抽象。将原始的程序和原始的数据结合起来作出更复杂的事情,这里就是说的组合。这是通过定义程序和处理数据抽象的复合数据的技术来完毕。我们要用到的是一种叫做高阶函数的东西,它的输出和输出都是自己的程序。

假设用1和3乘以2,将会得到8。但当我们考虑所谓的线性组合的整体思路时,便能够非常easy的加入两件事情和别的东西相乘。

比如将向量a1和向量a2。通过一些因子来扩展它们,而且得到还有一个向量。我们也能够考虑有两个多项式A1和A2,可能会用2或者其它的数值来乘以这两个多项式。又或者A1和A2可能是电信号。我们可能须要组合这两个电信号而且将其放大。

这就是前面所说的通用的战略的整体战略的第二个关键——常规接口。要做到控制复杂性。就须要建立常规的接口。将约定的东西放到一起。当在谈论真正的大尺度结构时,常规接口在现世界中建模赋值的系统时非常重要。这样的系统有两个非常重要的隐喻,一个被称为OOP(面向对象编程),将我们的系统分为很多小东西。它们之间发送信息交互。还有一个称为流。在那里我们就像电气project师将拼起电气系统一样拼起大型系统。

第三个关键则是基于技术控制的复杂性来构造新的语言——也就是书中第四章所说的元语言。由于当面临一个不堪重负的复杂设计时,也许选择一个新的设计语言是控制这样的复杂性的非常好方式。而新设计语言的目的是突出了系统的不同方面,它能够一直某些类型的细节,而强调其它种类的具体信息。这是这本书最奇妙的部分,而建立新语言的第一步就是用Lisp过程来解释Lisp自身。也许更加神奇的则是仿佛Lisp有两个巨大的车轮——应用和循环。在书中封面你将会看到,它们各自是apply和eval。在我们后面的学习过程中将学习元语言抽象,这将帮助我们构建新的语言。所谓的逻辑编程语言。就是你并不须要研究输入输出的过程。须要研究的则是它们之间的关系。

在第一章我觉得非常重要的一点是lambda和define之间的关系。这在第41页中有具体描写叙述。

(define (plus4 x) (+ x 4))

等价于

(define plus4 (lambda (x) (+ x 4)))

要时刻记住这一点,由于在后面的复杂的程序中。会有非常多个define出现。并唯独

(define (plus x) (+ x 4))

也有

(define plus (+ 4 4))

理解下面这两段代码非常有必要。

(define A 
  (* 5 5))
(define (D)
  (* 5 5))

在这里。

A-->25
D-->compound procedure
(D)-->25
(A)-->error
(define A 
  (* 5 5))
;Value: a

A
;Value: 25

(A)
;The object 25 is not applicable.
;To continue, call RESTART with an option number:
; (RESTART 2) => Specify a procedure to use in its place.
; (RESTART 1) => Return to read-eval-print level 1.
;Start debugger?

(y or n): n (define (D) (* 5 5)) ;Value: d D ;Value 12: #[compound-procedure 12 d] (D) ;Value: 25

程序猿通过构造程序和表达式来构建一个法术,而这些法术在某种程度上直接通过一个过程来实现这一目标。为了有效的做到这一点,我们必须要明确所写的特定事物之间的关系,这些特定的咒语,还有我们试图控制的过程的行为。

在这里我们有lambda,有definitions,有conditionals。还有combinations。怎样去求值组合呢?但真正须要组合起符号和数字的时候,数字会对自身求值,而在代换模型中符号将会消失不见。

它们不会出现,直至你须要它们。怎样来看求值一个应用程序的规则呢,当求值一个组合的时候,它有几个部分——运算符和操作数。运算符会返回到程序。假设求值运算符。我们就会得到一个过程,比方+运算符。替代过程的形式參数提供的參数,形式參数在过程的声明中得到定义。这样我们就能够来求值一个新的实体,这个实体通过用代换模型来复制旧的实体。

即便是对于简单的加法乘法,不管你深入到怎样的细节中去,在一台机器中,你都会发现有更深入的细节。因此我们要学会的便是忽视细节,理解复杂问题的关键是知道什么不用看、什么不用计算还有什么不用考虑。书中关于假设通过代换模型来计算3和4的乘积和已经非常完美了,通过这个样例我们已经看到代换模型的规则,那就是当求值运算符时会得到一个过程,当求值操作数时。假设还没有做应用。则不过得到一个參数。也就是说对于(* 3 (+ 1 4)),(+ 1 4)就相当于是乘法运算符的操作数,在对其求值的时候,假设还没有得到应用,其不过乘法运算符的參数而已。

而对于应用这个词。应用序和正则序则是非常重要的概念。

通过代换模型去命名这些事物以及这些表达式。Gerald Jay Sussman教授说,每个巫师都会告诉你,假设你有命名的精神,你就有了权力。



感谢訪问,希望对您有所帮助。 欢迎关注或收藏、评论或点赞。


为使本文得到斧正和提问。转载请注明出处:
http://blog.csdn.net/nomasp


版权声明:本文 NoMasp王克在 原创文章,如需转载,请与我联系。

分享智慧,维护知识产权。

原文地址:https://www.cnblogs.com/lcchuguo/p/4717579.html