2016年/03月/27日

首页回退

开始细读SICP

在中国学习计算机科学,大学四年没有人会给你提起一本叫做sicp的书,这是一种悲哀,它仅仅是MIT计算机科学的入门图书,但是如果工作之后,你能知道这本书,同时还会慢慢的品读它,那也是幸运的,和SICP齐名的还有一本CTMCP,SICP买了很多年,这几年养家糊口,浪来浪去,也买好好读它,今天写一写这本书的前几页,没错,是目录前的几页,与其说写,不如说是摘要。

一、计算机里的神灵

计算机程序构造与解释 “我认为,在计算机科学中保持计算中的趣味性是特别重要的事情。这一学科在起步时饱含着趣味性。

我们不可否认计算机本身和数学联系密切它的诞生是因为人们给自己的数学研究制造了危机数学家们怀疑自己
怀疑这个世界当然趣味性是人们不放弃解决问题的动力

我希望我们不要变成传道士,不要认为你是兜售圣经的人,世界上这种人已经足够多了。你所知道有关计算的东西,其他人也都能学到。绝不要以为似乎成功计算的钥匙就掌握在你的手里。你所掌握的,也是我认为并希望的,也就是智慧:那种看到这一机器比你第一次站在它面前时能做得更多的能力,这样你才能将它向前推进。”

计算机的世界是神秘而有趣的我们的发现有可能还不是很多未来需要我们用智慧和勇气把他向前推进
但是我们每天使用的技术貌似理论都是在很久以前就存在了
不管是某种算法某种编程语言这十几年或者二十年我们似乎没有发明真正的新东西

二、大脑,程序,机器本身

我们每天面对的要么是物质,要么是精神,而每一个计算机程序都是物质或者精神的一个模型,这些模型通过我们的大脑孵化出来,他出现在我们的经验或者思维中,数量太多,以至于我们不能全部理解他们,我们用程序去模拟这些模型永远不能令自己满意,我们奋斗不止只能把一个模型保持亚稳定,随后就可能迸发出新的模型让我们继续为之努力,这也是前面说到的趣味性,世界是未知的,所以才有趣,这可能不仅仅是计算机领域。

艺术解释了我们的梦想那么计算机就是以程序的名义执行着他们

三、控制复杂性

计算机本身是一丝不苟的,任劳任怨,可是我们的程序一旦足够的庞大,我们就不能保证他的正确性和一致性,所以我们必须要发明某型方法来控制程序的复杂性和庞大之后的可控,于是有了很多惯用法。

因为大的程序是由小东西成长起来的开发出一个标准化得程序结构武器库保证其正确性
然后通过组合的形势让这些正确的结构再构造出大的正确的结构发现并掌握强有力的组织技术至关重要

四、物理定律

计算机也是个物质,物质的性质必须在物理的框架下运行,要快速运算,必须让电子的速度够快,但是光速是不能突破的,所以计算机硬件层级的抽象会是真正的工程技术,计算机程序会变化到物理机器上执行,但是程序过程本身是一个抽象模型。

计算机永远都不够大也不够快,(我们有那么多NP,NP完全问题待解决),硬件技术的每次突破都带来了更大规模的程序设计事业,新的组织原理,以及更加丰富的模型,(多核带来编程挑战,并发编程模型,云设施),到底哪里是个头?到底哪里是个头?这种问题我们应该少问,因为探索趣味性才是最重要的,以免将自己陷入喜忧参半的呆滞状态中。

五、 Lisp和Pascal

很难找到这样的两种语言,他们如此清晰地代表着围绕两种语言而聚集起来的两种差异巨大的文化,Pascal是为了建造金字塔——壮丽辉煌、令人震憾,是由各就其位的沉重巨石筑起的静态结构。而Lisp则是为了构造有机体——同样的壮丽辉煌并令人震憾,由各就其位但却永不静止的无数简单的有机体片段构成的动态结构,Lisp程序大大抬高了函数库的地位,使其可用性超越了催生它们的那些具体应用。作为Lisp的内在数据结构,表对于这种可用性的提升起着最重要的作用。表的简单结构和自然可用性反应到函数里,就使它们具有了一种奇异的普适性。而在Pascal里,数据结构的过度声明导致函数的专用性,阻碍并惩罚临时性的合作。

采用100个函数在一种数据结构上操作远远优于用10个函数在10个数据结构上操作作为这些情况的必然后果
金字塔矗立在那里千年不变而有机体则必须演化否则就会死亡

六、如何把语言做简单

在其他程序设计文化中,问题的洪水孵化出一种又一种新的语言。确实,在任何非常大的程序设计工作中,一条有用的组织原则就是通过发明新语言,去控制和隔离作业模块之间的信息流动。(我们可能每天都在创造DSL)

这些语言趋向于变得越来越不基本,逐渐逼近系统的边界,逼近我们作为人最经常与之交互的地方。作为这一情况的结果,在这种系统里包含着大量重复的复杂的语言处理功能。

Lisp有着如此简单的语法和语义程序的语法分析可以看作一种很简单的工作
这样语法分析技术对于Lisp程序几乎就没有价值
语言处理器的构造对于大型Lisp系统的成长和变化不会成为阻碍

最后,正是这种语法和语义的极端简单性,产生出了所有Lisp程序员的负担和自由。任何规模的Lisp程序,除了那种寥寥几行的程序外,都饱含着考虑周到的各种功能。发明并调整,调整恰当后再去发明!

一个计算机语言并不仅仅是计算机去执行操作的一种方式,更重要的,它是一种表述有关方法学的思想的新颖的形式化媒介,因此,程序必须写得能够供人阅读,偶尔去供计算机执行。

lisp这样基本五语法的语言可支持模块化,过程抽象,数据抽象,高阶函数,模拟局部状态,流和延迟求值去连接程序,可以实现DSL。lisp大师们铸造了这样一个具有空前威力的如此优美的好工具。

七、计算机科学

计算机科学并不是一种科学,而且其重要性也与计算机本身并无太大关系,计算机革命是有关我们如何去思考的方式,以及我们如何去表达自己思考的一个革命,在这个变化里最基本的东西,就是出现了这样一种或许最好是称为过程性认识论的现象—这就是如何从一种命令式的观点去研究知识的结构,这一观点是与经典数学领域中所采用的更具说明性的观点完全不同,数学为精确处理是什么提供了一个框架,而计算机则为精确处理怎样做的概念提供了一个框架。

但是我不得不承认说明性编程语言更能降低程序复杂度和提升维护性
SICP这个观点我预计以后会被程序员不断的在抽象上往说明式发展

一台计算机如一把小提琴,新手试了一个音符丢掉了它,他觉得真难听,计算机程序对个别具体用途而言确实是个好东西,但他们太缺乏弹性,一把小提琴或者一台打字机也同样缺乏弹性,那是你学会了如何去使用之前.

待续…