斜体 表示你须要对斜体部分的含义做出细细的斟酌和思考javascript
加粗字 表示这部份内容是被强调的,须要注意html
本文的目的主要在于解答如下问题:前端
想要理解学习SICP和学习编程有什么样的关系?也许这样一个类比是有益理解的——学习SICP之于编程就像学习 学习 自己。让咱们再具体点,当咱们在讨论学习数学、学习物理时,咱们的研究对象是数学和物理,当咱们在讨论学习学习的时候,咱们的研究对象不是某一具体的科目,而是 学习 自己。在其余地方,你也许见过 元知识 这样的词语,其含义表示是 关于知识的知识,和上文讲的学习 学习 自己实际上是一个意思。java
那么:python
解答:es6
相比于元知识,通常性知识更加专一于某一个领域,这使得通常性知识具备了某种特殊性(specialized),而元知识的关注点则更加彰显了其通用性。之因此区分这两个概念,是由于这有助于咱们解答如下这个问题——是否存在一种高效且适用于任何领域的学习方法? 或者说 是否存在这样一种知识,可以使咱们更好的学习、研究其余知识。显然,这个问题的描述就是学习元知识的好处。编程
举个例子:框架
科学方法 就是一种元知识,拿物理学和经济学来讲,这两门都算科学,但它们研究的对象显然都不同,物理学更加符合咱们对 科学 这个单词的认知,那么经济学为何也算科学呢?由于它采用科学方法来研究经济。注意尽管物理学和经济学的研究对象不同,甚至能够说大不相同(通常性知识),可是却均可以用科学方法(元知识)来研究它们。编程语言
在讲述了知识和元知识的关系后,让咱们回到SICP和编程的关系中来。模块化
学习SICP并不会教会你如何写出一个博客、论坛程序(通常性知识)。SICP的目的在于教会你,当你掌握了不管是写一个博客、仍是一个论坛程序的通常性知识后,如何写出一个 好 的程序。
以上是从更加笼统的角度谈述SICP这本书籍目的,接下来会再具体一点。
本书的做者认为计算机科学和计算机的关系没有紧密到须要在名字中带上计算机三个字,比起说是一门科学,则更像一门艺术,并指出其真正的研究目标在于解决 如何形式化解决问题的过程?
为了理解这个目标,咱们先来看看什么是 过程 ?
这里咱们须要先区分两种知识:
前者告诉你是什么,后者告诉你 具体怎么去作,而 过程就是指令性知识。
因此,再通俗的解释下,做者认为的计算机科学的目在于解决,(在计算机中)如何以一种精确、规范性的方法来表述指令性知识
在尝试达到计算机科学的这一目标时,咱们会遇到一些问题,其中最主要和重要的问题就是 当咱们尝试构建很是巨大的系统时,咱们如何确信这些系统是正确没有错误的 换句话说 为何咱们能够构建出很是巨大的系统,且又保证它们的正确性,这是由于存在着 控制大型系统复杂度的技术。
而 控制大型系统复杂度的技术 就是本书要 实际 讨论的主题,本书的目的也在于教会读者掌握这些技术,因此当你疑惑SICP这本书到底再讲什么的时候,回想下这个这本书的讨论的主题,就很容易得出相应的答案了。虽然说本书的主要目的在于教授控制复杂度的技术,可是本书一样教授了为掌握这些技术须要学习的基础知识,而这些基础知识恰巧也是相关领域的核心部分,这也是为何SICP被推荐做为编程入门书的缘由(不是第一本学习编程的书,而是第一本入门编程的书)。
相比较电气学和物理学来讲,计算机科学处理的是一种理想化的组件,咱们的想法和实现之间没有差距,为了理解这句话,咱们来看一个例子。一个物理学家10秒钟能够撕开1张纸(这个不难),请问物理学家如何在5秒中撕开1张纸?答案很简单,只要物理学家的撕纸速度加倍就好了。那么,假设要让物理学家在1秒中撕开10张纸呢?答案依旧很简单,只要物理学家的速度变为原来的100倍就行,但咱们都知道现实中是不可能的。不可能的缘由就是咱们理解 对于计算机科学,咱们的想法和实现之间没有差距 的关键。所以,当咱们尝试构建一个大型系统时,咱们不会受到物理世界的约束,不须要考虑现实世界的偏差、额外影响,惟一限制咱们的是咱们自身大脑的思惟能力。
咱们先来理解 黑盒抽象 的含义:黑盒抽象是一种有关 使用同样事物而无需了解其内部实现 的思想。
若是细细思考下来,不只于计算机科学,咱们生活的世界其实就构建在这种思想之上。咱们坐飞机不须要考虑飞机的实现原理,咱们买车票而没必要在意是什么样的魔力使得咱们能够经过一张小纸条就坐上一个呜呜叫的运输工具去往诗和远方。
让咱们回到计算机科学中来,来尝试思考下 为何咱们须要黑盒抽象?
上文刚才讲述了,当咱们在构建大型系统时,咱们受到的惟一限制就是咱们大脑的思惟能力。黑盒抽象可使咱们从那些实现细节中解放出来,从而有更多的精力来关注咱们想要关注的事物——构建大型系统自己。
其次,也有助于在大型系统中更换组件,咱们依赖黑盒的功能来组织系统,而非黑盒的实现细节,对于实现一样功能的黑盒来讲,咱们不会由于其中一个内部实现用for语句,一个用了while语句,就没法互换这两个盒子。
对于黑盒抽象来讲,思考如下问题是有益的:
让咱们看看一些黑盒的例子:
让咱们以一个简单的有关 如何找出和抽象盒子中共同的部分 的例子来结束黑盒抽象这部份内容
const cube = x => x * x * x;
const square = x => x * x;
// cube和square是两个盒子,且都是对元素按次数乘以自身思想的特例
// 如今咱们来表述元素按次数乘以自身思想的通用形式,并将cube和square构建其之上
const power = (x, n) => n === 0 ? 1 : x * power(x, n - 1);
const cube = x => power(x, 3);
const square = x => power(x, 2);
复制代码
这是个简单的例子,一眼就能够看出共通的部分,问题在于程序的规模变大时,其共同的部分就没法一眼看出了,而SICP则讲述了如何在规模庞大的系统上找出和抽象共通的部分。
咱们来考虑这样一个问题:对于一个通用加法系统(不只能够对数字相加,还能对相加字符串,相加多项式),如何在不影响其余相加功能的基础上,增长新的相加功能?
其解决方法就是经过约定接口,了解过JAVA的人可能知道JAVA里有接口的存在,然而要注意的是JAVA的接口只是接口约定思想的一种实现,只要符合接口约定的思想,任何语言均可以构建本身的接口机制。
JavaScript在ES6中也提供了接口,任何一个实现了[Symbol.iterator]方法的对象,就能够做为let of的对象,详见点此
何对复杂的现实世界建模并构造大型程序,有两种方法:
当纯粹的设计已经没法控制系统复杂度时,一门新的语言也许是一个好的选择(就像Vue和React)。
这里谈的新语言不是写一个python或者js出来,设计一门新语言的意图是为了强调某一个方面,而且这里谈论的新语言并不是想象中的那么“重”,举个例子,之前端来讲,Vue和React能够说就是两门新的语言,它们构建于JS之上,可使用JS的语法,而且强调了某些细节(数据映射成视图,自动操做DOM结构),忽略了某些细节(手动操做DOM结构,人脑同步各类状态)。其中Vue也许比React更像一门新的语言(前者多了一些DSL,后者的JSX只是语法糖),但其中的思想是同样的。
虽然讲述编程语言不是SICP的主要目标,可是本书仍是在这方面提供了很多有益的帮助
SICP提供了一种 通用的编程语言模型,即任何一门语言都要关注如下三点:
由于教授如何掌握编程语言不是SICP的主要目标,尽管提供了相应的帮助,但没有详细的发展,王垠的博客里详细的扩充了这一段内容,见此。