首页 >> 计算机科学 >> 文章

我们的旅程从世界花园瑞士开始,1958年5月27日,苏黎世过完了六鸣节,到处春暖花开。就在4年前的这个季节,图灵离开了人间。

这一天,一场8个人的讨论会将在苏黎世召开,没有花,没有酒,连个专门的会议名称都没有。会议桌的一边,是美国计算机学会(ACM)的4名代表,另 一边是德国应用数学和力学学会(GAMM)的4名代表,索性把地点和双方名称连起来,就叫苏黎世ACM-GAMM会议。后来的历史将会证明,这场毫不隆 重、甚至不太圆满的会议,改变了此后的计算机科学,特别是对于1922年成立的GAMM来说,这场会议几乎成了它唯一的光辉事迹。8名代表陆续抵达了苏黎世,他们将要在此讨论,规划一种新型的编程语言,叫作国际代数语言(IAL)。

在电子计算机刚刚出现时,想让它干活十分不容易,关键的问题就在于,计算机听不懂人类语言。既然没法让计算机说人话,人们只好使用机器语言跟它们沟通。

左手是电线,右手是开关,这就是最早的机器语言(图为1946年的ENIAC计算机)。程序员先在纸上把程序设计好,然后进行持续数周的扳开关和接 电线的工作,读者如果做过数字电路的课程实验,就能体会到那是怎样的麻烦,万一哪根儿线断了,排查起来那就是恶梦的样板。后来,程序员们有了新方法,把程 序设计成打孔卡片(有孔没孔就是二进制),于是编程的主要工作变成了打孔,大家要是有兴趣,把自己身份证号码转成二进制,打在纸条上,看看是什么滋味。打 一个数尚属不易,打一个程序就不难想象了。再后来,冯诺伊曼提出的存储程序实现了,人们把程序像数据一样保存在机器里,随时调用,编程从这时起才正式变成 脑力劳动。但别高兴得太早,虽然不用接电线和打孔,但编程还是要用0101001111,就像《麦兜的故事》里面麦太太说的,鸡包纸包纸包鸡包鸡包纸包再 包鸡鸡鸡。这种程序,编的时候只有作者和上帝能看懂,过一阵子之后,恐怕只有上帝能看懂了。随后,人们把一些常用的指令用一些“助记符”来代替,有了 ADD、MOV这样的写法,形成了汇编语言,但本质上跟鸡包纸包鸡还是同一码事。

1953年,IBM公司的巴科斯(John Backus)再也忍不下去了,这哪里是编程,这不跟受刑一样么。他揭竿而起上书董事长,要为IBM704系列计算机开发一种新型编程语言。号称计算机之 父的冯诺伊曼当时是IBM的顾问,他坚决认为这个提议十分不靠谱,但也许是应了有心人天不负,董事长Hurd同意了这个计划。

巴科斯1924年出生在美国费城,他的父亲是一家火药公司的员工。巴科斯小时候不爱读书,勉勉强强混了个中学毕业,进入弗吉尼亚大学学习化学,成绩 依然很不好。二战爆发后,巴科斯参加了美国陆军,在Haverford学院(这可不是哈佛)接受医疗训练,准备治病救人,结果别人没救成,倒是发现自己长 了一个脑瘤,于是接受了手术。后来,巴科斯打算当一名无线电技术员,在训练过程中,突然对数学产生了极大的兴趣,于是进入哥伦比亚大学学习数学,于 1949年获得硕士学位,进入了IBM公司工作。

巴科斯开发新语言的提议得到了批准后,立即组建了一个开发小组,并担任组长,主持开发工作。1957年,第一套Fortran语言诞生了,尽管呱呱 坠地时哭声不响,第一次演示就出了编译错误,但还是坚强地活了下来。本文不是编程教材,对于Fortran的具体细节,就不过多叙述了,但是我们要记住这 个名字,因为它是非常耀眼的。Fortran是世界上第一个被正式应用的高级语言,所谓高级语言,是说它的语法更接近人类语言,而不是鸡包纸包鸡。从此以 后,程序员不必再背那些枯燥的机器码,只需用“IF (x > 0) THEN x = 0”这样的简单易懂的方式编程,可想而之它的推出让人多么兴奋。在电影《硅谷海盗》中,微软CEO鲍尔默讽刺说,要想激起比尔盖茨的性欲,必须这样叫 床:Oh!Fortran~Oh~For~~Tran~。直到如今,经过多年改进的Fortran仍然在计算机界占有一席之地,不知道知天命之年的 Fortran是否会记恨,当年冯诺伊曼差点把它掐死在摇篮里,戏剧的是,就在第一套Fortran诞生之前两个月,冯诺伊曼因癌症去世了。关于Fortran就先说到这里,尽管它光辉夺目,但对于本文来说,它只是配角。在上世纪 50年代末,编程语言的矛盾已经白热化,并非Fortran一己能够力挽狂澜。况且Fortran本身还有一个严重缺陷,它为IBM704而生,依赖特定 的机器型号,很难移植到别的机器上。革命尚未成功,同志仍需努力,在这个时候,ACM和GAMM都对编程语言有一些想法,于是他们决定坐在一起讨论讨论, 规划一种更好的语言。苏黎世讨论会就是在这样的背景下召开的。

Fortran语言之父巴科斯这回又没闲着,作为ACM的代表之一,他也来到了苏黎世,想再次参与锻造新刀。这次制定语言,主要有两个原则,第一点 毫无疑问,要使它更容易被人类理解,这是一直以来的革命方针;第二点,是要弥补Fortran的一些不足,主要是要具有通用性,兼容不同型号的机器。

讨论会开始了。由于只有8人,不必拘泥形式,再加上诸位代表都是理工背景,说起话来锱铢必较,这场讨论,注定激烈无比。

为了描述即将诞生的国际代数语言,巴科斯用他带着重重鼻音的费城口音,首先提出了一套用来描述语言的语言,称为巴科斯范式。我们知道,学英语的时 候,有一些“主+系+表”之类的句套子,对学习英语有很大帮助。对于计算机语言,也需要这样的句套子来描述它,巴科斯范式就是为了描述IAL而提出的。当 然这个范式并非这么简单,它也能描述其它编程语言,甚至一部分自然语言,是一套非常了不起的设计。

有了巴科斯范式,8名代表你一言我一语,将自己在设计语言方面的经验倾囊而出,开始制定国际代数语言的标准。正所谓众口难调,每个人都对自己心中的 新语言有着自己的观点,大家很快就陷入了争执,谁也不让谁,抢着用飞快的语速反驳对方,屋里的空气陷入了紧张,一个接一个的“IAL”、“IAL”、 “IAL”飘在空中,不停地游荡。这时,ACM小组的主席艾伦佩利(Alan Perlis)突然瞪着圆圆的眼睛大声说:停!你们难道没发现“IAL”这个词很绕嘴吗?

佩利比巴科斯大两岁,1922年出生于美国匹兹堡,与巴科斯的家乡费城同在宾夕法尼亚州,俩人也算是半个老乡。佩利虽然出生在愚人节,但他一点儿也 不笨,比起巴科斯,佩利可算是年轻有为。无巧不成书,佩利初入大学时也是化学专业,他在21岁时,获得了卡内基理工学院的化学学士学位,这个学院就是现在 美国计算机专业排名第一的著名学府,卡内基梅隆大学。与巴科斯巧合的是,刚刚走出大学校园的佩利,看到满街都是征兵海报,看到山姆大叔紧盯着他说“I want you”,看到珍珠港事件后神经绷紧的美国,也选择了参军。更加惊人的巧合是,佩利也是在服役期间突然对数学产生了强烈兴趣,并转而攻读之。1950年, 他在麻省理工学院获得了博士学位。两年后他来到普渡大学,出任普渡大学计算中心首任主任,在普渡安装了IBM CPC计算机,并为其设计了一个叫作IT(Internal Translator)的编程语言。过了四年,这个毕业才6年的34岁年轻人,又一跃当上了卡内基理工学院第一任计算机科学系主任,为卡耐基配置了IBM 650,顺便把IT语言移植到650上。这些工作使佩利在程序语言的设计方面,有了许多经验和体会,所以在ACM成立这个程序设计语言委员会时,佩里坐上 了主席的位置。诸位读者,假如这个惊人的成长步伐让您吃惊,那您可要好好地适应一下了,在我们这个系列的文章中,比比皆是这样的天才人物,会让您脊背发 凉。

言归正传,我们刚才说到,佩利在讨论时,认为“IAL”这个词很绕嘴。假如他懂一点中文,没准还会发现,这个词一旦读快起来,很像汉语中的“哎 哟”。佩利扶了一下眼镜,继续说道:我想不明白为什么要起这么个名字,不但很绕嘴,而且狂妄自大,不就是个语言么,何必扯虎皮做大旗,叫什么“国际语 言”?佩利此言并无它意,然而他一心只顾着说,没有注意到身边的巴科斯此时已是脸红耳热,巴科斯所在的公司,早在1924年还在卖人口统计卡片的时候,就 “狂妄自大”地改名叫作国际商用机器公司。

尽管佩利认为IAL这个名字既绕嘴又狂妄,但其他代表却觉得这个名字好听又大气,再说这又不是什么要紧的事,何必在这上面浪费口舌。这件事情仿佛成 了插曲,直到五天后会议结束时,新语言的名字仍然是IAL,并写进了会议总结。也许这些代表怎么也没预料到,佩利在一年之后,还是执意改掉了这个名字,他 们更没预料到在多年之后,新的名称将以烫金大字铭刻在计算机科学的历史上,而IAL却鲜为人知。

取代“IAL”的新名字,叫作ALGOL。这是ALGOrithmic Language的缩写,即算法语言。后来Bauer强调说,ALGOL这个名字,是Bottenbruch最先提出的,这两位都是苏黎世讨论会的德国代表。

除了名字没有达成共识之外,最终大家对新语言的句法也没能统一意见,苏黎世ACM-GAMM会议带着许多未尽的争议,在1958年5月1日草草落下 了帷幕。然而,对于这些科学家来说,事实胜于一切雄辩,绝不能陷入驴子的困境。会议结束后,他们立即投入到实现新语言的工作中——既然分歧不能解决,那就 干脆两种都做出来再说。他们成立了一个ZMMD小组,旨在开发一种ALGOL语言的编译器,ZMMD这个名称的由来,是其几位组员以及他们使用的一台 Z22计算机分别所在的四个城市的开头字母。

请计算机专业的读者们在此稍息片刻,容我给其它专业的读者稍微解释一下什么是编译器。前面我们说过,因为计算机没法理解人类语言,我们需要用机器指 令来编写程序,我们现在有了高级编程语言,不必使用麻烦的机器指令,这并不是因为计算机学会了人类语言,而是因为我们请了一位翻译。简单地说,它能够把高 级语言翻译成机器指令,既使我们不用再做那些机械劳动,也能满足机器们的冰冷胃口,这个翻译就是编译器,它本身也是一套程序。好了,大家回回神,继续我们 的故事。

就在不久之后的1958年年底,欧洲的冬天到来了,世界各地的游客纷纷来到壮丽的阿尔卑斯山,体验激动人心的滑雪运动。就在这个冬天,在ZMMD小 组的努力下,第一套ALGOL语言及其编译器成功地开发出来了,按照年份,命名为ALGOL58。好玩的是,ALGOL58有三种不同版本的语法,在实际 编程和书面表达时写法是不同的,有点像汉语分白话文和文言文,其差异之大,连小数点的写法都不一样。由于巴科斯的参与,ALGOL58既继承了 Fortran的许多优点,又弥补了Fortran的许多不足,一度使Fortran的地位面临着严竣的挑战。这里我们不详细介绍ALGOL58的样子, 它的生命实在太短暂,很快就退出了历史舞台。因为,就在一年多以后,ALGOL58的创造者,包括巴科斯和佩利等,对这种新语言有了许多新的体会和感受。 1960年1 月,他们召集了其他几位参与ALGOL工作的计算机科学家,来到了浪漫之都巴黎,再次召开了一场关于ALGOL语言的研讨会。

(未完待续)

0
为您推荐

40 Responses to “近看图灵碗 (一. 从苏黎世到巴黎) (上)”

  1. Gavin说道:

    照这个水准写下去,松鼠会的又一本书就有着落了

  2. 无知的水獭说道:

    沙发!!

  3. tarazed说道:

    精彩!

  4. Metaverse说道:

    文中有好几个地方多了些莫名其妙的空格……

  5. 说道:

    可以

  6. Cedrick说道:

    必读这篇连载,写得有意思

  7. 变形机器猫说道:

    填坑万岁。
    望早日填完……

  8. Spillage说道:

    计算计学会
    捉个虫子,是不是计算机学会?在第二段的第二行...

  9. unigloria说道:

    苏椰行文,颇有小说家之风,再次在看得俺血脉贲张之际……嘎然而止

    挠墙ing~

    大概是因为不懂计算机最基础的知识,我到现在还是始终弄不懂机器是如何读懂二进制的,如果二进制由打孔不打孔而来,进而表示开关开合,然后几开几合就能让机器明白我想算让它做某件特定的事么?(请不要鄙视俺:P)

    怨念ing~

    • 休息的风说道:

      同感同感。
      同样挠墙ing~
      要不也跟看美剧一样,等全集(一季)都出了再看?省的抓耳挠腮的。

    • 苏椰说道:

      你想让机器干啥,你举个例子,我给你讲怎样用二进制来实现~

      • unigloria说道:

        由最简单的来说,比方说让计算机在一万个类似数据中作一下特定数据的搜索,search这个指令如何转化为二进制,又如何让计算机执行呢?

        • 苏椰说道:

          这种搜索过程是由许多基本动作组成的,这里面有循环,有跳转,有比较,如果从最底层的电路来讲这个过程,那就篇幅太长了。

          你可以换个规模小一些的例子,或者推荐你读一下《编码的奥秘》这本书,它非常通俗易懂,是计算机原理方面的非常好的科普读物。

        • 苏椰说道:

          我们拿搜索中的一个环节来说吧,如何判断两个数字是否相等?

          数字转换成二进制之后,每一位要么是1,要么是0,我们用高电位和低电位来表示。
          这时,使用一个“异或门”电路,这种电路的特点是:
          1、如果输入两个高电位,则输出低电位
          2、如果输入两个低电位,也输出低电位
          3、如果输入一高一低,则输出高电位
          好了,根据这个特点,我们依此把两个数字的每一位输入到异或门中(1就给电,0就不给电),如果该位相等,则输出低电位,如果不相等,就输出高电位。
          假如要比较的是8位数,那对每一位分别比较,就得到了8个输出。如果这两个数相等,应该得到8个“0”,否则就不相等。
          那么就简单啦,把输出的这8个信号并联起来(专业点说,是输入“或门”),也就是说,只要有一个高电位,那最终就是高电位,全都是低电位,最终就是低电位。
          好了,最后一个信号,就是我们要的结果,高电位就说明不相等,低电位就说明相等。

          你用要找的数,跟一大堆数中的每一个做这种比较,得到低电位,就是找到了。

          • unigloria说道:

            详细又清晰,多谢苏椰的耐心和知识。内牛满面感谢ing~(我喜欢这个词的可爱和人情,希望在这个科学网站上使用变字词不会被人鄙视:P)

            决定找这本书来看看了~~~

    • Adreaman说道:

      一个二进制只能表示开合两种状态,两个二进制就可以表示4种状态,一百个二进制就可以表示2的一百次方种状态。关键是,在CPU速度趋于无穷快,存储器空间趋于无穷大的前提下,这些可表现和处理的状态是趋于无穷多的。将这些“状态”送给不同的外设(例如打印机、显示器、声卡),这些状态就可以转变成一些事件或一些动作,你希望计算机做的事情也无外乎这些事件和动作(因为它是“无穷”的)。这是从计算机向外输出,而外设从外部将信息读入计算机就是反向动作。

    • lalunasun煮方便面水加多了说道:

      我想说,有个词,叫作”戛然而止“

    • Lenin说道:

      找本《汇编语言基础》或者《计算机结构基础》看看,电子计算机其实就是一打数字电路。靠的是几十个个晶体管堆起来,形成逻辑门。几百个逻辑门堆起来形成一个八位加法运算器。一般来说,简单的CPU只能做为数不多的运算,每个指令只是简单的寄存器、加减运算。靠的是数量巨大的晶体管读懂指令码。

  10. poulain说道:

    在我们学fortran的那年,John Backus去世了。然后我们专业从下一届开始改学C

    • MarsV说道:

      轻轻的
      我走了
      正如我轻轻的来
      挥一挥衣袖
      把Fortran也一起带走

  11. mg说道:

    通俗的语言,流畅的叙述,耐心的讲解,没有炫耀和张扬的感觉。外行人看得都很舒服。赞!

  12. lalunasun煮方便面水加多了说道:

    啊,苏椰啊,有关计算机的东西,我竟然看懂了!

  13. maxwell说道:

    在次品评,别有一番滋味。
    师傅嘿,这次加了图片,,更加图文并茂了。!~

  14. 流量计说道:

    等待更新!

  15. 小bug说道:

    计算机专业读者飘过,学习了不少历史……

  16. Isaac说道:

    1958年5月27日,苏黎世过完了六鸣节,到处春暖花开。就在4年前的这个季节,图灵离开了人间。这一天,一场8个人的讨论会将在苏黎世召开。

    除了名字没有达成共识之外,最终大家对新语言的句法也没能统一意见,苏黎世ACM-GAMM会议带着许多未尽的争议,在1958年5月1日草草落下 了帷幕。

  17. [...] 近看图灵碗 (一. 从苏黎世到巴黎) (上) [...]

  18. qylee说道:

    怎么看不到图片啊?

  19. 简简单单说道:

    写的真好,我喜欢,呵呵。一定要推荐给学生看看。

Leave a Reply