2.1 程序设计语言诞生的历史
在第 1 章中我们讲到,通过比较旧事物和新事物可以加深理解。其实,了解旧事物还有另外一个好处。
很多事物都是在过去的基础上,通过不断积累创造出来的。新事物是在充分了解了旧事物的基础上发展起来的。现在那些看似理所当然的事物在过去可能不为世人所知。因此,对于初学者来说,学会从前人的视角来考虑问题,是十分有益的。
那么,我们赶紧来回顾一下历史吧。程序设计语言是如何产生的呢?创造程序设计语言的目的是什么呢?过去的语言和现今的语言有何共通点呢?
程序设计语言的产生是为了让人们的生活、工作更加便捷。为了说明这一点,我们先来看一下程序设计语言诞生的历史,以及语言设计者的设计思想。
连接电缆
大约半世纪以前,程序设计是个什么概念呢?
1946 年,世界上第一台电子计算机——ENIAC(埃尼阿克,Electronic Numerical Integrator and Computer)问世。它可以改变计算方式,即可以更改程序。用现在的话来讲,它是一台可编程计算机。但是其编程方法和如今大家熟知的程序设计大相径庭。
ENIAC 是一台超大型的计算机,使用了 17 468 个真空管,长达 24 米。试想一下,在某小学的游泳池内,沿 25 米长的泳道,摆放上布满真空管的机械装置,这是怎样的一幅场景!
当时的程序设计就是指把这台计算机不同的端口通过电缆连接起来(图 2.1)。每次更改程序时都要重新调整电缆连接方式,实在费劲。有没有方便一点的方式呢?

※ U.S. Army Research Laboratory
图 2.1 ENIAC 的编程场景
程序内置
1949 年,EDSAC(爱达赛克,Electronic Delay Storage Automatic Calculator,电子延迟存储自动计算机)问世。这是一种通过纸带打点的方式来记录和读取数据的计算机(图 2.2)。程序作为数据通过纸带输入。不需要重新连接电缆,只需要让计算机不断读取纸带上的数据就可以更改程序。这样一来,程序的更改变得简单易行。

※ “Puchned tape”by TedColes. 2012 年 1 月 8 日 22 点(日本时间)的最新版。http://en.wikipedia.org/wiki/File:PaperTapes-5and8Hole.jpg
图 2.2 纸带
但是人们要读懂这种程序绝非易事。因为这毕竟只是一种供机器(计算机)阅读的语言,即机器语言。在输入纸带上,每列最多有 5 个孔用来记录数据,其他的小孔用于纸带传送。程序只能通过这 5 个孔表现出来。1
1读者如有兴趣了解 EDSAC 程序和它的执行过程,可以到笔者设计的基于浏览器的 EDSAC 仿 真器上检验一下。http://nhiro.org/learn_language/repos/EDSAC-on-browser/index.html。
FORTRAN 语言问世
直到 1954 年,与大家现在使用的语言类似的程序设计语言才被发明出来。这就是 FORTRAN。2 它的全称是 Formula Translating System(公式翻译系统)。现在,我们常用 X* Y+Z 来表达“X 乘以 Y 再加 Z”。最早实现这一点的就是 FORTRAN。将公式转化为机器语言是 FORTRAN 语言的特点之一。
2这并不是说 FORTRAN 是最早的程序设计语言。哪一种语言最早出现仍然众说纷纭。在此之前就有许多种语言。大多数读者脑海中的程序设计语言应该不是 LISP 语言、FORTH 语言,也不是汇编语言吧。
在那个年代,人们普遍认为只有用机器语言才能写出高效的程序。3实际上,使用 FORTRAN 语言编译出来机器语言,与一个熟练的程序设计者直接手写机器语言相比,效率更低。但因 FORTRAN 语言的可读性强且代码编写量大大减少,它还是俘获了众多用户的心。
3参见 Ravi Sethi 的著作 Programming Languages: Concepts and Constructs。中文版为《程序设计语言:概念和结构(原书第 2 版)》,由机械工业出版社于 2002 年出版,裘宗燕等译。
1979 年,FORTRAN 的设计者 John Backus 说道:我的大部分成果源自我的懒惰 4。因为我不喜欢写程序,所以我设计出了能轻松编写程序 的系统 5。
4“Much of my work has come from being lazy, ”http://www.msnbc.msn.com/id/17704662/.
5“I didn't like writing programs,… I started work on a programming system to make it easier to write programs.”http://www.msnbc.msn.com/id/17704662/.
