那些改变过世界的代码都是怎么写的?

1二进制打孔卡

年份:1725 年

第一批代码

二进制编程的诞生甚至比计算机本身更早。人们认为 Basile Bouchon 是第一个在纸上打孔并借此控制机器的人:1725 年,他发明了一种纺织设备,能够根据送入的打孔纸调整纺织图案。有孔代表“1”,无孔代表“0”。虽然在此之后发生过无数变化,但这种基本的代码构建单元从未改变。—Elena Botella

2第一段实际执行的现代代码

年份: 1948

随着能够运行计算机代码与核毁灭模型的计算设备的出现,冷战军备竞赛也正式拉开帷幕

“电子数字积分器与计算机(ENIAC)”是第一台可编程的电子计算机。其诞生于 1945 年,通过在组件之间配置不同的接线以实现对具体问题的处理。当一项任务(例如加法)完成之后,将有新的脉冲触发下一项操作。几年之后,冯·诺依曼与洛斯阿拉莫斯国家实验室科学家 Nicholas Metropolis 接手 ENIAC,并在计算机上执行了第一条现代代码:在可寻址只读存储器(ENIAC 中的功能表开关)中执行数百条数字指令。他们利用蒙特卡洛技术模拟了新墨西哥州洛斯阿拉莫斯国家实验室正在评估的几种原子弹设计方案,并通过这种方式逐步模拟出一套复杂系统,从而反复规划可能的概率分布结果。冯·诺依曼和 Metropolis 向该实验室的核科学家们发送了 2 万多张打孔卡,上面记录着通过引爆弹头追踪模拟出的中子运动结果。

如今,这批代码的“子子孙孙”仍然运行在洛斯阿拉莫斯国家实验室的计算机当中。——Thomas Haigh,《ENIAC 在行动:现代计算机的诞生与重生( ENIAC in Action: Making and Remaking the Modern Computer)》合著者

3Grace Hopper 编译器

年份: 1952

让计算机获得处理单词的能力

(Wikipedia)

Grace Hopper 当时打算对一台早期计算机进行编程,并决定利用人类语言元素简化编程流程。Hopper 曾在第二次世界大战期间加入美国海军预备队,因此非常清楚军事机构的工作人员都在努力……或者说挣扎着学习理解二进制代码。但如果能够在编程语言中引入英语元素,那么这项工作的难度将大大降低、出错的可能性更小,从而让那些没有数学博士学位的工作人员也能更快上手。

有些人对这一想法嗤之以鼻,但到 1950 年初,她设计出第一款编译器。这是一组指令,能够将人类更易懂的代码形式转换为可供机器直接处理的低级代码。她和她的实验室利用该工具开发出 FLOW-MASTIC,第一种利用这一过程使用英语单词的编程语言。—Molly Olmstead

4《Spacewar!》

年份: 1961

第一款正式发行的电子游戏

(Steve Russell via Bitsavers.org)

1961 年末,一群年轻的麻省理工学院教员、学生及助理人员(其中不少人是当时 Tech Model Railraod 俱乐部的成员)夜以继日地围坐在一台捐赠而来的 DEC PDP-1 计算机面前。PDP-1 计算机代表着非军事计算技术的最高水平,单台售价高达 12 万美元(换算成目前的金额超过 100 万美元),能够支持 18 位字长并使用纸带存储程序。在五个月时间中,这些程序员开发出一款游戏,允许两名玩家控制飞船(其实就是屏幕上的简陋线图)一边躲避屏幕中央恒星的引力干扰,一边展开激烈的太空炮战。

有限的计算容量与存储空间,要求其必须认真管理每一项任务,因此 AGC 必须始终专注于最重要的工作内容。一旦计算量超出承载能力,整个登月计划都将因此失败。为此,项目成员开发出 BAILOUT。当计算机遭遇空间耗尽(或者说「溢出」)风险时,AGC 会触发 BAILOUT 以丢弃重要度相对较低的数据与运算,从而确保核心数据与运算保持正常运行。

当鹰 着陆器接近月球表面时,AGC 在距离月面 3 万英尺处发出了“1202”警 ,遗憾的是阿姆斯特朗以及身处休斯顿宇航中心的控制员们并没有马上察觉。不到 30 秒之后,控制中心的计算机专家们得出结论:AGC 软件仍在按预期方式运行,即放弃低优先级工作并集中资源处理核心负载(整个切换过程很快,因此机组人员无法察觉)。阿姆斯特朗与奥尔德林继续使用由 AGC 提供的宝贵数据,引导登月舱一步步完成着陆。

在阿姆斯特朗上 “鹰 成功着陆”之前,溢出警 总共响了三次,但一切仍然按照预期方式运行。“Bailout”一词原本是指任务未能完成,可在阿波罗 11 项目中却成了人类最高成就的代名词。—Ellen Stofan,史密森尼国家航空航天博物馆主任

8Hello, World!

年份: 1972 或更早

这句短语首次出现在代码当中

Hello, World! 是一种伟大的教学方法。这是一项能够轻松完成的小任务,同时也代表着一种标准,体现出不同编程语言之间的重要差异。此外,这也是高级程序员在安装新环境测试一切是否正常的快速简便方法。(有时候,程序员们也会使用「hello world」运行时间来比较不同语言与环境的速度水平。)也许更重要的是,“Hello, world!”具有一种温暖而柔和的力量,对编程新人有着一种莫名的亲和力。代码拥有无穷威力,而新的世界已经向你张开怀抱。—Chris Noessel,IBM 公司 AI 设计负责人

9空终止字符串

年份:1972

计算技术发展史上最严重的设计错误

(The GNU C reference manual)

1972 年,Dennis Ritchie 做出一个重大决定:在新语言中用一种名为“空终止字符串”表示文本。这个概念早已出现,但他决定将其引入自己的新成果 C 语言当中——而这个决定,给无数编程后继者带来了深远的影响。

编程语言表示一段文本的主要方式有两种:其一是提供固定的显式长度,相当于声明“我只包含 10 个字符,且无法容纳更多字符”;其二是采用空终止结尾——“我包含很多字符,直到出现零字节结尾。”

C 代码中的一类常见错误,就是把一条长字符串复制到某个较短字符串内并导致结尾处溢出,如此一来其邻近数据就会受到破坏。打个比方,这就像是本应在白板上作画,却把颜料涂到了板后的墙面上。

除了导致程序故障之外,攻击者还能够主动通过这类 bug 诱导程序利用经过精心设计的特定数据覆盖某些内容,进而改变程序行为。而这,就是经典的缓冲区溢出攻击。大家听说过的几乎所有安全漏洞,都有着一位共同的“老祖宗”——1988 年的 Morris 蠕虫。

虽然可以在 C 语言中通过认真编码避免此类 bug,但这种语言的设计特性使得此类 bug 极易出现且难以检测。从路由器到“智能”灯泡,虽然几乎每一种现代语言都会刻意避免空终止字符串问题,但 C 与 C++ 仍然统治着整个世界。因此,直到近 30 年之后,我们仍然无法彻底摆脱这个 bug。—Jamie Zawinski,Netscape 开发人者、Mozilla.org 创始人、DNA Lounge 负责人。

那些改变过世界的代码都是怎么写的?

10Telenet

年份:1975

第一个基于数据包交换机制的公共数据 络,当今互联 的主干

11温哥华证券交易所的四舍五入错误

年份:1982

由小数点后取舍引发的“一场血案”

温哥华证券交易所当初本应使用以上代码求取近似值。

1982 年初,温哥华证券交易所发布一项电子股票指数,基准定为 1000 点。在两年之内,其跌到了原始值的一半,但当时股票市场的涨幅相当强劲,因此人们感到大惑不解。一项调查显示,相关代码使用了 floor() 而非 round(),并导致命令中的指数计算存在错误。这条命令执行的是四舍五入运算,而没有按设计预期原样保留三位小数。(当时的数字计算机处理能力有限,因此必须使用四舍五入或者直接舍去等方法。)这意味着如果指数计算结果为 532.7528,那么正确的舍去结果应该是 532.752,而非四舍五入后的 532.753。虽然这种差异看似微小,但经过每天成千上万次计算之后,股指开始出现急剧下跌。最终,这一 bug 在 1983 年 11 月得到解决:在上周末收盘于 500 点左右之后,周一重新开放时公布的指数终于正确超过 1000 点。——Lav Varshney,伊利诺伊大学香槟分校副教授

12Therac-25

年份:1985–1987

事实证明,过度自信是会死人的

头条新闻第一次发布由技术发展导致的事故。《洛杉矶时 》宣称,“过于复杂的现代软件正引发故障率的急剧提升。”一种被多家医疗机构中用于治疗癌症的机器在运行过程中发生爆炸,共波及六名患者,其中至少三人死亡。

调查人员事后发现,这台 Therac-25 设备在编程中存在致命错误。该机器提供低功率与高功率两种照射模式,而高功率模式需要利用金属设备过滤光束。但由于存在软件 bug,在未匹配适当金属设备时,操作人员同样可能意外触发高功率模式。

Therac-25 机型实际上是 Therac-20 的“改进”版本,当时人们认为其软件万无一失,因此不需要额外的安全检查。结果就是,工程师的过度自信引发了惨痛的伤亡事故。—Molly Olmstead

13互联 中继聊天

年份:1988

最早的 络续聊技术

互联 中继聊天(简称 IRC)甚至在大多数人听说“互联 ”这个字眼之前就已经存在。这是一种通过小组频道与他人进行实时聊天的流行技术方案。早期用户能够通过登录共享新闻内容——包括 1991 年媒体集体噤声时,用户借此传播苏联解体的爆炸性消息。当然,这种聊天方式本身也以代码的形式实现:要加入频道,需要输入“/join #[频道名称]”。(如今的 Slack 达人对此应该比较熟悉。)如果用户希望表达一些与自己相关的消息,也可以输入“/ 我太累了”,或者用 * 加“太累了”直接显示自己的名称与“太累了”字段。总而言之,虽然功能非常基础,但对大多数人来说,在线聊天成为他们接触互联 的第一站,也成为后世无数在线会话应用的基础雏形。—April Glaser

14Morris 蠕虫

年份:1988

一场噩梦,让人们意识到互联 已经发展得如此庞大

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年1月23日
下一篇 2020年1月23日

相关推荐