的机器码或者说二进制系统相比,进步非常有限。汇编语言相当浪费时间, 只为一台机器写命令就要费九牛二虎之力,然后还必须校正由此所产生的 大批错误。在这种混乱拖沓中往往会丢失程序本来的目标。 Fortran:第一门高级计算机语言 1953年12月,巴科斯向当时他在IBw的老板卡斯伯特赫德(Cuthbert Hurd) 提交了一份备忘录,建议为IB训704机设计一种编程语言(该机器当时已经具备 浮点运算能力)。这个项目后来被称为“公式翻译”,也就是Fortran。它的目标 非常明确。 这种语言只是为了大幅度缩短编程的时间。我并没有想过会在别的机 器上使用它,当时也几乎没有什么别的机器 但首先,巴科斯需要面对时任BW公司顾问的冯·诺依曼的强烈反对。 他并不认为编程存在多大的问题。我认为他当时反对的主要理由之一 是,在浮点运算中你很难知道自己会得到什么。而如果保持定点(6x( poit),你起码在出现问题时知道问题出在哪里。但是他没有考虑到编程 成本的问题。他认为Fortran简直就是不切实际、白费力气。 最终赫德还是批准了这项计划,冯·诺依曼也不再坚持。巴科斯招募的团队 兼收并蓄、不拘一格,既有经验丰富的程序员,也有初出茅庐的数学系毕业生。 1954年秋天,他的程序研究小组己经有了一个清晰的目标:为IB驯704打造一款 能让编程更加容易的语言。 正如他们所见,设计语言并不是最困难的部分。真正的挑战在于如何翻译语 言,让机器能够直接理解。进行这项翻译任务的程序被称为“编译器”(compiler)。 今天的大学生可以在一学期之内就设计并实现出一个新的语言编译器,但在当时, 巴科斯和他的团队缺少这种算法。尤其是对编译器的核心部分“语法分析器 (parser)的设计,他们一直止步不前。 计算机的语法分析和我们在初中学过的语句分析很类似(可能大部分人一毕 业就都丢在脑后了)。在语句分析中,我们需要找出不同部分之间的关系,例如限 定词、名词、动词、形容词和副词,然后用树形结构图表现出来(参见图1-1)
句示 图1-1分析 个英语句子 名词短语 对于编译器而言,则是由语法分新器先出树形结构图,再将“高级语言” (人类易于理解的语言)翻译戚机器璃言”,以删系列指令的形式直接输入到计 算机的电路中(不同模式的计算机鞋往支持不同的指令,这也是Windows系统的 计算机上不能运行Mac程序的原因atlete 机器语言程序的效率取决于设计人员使用那些存储速度高但存储时间短的寄 存器(register)的效率。现代计算机最少有l6个寄存器,有些则达到几千个。 与寄存器相比,随机存取存储器RAM(Random Access Memory)可以储存数百万 字节的海量信息,但由于其存储速度较慢,绝大部分计算行为仍然发生在寄存器 中。 比如说,(A+B)/C这样一个数学表达式可能会被翻译成以下指令序列: (1)复制A的值到寄存器1 (②)复制B的值到寄存器2 (3)复制C的值到寄存器3 (④)将寄存器1和寄存器2的值相加,并将结果放入寄存器1 (⑤)用寄存器3除寄存器1的值,并将结果放入寄存器1 在这个例子中,算术运算需要将数据放入寄存器中(有些机器不需要将数据 放入寄存器,但相应的运算也会慢很多)。如果在下一步运算中,除了变量A、B、 C外还需要D和E,那么编译器就要决定是将D和E的值放入新的寄存器4和5, 还是再次使用之前的1、2和3。这个决定又取决于A、B和C将何时被再次用到 以及其他很多因素。这个问题非常复杂,至今也尚未完全得到解决。巴科斯和他 的团队属于首批寻求合理方案的人。 而最大的挑战在于Fortran的新功能:D0循环语句。循环语句能让程序员更 加方便地执行重复性计算。比如说以下指令序列: ●D013J=1,100 C[J]=A[J]+B[J刀 13 CONTINUE
该指令将A的第一个元素和B的第一个元素相加,得到C的第一个元素,然 后将A的第二个元素和B的第二个元素相加,得到C的第二个元素,依次类推。 循环的贵族发明者 巴科斯和其他20世纪50年代的从业计算机科学家们可能不知道的是,循环 这个概念早在100多年前就已经诞生了。1833年,诗人拜伦勋爵的女儿奥古斯 塔·爱达“遇到了查尔斯·巴贝奇,当时他正在设计一种名为“分析机” (Analytical Engine)的机械式计算机器。爱达在8岁时就展现了极佳的数学天 赋,是当时极少数能够理解巴贝奇高瞻远瞩思想的人之一。二人展开了维多利 亚式的终身合作关系,这也让爱达成为世界上当之无愧的第一位计算机程序员。 在为分析机设计程序的过程中,爱达根据需要提出了循环和子程序的概念。 爱达整理出了一篇描述分析机的笔记,但拒绝以自己的名字发表,因为她 认为女性不应当撰写科学论文。在巴贝奇和她的丈夫洛夫莱斯伯爵(the Earl of Lovelace)的敦促下,她才同意用自己的姓名缩写A.A.L署名。爱达的一生以悲 剧结束:她变成了一个赌徒、酒鬼、瘾君子,最后死于癌症,享年36岁。完全 是拜伦笔下的那种不幸结局 要想有效地编译D0语句,需要用到一种特殊的“变址寄存器”(inde register),Fortran最初是为了IB704设计的,而IBW704上只有3个变址寄 存器,因此属于非常宝贵的资源。 哈伦海尔里克一发明0语句,我们就知道会有问题一如何实现? 我们只有3个变址存储器,但却需要面对许多下标(subscript)。(上例 中的J就是一个下标,较复杂的程序可能会包含20个以上的下标。) 在程序里,我们很难去判断哪些信息应该使用哪一个变址存储器。如 果只用常规方法,得到的代码会很糟糕。我们明白必须去分析代码出现的 频率以及其他种种因素。 计著作《分析机摄论m 》,地被公认为是世界上第一位计算机程序员。1980年美国国防部开发的