阅读 SICP 感想(0. 关于前言和序言)

阅读 SICP 感想(0. 关于前言和序言)

“带着崇敬和赞美,将本书献给活在计算机里的神明”

初次看到这句话,以为是作者的客套话,在看完全书后,心中确实充满了崇敬和赞美。

(观前提示:本文仅包含个人的一己之间,如引起不适,请理性看待)

1. 计算的趣味性(or编程的趣味性)

  至今还记得最初学生时代学习编程时的心情,不管是在第一次开发GUI程序还是第一次开发聊天室应用,当程序按照预期运行时,心中满满的成就感和兴奋感。在工作以后,面对繁忙的业务、各式各样的语言、多如牛毛的程序库还有各种各样所谓“编程思想”,落得疲于奔命的下场,开始产生迷茫和慌乱,更谈不上乐趣。但是在学习这本书的时候,完成一个个有趣的习题,包括解方程、求导、模拟数字电路、模拟机器等等,此时计算不再是草稿纸上的演算,不再那么抽象,而是实际运行的程序。不仅仅是编程有趣,计算本身也是很有趣的。

  全书的开头 Alan J. Perlis 希望计算机科学领域绝不要失去其趣味意识,或许对于研究、工作来说严肃和严谨的作风更重要,但对于拓宽这个领域而言,开放和趣味性也是不可或缺的。

1.1 本书的趣味性

  我在学习本书过程中多次产生“程序原来可以这样写”、“这个程序原来这么简单”、“这还是程序吗”这样的想法。在经历本书的带来的各种冲击后,看到“各种跑过去又倒回来”、“程序生成程序”、“程序运行程序”也不是那么难以接受了。第一次看完本书,感觉自己就像个小孩子得到了新玩具一样开心,像小时候学会骑自行车那样有成就感。这本书会告诉你编写程序不是用语言和库来搭积木这样无聊的事,可能更像是“炼金术”或“编写咒语”这类魔幻行为。本书就是这么有趣的一本“魔法书”。

  也许有人会说,“既然这么有趣,那应该比较简单吧”。这本书真的不简单,有些习题可能要耽误几天时间来思考和编写,而且有些习题还不能跳过。但是,就像一个游戏需要一些挑战性才会有意思,这本书的乐趣也有一部分来自于习题的挑战。

2. 传道士?开拓者!

  Alan J. Perlis 在开头表示,不希望我们成为传道士,不要认为你是兜售圣经的人。确实,时至今日计算机领域的研究成果得到了很好的应用,但也不乏妥协和偶然。现在有太多的书来展示前人有多么多么伟大,现在的成就有多么多么了不起,但是却很少有书来展示过去一直以来困扰的问题和未来的可能性。如果昨天的无可奈何变成今天的理所当然,而今天的常识又变成明天的限制,那么历史将阻碍历史的发展。而 Alan 所希望我们掌握的,并不是知识本身,而是看到局限并向前推进的智慧。可能这也是书中习题的作用,书中并未给出习题的答案,甚至很多习题并不存在标准答案,还有一些仅仅是让读者思考,但是探索自己的答案的过程会让人收获更多。全书的风格也是探索挑战的风格,而非陈述知识的风格。

3. 人脑、计算机程序和计算机

  序言谈论到三类需要关注的对象:人的大脑、计算机程序的集合以及计算机本身。而这些恰好也是编程行为所涉及的主体。计算机程序是现实或精神中某个过程的模型,而通过人脑将其“孵化”出来,这是书中给出的说法,我更喜欢表述为“计算机程序是大脑中思维的具象化、文本化,也是把思维转换成某种形式后从大脑内搬到外面后的产物”。其中也提到计算机编程令人兴奋的源泉在于它所引发的连绵不断的发现,确实如此,人的脑容量非常巨大,但是人的注意力非常有限,当把一部分思维模型编写成程序后,也解放了一部分脑力。而计算机则是执行程序的主体。“人编写程序让计算机来执行”这个过程看作“人把一部分智能(思维模型)程序化以后移植给计算机,让计算也具有这部分智能”好像也没什么问题。

  另外,很喜欢那句“如果说艺术解释了我们的梦想,那么计算机就是以程序的名义去执行它们”。

4. SICP中的Lisp

  SICP这本书用Lisp作为主要编程语言,严格来说是把Scheme作为主要编程语言,当然,本书的程序用其他Lisp方言(例如,Common Lisp或Emacs Lisp)来编写也没有问题。关于Lisp和其他编程语言的比较,可以考虑单独写文章来叙述(网上已经有许多这样的内容了),在这里我还是整理下SICP选用这个语言的理由吧。

  首先是这门语言托付给程序员个人可用的自由支配权,具体来说,就是程序员个人可以很大程序去改变语言,扩展语言的语法和语义,想象一下,一个人想要给C语言加入面向对象特性需要多久,而给Lisp加入面向对象特性可能是一下午或一个周末的工作量,添加语法糖、构造新语言更是家常便饭。

  其次,Lisp语言相对简单,学习Scheme的基本语法可能也是一个下午或一个周末,按照前言的说法,所有的形式化性质可以在一小时内讲完,然后就不用去关注语法细节了(因为根本就没有 >_<)。假如换成C、Java等常见语言,那还得花大量时间学习语法语义,把大量的注意力放在语法细节上,而且最后会依赖这些表面的语法特性。

  另外,在Lisp里代码就是数据这一点也很重要,代码就是列表形式组织起来的,改变代码就是改变列表,这样语言处理器的构造不会有太大阻碍(想象一下编写程序去修改Python或Javascript的代码)。

  在SICP这本探索程序本质的书中,这几个特点都尤为重要。

7. MIT中的SICP

  1980年开始,SICP这本书就作为麻省理工学院(MIT)计算机科学的入门课程的基础,在MIT主修电子工程(EE)和计算机科学(CS)的学生都必须学这门课(好像前两年Sussman不讲这门课了,换成其他的)。一开始有些不敢相信,觉得这么高深的内容作为入门有点不可思议,但是看完一边内容后,觉得跟高数、线性代数、模拟电路、数字电路等基础课程比起来好像也没有难到哪里去,讲的是非常“基础”的理论,作为CS领域的入门书或导引非常合适,以此为起点去讲处理器、算法、编程语言或许更为连贯,知识也更容易成体系(相比于C语言、算法、计算机硬件基础直接开始而言)。而且对这本书的学习对于后续编译器、解释器、编程语言、处理器的学习也有比较大的帮助。

8. SICP与计算机科学

  作者在序言里提到了他们的一种信念,即“计算机科学”并不是一种科学,而且其重要性也与计算机本身并无太大关系,而计算机革命是有关我们如何去思考以及如何去表达自己的思考的一个革命。好像作者说了不得了的话,计算机科学是不是科学暂且不论,在阅读本书后感觉其重要性与计算机确实没有太大关系,只是程序恰好由现在的计算机来执行罢了(不知道以后会不会有生物计算机或其他用来执行程序的东西)。另外,作者还提到设计这门计算机科学的导引课程的两个考虑:一、希望建立起一种看法:一个计算机语言并不仅仅是让计算机去执行操作的一种方式,更重要的是一种表述有关方法学的思想的新颖的形式化媒介。二、这一层次的课程里,最基本的材料并不是特定语言的语法,不是计算某种功能的巧妙算法,也不是算法的数学分析或计算的本质基础,而是一些能够控制大型软件系统的智力复杂性的技术。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ava实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),可运行高分资源 Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现的毕业设计&&课程设计(包含运行文档+数据库+前后端代码),Java实现
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。下面详细介绍C语言的基本概念和语法。 1. 变量和数据类型 在C语言中,变量用于存储数据,数据类型用于定义变量的类型和范围。C语言支持多种数据类型,包括基本数据类型(如int、float、char等)和复合数据类型(如结构体、联合等)。 2. 运算符 C语言中常用的运算符包括算术运算符(如+、、、/等)、关系运算符(如==、!=、、=、<、<=等)、逻辑运算符(如&&、||、!等)。此外,还有位运算符(如&、|、^等)和指针运算符(如、等)。 3. 控制结构 C语言中常用的控制结构包括if语句、循环语句(如for、while等)和switch语句。通过这些控制结构,可以实现程序的分支、循环和多路选择等功能。 4. 函数 函数是C语言中用于封装代码的单元,可以实现代码的复用和模块化。C语言中定义函数使用关键字“void”或返回值类型(如int、float等),并通过“{”和“}”括起来的代码块来实现函数的功能。 5. 指针 指针是C语言中用于存储变量地址的变量。通过指针,可以实现对内存的间接访问和修改。C语言中定义指针使用星号()符号,指向数组、字符串和结构体等数据结构时,还需要注意数组名和字符串常量的特殊性质。 6. 数组和字符串 数组是C语言中用于存储同类型数据的结构,可以通过索引访问和修改数组中的元素。字符串是C语言中用于存储文本数据的特殊类型,通常以字符串常量的形式出现,用双引号("...")括起来,末尾自动添加'\0'字符。 7. 结构体和联合 结构体和联合是C语言中用于存储不同类型数据的复合数据类型。结构体由多个成员组成,每个成员可以是不同的数据类型;联合由多个变量组成,它们共用同一块内存空间。通过结构体和联合,可以实现数据的封装和抽象。 8. 文件操作 C语言中通过文件操作函数(如fopen、fclose、fread、fwrite等)实现对文件的读写操作。文件操作函数通常返回文件指针,用于表示打开的文件。通过文件指针,可以进行文件的定位、读写等操作。 总之,C语言是一种功能强大、灵活高效的编程语言,广泛应用于各种领域。掌握C语言的基本语法和数据结构,可以为编程学习和实践打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值