理论教育 编译器:提升计算机实用性的神奇工具

编译器:提升计算机实用性的神奇工具

时间:2023-07-16 理论教育 版权反馈
【摘要】:开始使语言能编程的东西被称为编译器。编译器的故事开始于名叫格雷丝·霍珀的女性。但也必须提及一个核心:霍珀所述的“编译器”创意涉及利益权衡。霍珀没有气馁,她在业余时间写下了第一个编译器。而其他人乐于知道编译器能在多大程度上帮助他们更清晰地思考。但如果一台计算机可以运行编译器,电脑也可以运行任何使用它的程序。电脑因为有了编译器而更加实用。

编译器:提升计算机实用性的神奇工具

1,0,0,0,1,0,1,1。0,1,1……

这就是电脑的语言。电脑所做的每一件聪明的事情——打电话、搜索数据库、玩游戏——都可以归结到1和0。听起来不可思议,实际上半导体芯片上的微小晶体管要么有电流要么没有电流通过。0或1仅表示当前是关闭还是开启。

幸运的是,我们不需要以0和1这样的方式对计算机进行编程。设想一下如果这么做将是多么困难。比如,Microsoft Windows(微软的操作系统)在我的硬盘驱动器上占用了20G的空间,这是1700亿个1和0。如果打印出来,A4纸堆叠的高度是4千米。现在想象一下你必须通过这些页面,手动设置每个晶体管。我们或许会轻视这样操作的烦琐性:晶体管尺寸只有几十亿分之一米,如果翻转每个开关需要一秒钟,安装Windows需要5000年!

早期的计算机真的需要像这样编程。比如自动序列控制计算器,后来被称为哈佛马克1号。它由轮、轴、齿轮和开关串联而成,长度为15米、高度为2.5米。它含有530英里(852.95千米)长的电线。这些电线按着一卷穿孔的纸带(如同自动演奏的钢琴)的指令缠绕。如果要计算一个新的方程式,你必须弄清楚哪些开关应该是开或关,哪些电线应该插在哪里。然后你必须翻转所有的开关,插上所有的电线,并在纸带上打上所有的孔。如何对它们进行编程也是数学天才绞尽脑汁才能应对的挑战;同时这也是乏味、重复、容易出错的体力劳动。

哈佛马克1号诞生40年后,像Commodore 64(康懋达64)这样更简洁、对用户更友好的机器正在进入学校。如果你与我年龄相仿,你可能会记得童年时刻打的这些字:

10 print ‘hello world’

20 goto 10

而且,看!“hello world”将以短粗的字体、低分辨率的文本填满整个屏幕。你已经在电脑里植入了能识别、肉眼可视的词汇——并且电脑也已经理解了。这似乎是一个小小的奇迹。如果你问为什么电脑自哈佛马克1号以来取得了这么大的进步,原因之一就是组件越来越多。但是,如果程序员无法用类似人类的语言编写Windows等软件,并将其转化成0和1、有电流或无电流,很难想象电脑能有如此进步。

开始使语言能编程的东西被称为编译器。编译器的故事开始于名叫格雷丝·霍珀(Grace Hopper)的女性。

现在有很多如何让更多女性投身于技术行业的讨论。1906年,格雷丝出生时,职业市场上没有多少人关心两性平等。幸运的是,格雷丝遇到了一个好父亲——人寿保险公司的经理,他并不认为女儿应该比儿子接受少得多的教育。格雷丝上了一所好学校,数学成绩非常优异。由于她的祖父是海军少将,她的童年梦想是加入海军,但女孩不准在海军服役。她只好成为一名教授。

1941年,日本偷袭珍珠港将美国拖入第二次世界大战,才能优异的男性都被调走了,海军开始征召妇女,格雷丝立即报名加入海军。(www.daowen.com)

如果你想知道海军拥有数学家有什么用处,那你就想想如何瞄准导弹吧。你应该在什么角度和方向上射击?当然答案是取决于许多因素:目标的远近、空气温度和湿度、风速和风向。所涉及的计算并不复杂,但是对于人类(有纸和笔的人)这个“计算器”来说,计算过程很费时(也许有一个更快的方式)。作为一名海军中尉(初级军衔),霍珀于1944年毕业于海军学校,当时海军对哈佛大学霍华德·艾肯设计的哈佛马克1号很感兴趣,虽然很笨拙,但海军看好它的潜力,于是派遣霍珀协助艾肯。

艾肯不乐意有一名女性加入队伍,但霍珀很快给他留下了深刻的印象,他要求她写操作手册。操作手册所涉及的内容应该包括大量的试验和错误。哈佛马克1号多半会在启动之后很快停止,并且没有人性化的错误消息。有一次由于飞蛾飞进机器,随即现代术语“调试”(debugging)也产生了。通常错误只是个比喻义——一个开关错误地翻转,纸带中也有错误的钻孔。检测工作既辛苦又很乏味。

霍珀和她的同事开始用笔记本记录经过验证可重复使用的代码。到1951年,电脑已经进步到足够存储这些数据块——在自己的内存系统中它们被称为“子程序”。然后,霍珀在一家名叫雷明顿·兰德(Remington Rand)的公司工作。她试图说服雇主让程序员用熟悉的词汇来调用这些子程序——比如说“从付款中扣除所得税”,以替代像霍珀现在做的那样,试图用八进制代码或各种符号来书写程序。

霍珀后来声称:“由于他们不像我一样那么懒惰,没有人比我更早考虑这种事情。”其实这只是自嘲——她工作之卖力在圈内人人皆知。但也必须提及一个核心:霍珀所述的“编译器”创意涉及利益权衡。它使编程更快,但是由此产生的程序会运行得更慢。这就是为什么雷明顿·兰德公司不感兴趣。每个客户对全新计算机都提一些定制要求。雷明顿·兰德公司有理由认为公司的专家将尽可能高效地对数据进行编程。

霍珀没有气馁,她在业余时间写下了第一个编译器。而其他人乐于知道编译器能在多大程度上帮助他们更清晰地思考。霍珀的一位客户——名叫卡尔·哈默的工程师令她印象深刻,他使用编译器来解决他的同事们几个月来一直在努力解答的方程式——他写了20行代码,并在一天之内解决了这个问题。美国各地志趣相投的程序员开始发送霍珀的新代码块;她将代码块添加到下一个版本的库中。实际上,她正独自开发开源软件。

霍珀的编译器演变成了第一个编程语言——COBOL;更为重要的是,它为区分现今硬件和软件奠定了基础。使用像哈佛马克1号这种类型的机器,软件即是硬件;没有交换器也可以在其他机器上工作,并且连接方式完全不同。但如果一台计算机可以运行编译器,电脑也可以运行任何使用它的程序。

因此,越来越多的抽象层将人类程序员与物理芯片的实体分开。每个人都沿着霍珀所意识到的方向实施进一步的行动:将程序员的脑力从开关和电线中解脱出来,用来思考概念和算法

霍珀对同事们为何抵制实施她的想法有自己的看法,这不是因为他们更在意让程序运行得更快,而是他们乐于享受自己的超乎寻常的声望:唯一能代表刚刚购买电脑的凡夫俗子与神一般的电脑交流的人群。霍珀称他们为“大祭司”。

霍珀认为任何人都应该能够编程,而现在任何人都可以。电脑因为有了编译器而更加实用。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈