魔法

相信的心,就是你的魔法!

编程很像是一种现代魔法.即使它并没有像人们想象的一样违反科学常识,其带来的吸引力却毫不亚于魔法.在键盘上敲下某一个字母,屏幕上就会显示对应字母;打开某个视频文件,电脑就会将其播放;乃至于在打印店中点击打印按钮,打印机就会将文档分毫不差的打印出来.

这些看似神奇的操作,实际上与计算机的层层抽象,密不可分.或许你会觉得其中的原理深不可测,但那实际上只是未知带来的恐惧.科学是属于大众的,任何知识最初都是由那一小撮想法发展而来的,经过思考分析论证而发扬光大.实际一点也不玄乎.

当你在算盘下打下一算珠,又打下一算珠时,实际上这已经完成了一次计算.可以从算盘上读出计算结果是二.这个想法的关键在于,给定一系列的规则(珠算口诀),将要计算的数按照规则输入,你得到了答案的算珠表示.而电子计算机只是将这一过程电子化,依赖快速的电压变化来进行高速计算.两者本质并无区别,而这恰是’魔法’的重要基础.

编码

形式不是关键,关键是语义.

自人类文明诞生之初,就在和编码打交道,计数法的发展就是一个例子.古代对象比较少,可以用绳结计数,一个绳结代表一个对象.后来对象比较多,就有了位的概念,不同位置的数依次代表着不同的权重.现在有科学计数法,能够简洁的表达不同量级的对象.

上述的例子都是在描述数目的多少,改变的只是表示的形式.编码就是一种映射,建立了形式与语义的联系.同样的表示形式,按编码的不同,可能会产生不一样的语义.

01000001是什么?显然,它可以表示字符01000001,也可以表示二进制1000001即十进制65的数字,同样在ASCLL码中,可以表示成字母A.甚至我们可以通过某一种编码,让它成为某个代数系统中的加号.它是什么,取决于用什么样的编码去解释它.不止数据可以被编码,操作同样也是可以编码的,就像在纸上写下运算符一般自然.

抽象

数学威力为何如此巨大,乃至于即使只是一行的式子,其寓意也胜过千言万语.

科学计数法的强大之处在于,用简短的信息描述了量级信息,不必将其一一用零表示.这个符号(概念)的强大之处在于我们关注的是量级的大小本身,而不是一定位数之后那些位的数字究竟是什么.它让我们明晰重点,突出概念,从一个更高级的概念入手,归纳出更高级的性质.如同牛顿时代之前的数学家对很多关于微积分的问题束手无策,而现在基本一个大学生经过较短的训练掌握微积分就能程序化的解决这些问题一样,我们得到了概念上的升华,从而更加得心顺手,并非现代人就比前辈要更加聪明.

无法忍受计算机电路01的低效理解,那我们就用一种叫做汇编语言的东西,去描述电路01的操作意义.无法忍受汇编语言对某一个电路操作描述,那我们就用一种叫做高级语言的东西,去包装汇编语言.将人类的逻辑翻译成计算机的逻辑,一层层抽象出来的概念,用它去成就更加伟大的概念.

模型

专业的事情就应该让专家来干

C语言成功的主要原因之一在于它很好的平衡了语言中与机器相关的部分.而许多现代编程语言更是很好的屏蔽了计算机底层信息,让使用者将更多的精力放在应对工作需求上.

汇编语言提供了一个处理器编程模型供人们使用.高级语言提供了一种与平台无关的编程模型供人们使用.实际上,高级语言的编程模型正是汇编语言的处理器编程模型抽象而来.抽象高层模型使我们’魔法’的威力更加强大(具有某种更高级的特性),缺点是细粒度变大了,无法关注过多细节.但人们可以从各个模型层次切入,在某个层次相对独立的工作,并在各个层次做出优化.

将一个问题抽象成不同层次的模型及模型内相对独立的模块成了我们面对大型工程的重要工具.

编译

模型之间的桥

编程就像是写文章.一篇描述数据流动的文章.

计算机只接受它的01语言,写出来的文章与之不在同一个世界.之所以我们的文章能够畅通无阻的被计算机所理解,是因为中间存在着编译器这座桥.它忠实的将语义传达给计算机,拉近我们与计算机的距离,以至于我们有时候都会忽略它.然而缺它不可,它是一种模型到另一种模型的桥梁,将模型中的行为与另一模型中的行为建立对应.

想要和外语人有心灵上的交通,最好懂一点外语.

总结

写得很乱,其实想表达的主要想法有

  1. 编程并不难,就是根据模型写文章.
  2. 重要的是逻辑,模型可能变化大,但处理问题的逻辑是基本不变/缓慢变化的.
  3. 抽象模型和模块化是编程的重要思想.
  4. 数据和逻辑都能被编码,对此来说,重要的是如何解读它.
  5. 不同编程语言,面对不同问题,模型不同语义细粒度不同.学习编程语言,应该主要学习其抽象出来语言特性.
  6. 懂编译器解释器如何翻译你的代码语义还是很有必要的.