阅读SICP序的笔记
从小到大,我们习惯于被人规划生活。在家中,父母长辈给我们规划生活;在学校,老师给我们规划整天的学习任务;工作后,由上司给我们分配工作任务。一直被规划的我们,现在可以做一件自己进行规划的事,那就是编程。
序
解决大规模问题需要进行一系列规划,正如进行较大项目就需要前期进行大量规划与设计,否则会导致更大的问题。同时,要进行计算机程序设计,需要大量的读或者写程序。有关这些程序具体的、服务于哪类应用等等情况并不重要,重要的是它们的性能如何,在用于更大的程序时能否与其他程序平滑衔接。程序员们必须同时追求具体部分的完美和汇合的适宜性。本书使用“程序设计”一词,关注程序的创建、执行和研究,使用Lisp语言书写。(国内估计学过此语言的凤毛麟角,大概都如我般学的是C)
本书主要关注三类对象,人的大脑、计算机程序的集合以及计算机本身。
①人的大脑
每个计算机程序都是现实中的或者精神中的某个过程的一个模型,通过人的头脑孵化出来的。这些过程出现在人们的经验或思维中。
②计算机程序的集合
计算机是一位一丝不苟的工匠:它的程序必须正确,我们希望说的所有东西,都必须表述到每一点细节。同样,程序需要检验认证。但是,当程序变得更大更复杂后,这种描述本身的适宜性、一致性和正确性都变得非常值得怀疑了。很少看到关于大程序正确性的完全形式的论证。因为大的程序是从小东西成长起来的,开发一个程序结构的武器库,并保证每种结构的正确性 我们称它们为惯用法,再学会如何利用一些已经证明很有价值的组织技术,将这些结构组合成更大的结构,这些都是至关重要的。理解这些技术,对于参加这种被称为程序设计的具有创造性的事业是最最本质的。特别值得提出的是,发现并掌握强有力的组织技术,将提升我们构造大型的重要程序的能力。反过来说,因为写大程序非常耗时耗力,这也推动着我们去发明新方法,减轻由于大程序的功能和细节而引起的沉重负担。
③计算机本身
与程序不同,计算机必须遵守物理定律。如果它们要快速执行-----几个纳秒做一次状态转换-------那么就必须在很短的距离内传导电子(最多1.5英尺,难怪电路板一般都小于45cm)。必须消除由于大量元器件而产生的热量集中(已找到平衡点)。在任何情况下,硬件都在比我们编程时所需关心的层次更低的层次上操作的。将我们的Lisp程序变换到“机器”程序的过程本身也是抽象模型,是通过程序设计做出来的。研究和构造它们,能使人更加深刻地理解与任何模型的程序设计有关的程序组织问题。当然,计算机本身也可以这样模拟。请想一想:最小的物理开关元件在量子力学里建模,而量子力学又由一组微分方程描述,微分方程的细节行为可以由数值去近似,这种数值又由计算机程序所描述,计算机程序的组成.....
区分出上述三类需要关注的对象(指代人的大脑、计算机程序的集合以及计算机本身),并不是仅仅为了策略上的便利。即使有人说它不过是人头脑里的东西,这种逻辑区分也引起了这些关注焦点之间符号流动的加速,它们在人们经验中的丰富性、活力和潜力,只能由现实生活中的不断演化去超越。我们至多说,这些关注焦点之间的关系是基本稳定的。计算机永远都不够大也不够快。硬件技术的每一次突破,都会带来更大规模的程序设计事业,新的组织原理,以及更加丰富的抽样模型。(别问到哪里才是头,我估计到了cpu频率达到光速就是极限了。。)
在我们写的程序里,有些程序执行了某个精确的数学函数(但是绝对不够精确),例如排序,或者找出一系列数中的最大元,去顶素数性,或者找出平方根。我们这种程序称为算法,关于它们的最佳行为已经有了许多认识,特别是关于两个重要的参数:执行时间和对数据存储的需求(时间复杂度和空间复杂度之间的矛盾)。程序员应该追求好的算法和惯用法。即使某些程序难以精确的描述,程序员也有责任去估计它们的性能,并要继续设法去改进之。
Lisp是一个幸存者,已经使用了四分之一世纪(上世纪90年代)。Fortran比它时间更长一些。Fortran用于科学与工程计算(爆咋的哥伦比亚号就使用此语言),Lisp用于人工智能。
Lisp一直在改变。Lisp程序员获得个人可用的自由支配权。Lisp程序大大抬高了函数库的地位,使其可用性超越了催生它们的那些具体应用。作为Lisp的内在数据结构,表对于这种可用性的提升起着最重要的作用。表的简单结构和自然可用性反应到函数里,就使它们具有了一种奇异的普适性。
bear2flymoon 2015-03-15