人類歷史上最重要的36個代碼片段(上)

人類世界的運轉已經無法離開軟件。在浩如煙海的軟件代碼當中,哪些對我們起到了關鍵作用呢?

Slate網站邀請了各方人士對那些改變了一切的代碼進行評選,篩選出36個代碼片段。

這裡,我們分為上、中、下三部分與大家一起分享,下面是此次盤點的上部

盤點 | 人類歷史上最重要的36個代碼片段(上)

1、二進制穿孔卡片

年代:1725

第一段代碼二進制編程早在計算機誕生之前就有了。

大家認為Basile Bouchon 是第一個給紙片打孔並用來控制機器的人:1725年,他發明了一種織布機,這種機器可以根據送入的穿孔卡片的指令編織圖案。

打孔的是“1”,沒有打孔是“0”。儘管此後東西發生了很大的變化,但代碼的基本構建塊並沒有改變。— Elena Botella ,Slate

2、執行的第一段現代代碼

年代:1948

既開闢了計算機代碼的使用,也引領了塑造冷戰軍備競賽的核毀滅計算機模型的使用。

ENIAC(電子數字積分計算機)是第一臺可編程的電子計算機。機器於1946年建成,每解決一個新問題都要靠重新連線許多部件來完成。

當一項任務(比如加法)完成時,會用一個脈衝來觸發下一項任務。

但是幾年後,約翰·馮·諾依曼和洛斯阿拉莫斯的科學家Nicholas Metropolis對ENIAC重新進行了接線,讓這臺機器跑出來有史以來在任何計算機上執行的第一段現代代碼:從可尋址只讀存儲器(ENIAC的函數表開關)執行數百條數字指令。

他們模擬了新墨西哥州洛斯阿拉莫斯國家實驗室正在評估的幾種原子彈設計的爆炸情況,用蒙特卡洛技術來模擬一個複雜系統,幾乎是一步步地把可能結果的概率分佈呈現出來。

馮·諾依曼和Metropolis向洛斯阿拉莫斯的核科學家發送了20000多張卡片,跟蹤彈頭引爆後模擬中子的變化情況。直到今天,這段代碼的子孫後代還在洛斯阿拉莫斯那裡發揮作用。—Thomas Haigh

3、Grace Hopper的編譯器

年代:1952

令計算機處理文字成為可能


當Grace Hopper決定通過以人類語言為基礎來簡化整個過程時,她正在對一臺早期計算機進行編程。

二戰期間,Hopper加入了美國海軍預備隊,她知道,像她在部隊的上司一樣,大家都在努力去理解二進制代碼。

而如果編程語言是基於英語的話,那麼這項工作就不會那麼容易出錯,並且對於那些沒有數學博士學位的人來說也更加平易近人了。

一些人對這種想法嗤之以鼻,但1950年代初時,她設計出了一種編譯器,也就是一組可以將更容易理解的代碼轉化為由機器處理的較低級代碼的指令。

通過這一工具,她和她的實驗室開發出了FLOW-MATIC,這是第一種將英語納入該過程的編程語言。——Molly Olmstead,Slate

4、星際飛行(Spacewar)!

年代:1961

發行的第一款視頻遊戲

/ interesting and often changed constants ...mhs, 22, law i 10 / number of hyperspace shotshd1,23, law i 40 / time in hyperspace before breakouthd2, 24, law i 100 / time in hyperspace breakouthd3, 25, law i 200 / time to recharge hyperfield generatorshr1, 26, scl 9s / scale on hyperspatial displacementhr2, 27, scl 4s / scale on hyperspatially induced velocityhur, 30, 40000 / hyperspatial uncertancy

Steve Russell,收集自Bitsavers.org
1961年末,一群年輕的MIT僱員、學生和同事拿到了最近別人捐贈的DEC PDP-1計算機的深夜使用權。

屬於非軍事計算前沿技術的PDP-1售價為12萬美元(按今天計算將超過100萬美元),字長達18位,程序存儲用的是紙帶。

這幫程序員用五個月的時間開發了一個遊戲,裡面是兩名玩家控制著飛船(針和楔形物)進行一對一的太空戰,同時還要避開位於屏幕中心的恆星的引力。

很快,星際飛行!就在早期的“黑客”社區中傳播開來。

後來DEC把它預裝進了每一臺PDP-1裡面,並預裝到核心內存裡面,準備在安裝時進行演示。這個程序對1960年代規模還很小的編碼社區產生了重大影響,並啟發了後面數代的視頻遊戲創作者。

現在它還從模擬者那裡找到自己的存在,並且在計算機歷史博物館的最後一臺可操作PDP-1上還在定期演示。

2018年,遊戲的首席開發者Steve Russell在史密森尼學會上說:“它已有50多年的歷史。沒有未解決的用戶投訴。沒有崩潰報告。而且支持依舊提供。”——Arthur Daemmrich ,導演,勒梅森發明與創新研究中心

5、電子郵件的起源

年代:1965

拜託,這是電子郵件。

CTSS 程序員MAIL手冊頁

1961年,麻省理工學院的黑客開發了一個系統,這個可以讓多個用戶登錄到同一臺計算機上,然後他們開始互相給對方簡短留言。

1965年,一群編碼人員決定開發一個正式的命令系統來發送、接收和顯示這些數字化的信函。

對於“MAIL”這個命令一開始上級是拒絕的,覺得有點輕率,但它的使用卻大行其道,以至於到1971年,麻省理工學院甚至出現了第一條垃圾郵件:一條反越戰的信息。——Clive Thompson

6、警察巡邏算法

年代:1968

現代預測警務和種族定性計算機化的開始

1965年,當林登·約翰遜總統組建總統執法與司法委員會時,他下令該委員會研究如何利用計算機來幫助解決美國的的“犯罪問題”,他和該委員會對這個問題的定性是“城市問題”和“黑人問題”。

這個問題的答案是“警察巡邏算法(Police Beat Algorithm,PBA)”,該算法旨在解決規劃問題,比方說在城市的特定區域需要安排多少名警察巡邏之類的問題。

通過將PBA與犯罪數據庫相結合,警方可以在犯罪實施之前根據種族人口統計數據自動生成嫌犯檔案,並相應部署資源(警察,武器和其他裝備)。

今天的預測警務對黑人和棕色人種監視並定罪的情況相對不成比例。就像PBA的故事提醒我們那樣,這種情況並不是不可預見的技術故障的結果:相反,這是這項技術50年設計的完美體現。——Charlton McIlwain

7、阿波羅11號登月艙的緊急救助代碼

年代:1969

防止登月艙的計算機在太空中耗盡空間的代碼

數字化:Virtual AGC與MIT Museum

阿波羅制導系統計算機(AGC)是一個奇蹟:就像計算阿波羅重返地球軌跡的Poppy Northcutt告訴我那樣,AGC的計算能力還比不上今天記錄個人信息的賀卡。但是,它卻做到了該做的。

有限的計算能力和存儲空間意味著必須細緻地管理好任務,因此AGC始終聚焦在最重要的工作上。

如果它沒有足夠的空間來執行任務,那就不可能完成任務。AGC軟件團隊知道,總有些事情是自己計劃不到的。

因此,他們開發了BAILOUT。當計算機有空間用完(或“溢出”)的風險時,AGC會觸發BAILOUT把不太重要的數據和操作調走,從而讓重要的數據和操作保持正常運行。

當Eagle著陸器準備降落到月球表面時,大概在30000英尺高空處,AGC 發出了“1202”的警報,尼爾·阿姆斯特朗和休斯敦的飛控都沒有馬上意識到這一點。

但是在不到30秒的時間內,指揮中心的計算機專家表示,AGC軟件正在按預期的方式運行:放棄了低優先級的工作並重新開始重要的工作(這個過程很快,以至於大家都無法察覺)。

阿姆斯特朗和Buzz Aldrin可以繼續從AGC那裡得到他們絕對需要的東西,好繼續安全著陸。

在阿姆斯特朗說出“鷹已降落”之前,溢出警報還會再響三聲,但永遠是因為事情按預期進行才會響。

“救助”一詞通常表示任務以失敗結束,但在這裡卻讓人類的最高成就成為現實。— 史密森尼國家航空航天博物館主任Ellen Stofan

8、Hello, World!程序

年代:1972年或更早

把世代引入代碼的一句話

當你坐下來學習一門新的編程語言時,教程要你做的第一件事就是讓計算機顯示出 “Hello,world!”這句話。

也許早期最著名的例子來自貝爾實驗室備忘錄,《C語言編程教程》。這本書寫於1974年,儘管有人發現在1972年的B語言手冊裡面也發現了它,而且可能時間比這還要早。

Hello, World!是一個很美麗的教材。這是一項很小的、可完成的任務,可以讓人早早獲得成就感。

這已成為了標準,有助於說明不同編程語言之間的差異。對於高級程序員來說,這也是一個快速簡便的方法,可確保在安裝新環境後一切正常。

(有時候程序員會用“實現'hello world'的時間'作為比較語言和環境的速度測試。)

也許最重要的是,“Hello,world!”天真、友善,而且有助於說明新程序員的代碼可產生的影響範圍。那就是全世界。——IBM AI設計主管Chris Noessel 。

9、空終止串——Null

年代:1972

計算史上最災難性的設計錯誤

GNUC參考手冊

1972年,丹尼斯·裡奇(Dennis Ritchie)做出了一個重大決定:自己的新語言要用一種所謂的“空終止串”來表示文本。

這個概念其實早就出現了,但是他在自己的新語言,C語言裡面把它奉若神明,而這一決定的遺產從此就一直纏住了我們。

編程語言表示一段文本的主要有兩種方式:它可以是內在的固定長度的——“我就包含10個字符,就這麼多。”也可以用過空值(null)結尾——這裡有一堆的字符,你儘管看下下去,直到最後到達零字節為止,祝你好運!”

C代碼中一個極其常見的錯誤是把一個長字符串複製到一個較短的字符串,造成結尾處溢出,這意味著你破壞了剛好在附近的其他數據。就像在白板邊上寫東西一樣。

除了只是導致程序發生故障外,此類錯誤還可以用來說服程序用經過精心設計的特定數據去覆蓋某些內容,從而改變程序的行為。

這就是緩衝區溢出攻擊。但凡你聽說過的安全漏洞幾乎都是從這裡開始的,其始作俑者就是1988年的莫里斯蠕蟲病毒(Morris Worm)。

仔細寫代碼可以避免在C語言中出現此類錯誤,但是這種語言的特點導致此類錯誤產生容易檢測難。

幾乎所有的現代語言都避開了以null終止的字符串,但是從路由器到“智能”燈泡,C和C++仍然在世界的基礎處運行著。

因此,在將近50年後,我們仍跟這類bug在玩打地鼠的遊戲。——Jamie Zawinski

10、Telenet遠程網

年代:1975

第一個基於數據包交換的公共數據網絡,是當今互聯網的骨幹

互聯網的前身是ARPANET,這是一個供高級研究計劃局(現為DARPA)研究人員機器之間交換數據的計算機網絡。

隨著ARPANET在政府內部的擴張,網絡搭建者意識到這項技術可能對普通大眾也很有價值,以及參與到其中可以催生多少的商機。

1975年8月,ARPANET的商業版本Telenet 在七個城市上線,該網絡可讓最早期的客戶(主要是計算機或數據庫公司)用電話撥號方式上傳下載(如電子郵件原型消息)或遠程訪問存儲在中央計算機上的代碼。

雖然ARPANET通常被認為是現代Internet的鼻祖,但實際上為公眾消費而設計的Telenet才是Web的前身。

實際上,1980年代Telenet的最大客戶之一就是Quantum Link,後者後來成為AOL。——Jane C. Hu,Future Tense contributor

11、溫哥華證券交易所的舍入誤差

年代:1982

一個小小的小數點之別付出的巨大代價

溫哥華證券交易所使用的代碼大概是這樣的。

1982年初,溫哥華證券交易所推出了一種一開始錨定基點為1000點的電子股票指數。

但是推出後在兩年的時間之內,它就跌到了原始價值的一半,這種走勢在牛氣沖天的1980年代初期是一個令人困惑的反例。

一項調查顯示,對指數的計算在一個地方出了問題,那就是用floor()而不是round()。用floor意味著指數被舍入而不是取整到小數點後三位。(數字計算機必須要有有限的精度,因此需要四捨五入或截斷。)

因此,如果指數計算值為532.7528的話,計算機保存下來的值是532.752,而不是四捨五入為532.753。

這一點點的差異本來關係不大,但由於每天都要對指數進行數千次計算,這種看似很小的差異(基本上每次都進行不進位舍入)導致指數值出現急劇下降。

這個編程錯誤最後在1983年11月被修正,當時的某個週五收盤時指數已經降到500左右了。到了下週一指數以超過1000點開盤,損失掉的價值被恢復回來了。——伊利諾伊大學香檳分校助理教授Lav Varshney

12、Therac-25代碼

年代:1985–1987年

事實證明,過分自信會殺死人

當真相顯現時,頭條新聞就現代化發出了警告。《洛杉磯時報》宣稱:“複雜時代的軟件故障會死人。”

一種本來用於治療癌症的機器由於在幾家醫療機構對六名患者進行了過大劑量的放射,造成了至少三人死亡。

研究人員經過調查發現,Therac-25的程序允許致命錯誤的出現。本來這臺機器提供的是低功率和高功率兩種類型的治療,而後者需要金屬設備來過濾光束。

但是由於軟件存在的錯誤,操作員可以在沒有合適的金屬設備就緒的情況下意外觸發高功率模式。

在設計上,Therac-25是Therac-20的“改進”版,而且這種軟件被認為已經萬無一失,因此不需要外部的安全檢查。

結果:重大死亡的責任要歸咎於過度自信的工程師,因為他們沒有對錯誤發生的可能性做出解釋。——Molly Olmstead


免責聲明:以上內容來自網絡,僅供交流學習之用。如有任何疑問或異議,請留言與我們聯繫。


分享到:


相關文章: