1010 程序是怎么来的
第 3 站 1947 — 1960

造一个翻译官

机器只懂数字,人只擅长想法,中间隔着一道大坑。 汇编器先把好念的短名字变成数字,编译器再把接近人话的语言变成数字。 而翻译官自己也是程序——这句话马上会把我们带进一个很有意思的坑。

先感受一下“没有翻译官”的痛

假设机器的一条指令是 8 位:前 4 位表示“干什么”,后 4 位表示“对哪个位置干”。 那么“把一个数加 4,然后打印出来”,在机器里就是这样的数字:

9 03 A 04 7 00 0 00

你得背下来:9 是“装一个数进来”,A 是“加上一个数”,7 是“打印”,0 是“停机”。 数字和含义之间没有任何提示,写错一位,程序就跑到别的地方去了。

问题的本质

人的脑子不擅长记编号,擅长记名字。那能不能让机器来查表——我们写名字,它翻成数字? 能。这就是翻译官诞生的原因。

第一步:给数字起名字 —— 汇编器

时间线上有两个名字值得记住:

收益有多大?翻译这件苦活只干一次——造出汇编器以后,每天写程序都省力。 这也是编程史上第一个“磨刀不误砍柴工”的决定。

Grace Hopper 海军准将。她做的 A-0 系统让机器自己去查表、翻译程序,compiler(编译器)这个词由她推广开。
Grace Hopper 海军准将。她做的 A-0 系统让机器自己去查表、翻译程序,compiler(编译器)这个词由她推广开。图片:James S. Davis / 美国海军 · 公有领域 · Wikimedia Commons

第二步:让机器读人话 —— 编译器

汇编语言还是一条对一条的,长得跟机器指令很像。人们想要的是直接写:

A = 3 + 4

1957 年,FORTRAN(FORmula TRANslation,公式翻译)在 IBM 704 上诞生,John Backus 的团队为它工作了大约六年。

当时很多专家并不相信机器能翻译出好代码,认为编译出来的程序一定比人手写的汇编慢一大截。 结果 FORTRAN 编译出来的代码几乎和手写汇编一样快,还会做优化。 “你可以写得像人话,跑得像手写”——编译器的信用,就是从这一刻建立起来的。

接着语言一个接一个出现:

IBM 704 的磁芯内存(米兰国家科技博物馆藏)。1957 年,FORTRAN 就是在这台机器上诞生的。
IBM 704 的磁芯内存(米兰国家科技博物馆藏)。1957 年,FORTRAN 就是在这台机器上诞生的。图片:IBM Italia(米兰国家科技博物馆) · CC BY-SA 4.0 · Wikimedia Commons

编译器 和 解释器,有什么不同?

于是有了一座“一层叠一层”的塔

电路与晶体管:只认“有电 / 没电”(1 / 0) 机器码:一串数字,CPU 直接执行 汇编语言 + 汇编器:给数字起名字 C 语言 + C 编译器 你写的程序 ← 你在这里 ← 每一层都由下面 一层来解释 ← 尽头是物理
编程语言的塔。每一层都踩在下面一层的肩膀上:Python 是用 C 写的,C 编译器吐出汇编,汇编器吐出机器码,机器码是电路能认的电压。
注意塔的每一层

塔的每一层都是程序,而这些程序又是用塔下面的一层写出来的。 那么问题来了:最下面那一层的程序,是谁写的?

想一想

如果第一个汇编器是用汇编语言写的,会出什么事? (提示:你得先有一个汇编器,才能把汇编器汇编出来。) 这个死循环有一个漂亮的名字,也有好几种破解办法——下一站见。

小结

翻译官把写程序的成本降低了几百倍:人只写想法,机器负责把它变成数字。 但它顺手留下了一个难题——翻译官自己也得有人写。 这个难题的名字,叫自举。