Linus(三)——改变一生的书籍

    终于,让林纳斯痛苦不堪的兵役结束了,除了敲锣打鼓欢庆重生之外,他开始继续拓展自己的编程之路,这时候,生命中最重要的一本书出现了,书的名字叫做《操作系统:设计和实现》 ,作者是安德鲁·坦尼鲍姆。用林纳斯的原话表述就是“这本书把我推上了生命的高峰” 。

    那个时代 Unix 已经开发出来了。最早 Unix 是用汇编写的,开发过程中 Unix 的两位创始人肯·汤普逊和丹尼斯·里奇觉得用汇编写程序实在是太苦逼了,男人应该对自己好一点!于是老哥俩决定用高级语言来完成下一个版本,他们首先尝试了Fortran,失败!然后又基于BCPL(Basic Combined Programming Lanugage)创建了 B 语言,B 语言可以被认为是那个时代的解释型语言,不能直接生成机器码,效率上完全没法满足系统的需求,再次失败!我们都知道,一再失败的情况下总会有一位英雄人物挺身而出,这次是丹尼斯·里奇,他从失败的大坑中爬起来拍拍土抹抹泪,继续对 B 语言进行改造。这次丹尼斯为 B 增加了数据类型,并让 B 语言能够直接编译为机器码,然后又为这门语言起了个极其响亮的名字——New B,读一读神清气爽,念一念气冲云霄,从此一代语言巨星冉冉升起,40年后依然排在兵器排名榜第一位,怎一个牛字了得!当然,丹尼斯可能考虑了十几年后中国人民的感受,把New B改为了 C 语言,并用 C 语言重新编写了 Unix 的内核,Unix 与 C 从此珠联璧合,长相厮守,再也无法分离。

    操作系统、Unix 和 C 语言可以说是林纳斯心目中神山上的三座圣杯,为了至高无上的荣耀,他首先要攀上峰顶,把这三座圣杯捧在手中,然后再琢磨建造自己的宫殿的事儿。在那一年的夏天,林纳斯开始了高强度的阅读和学习,用他的话说就是做了两件事: “一件事是什么都没做,另一件事是读完了 719 页的《操作系统:设计和实现》 。那本红色的简装本教科书差不多等于睡在了我的床上。”

    林纳斯认为,Unix 是一个简洁、干净的操作系统,在 Unix 上的大部分任务都是通过一些基本操作完成的,这些操作被称为 System Call,顾名思义,这些操作就是你对系统的呼叫,系统通过响应你的呼叫完成工作。比如 fork、clone(创建子进程),比如 open、close、read、write(文件访问) 。这些基本的系统调用通过组合可以完成大部分功能。同时,Unix 还提供了极为强大的 IPC(进程间通信)方式: pipe(管道) 。很多工作在 GUI(图形界面)软件环境下的读者,最常用的 IPC 操作可能是复制、粘贴、鼠标拖拽,这些操作虽然简单,但是必须由人来完成,想要自动化就很困难。而这些在 Unix 上实现起来就像大自然一样自然,你只需要在程序之间开辟出一段缓冲区作为管道,然后父进程和子进程就可以通过这个管道实现进程间通信了。举个例子,以前给大家介绍的查找历史命令的脚本,就利用了管道的功能,如下:

    history | grep apache

    这行命令的含义就是查找包含 apache 的历史命令,其中特殊字符“ | ”用来告诉命令行解释器 (shell) 将前一个命令的输出通过“管道” 作为接下来的一行命令的输入,就这样,一个简单的进程间通信就完成了。

    总之,林纳斯在读完这本书之后,就像郭靖修习了九阴真经全本一样,对机器和代码的世界有了更为透彻的认知,接下来的事情就是等待一个打造传奇的机会。

    等待的过程中,林纳斯也没闲着,他又开始编程了。好的程序员对编程的喜爱是溢于言表的,以下摘录一些林纳斯的编程感想:

    在编程的人看来,编程是世上最有意思的事情了。它要比国际象棋之类的游戏复杂得多,你想要什么规则都可以自己设定。按照你定下的规则,它的结果该是什么,就会是什么。你在电脑上创造出属于自己的新世界,而唯一的限制就是电脑本身的性能,还有,还有一点在今天尤为重要,那就是你自己的能力。比方说造一间树屋吧。你可以造一个带活板门的树屋,这样实用而稳固。不过这样一间仅为坚固实用而造的朴素树屋,和一间为了外观漂亮而巧用树木特点来精心雕琢的树屋比起来,人人都看得出来两者间的差别。造树屋可是一种将艺术和工程融合起来的活儿。编程也是如此,也正是因为这个原因,编程才得以成为一件既有魅力又有价值的活儿。编程时,程序员往往优先考虑的是趣味性、美观性及震撼力,而非实用性。

    在代码的世界里,林纳斯就是一个诗人!