![]()
1969年7月20日,阿姆斯特朗踩下那一步時(shí),支撐他的不是勇氣,是6萬(wàn)行匯編代碼。這些代碼最近被NASA工程師Chris Garry完整甩上GitHub,公共領(lǐng)域,隨便下,隨便改。Virtual AGC項(xiàng)目和MIT博物館花了幾年時(shí)間,把MIT博物館里發(fā)黃的紙質(zhì)打印件逐頁(yè)掃描、校對(duì)、數(shù)字化。現(xiàn)在你打開(kāi)網(wǎng)頁(yè)就能看見(jiàn)當(dāng)年程序員手寫(xiě)的注釋——有人吐槽老板,有人抱怨內(nèi)存不夠,有人在代碼里藏了莎士比亞。
兩份代碼,兩個(gè)大腦
整個(gè)項(xiàng)目拆成兩個(gè)倉(cāng)庫(kù):Comanche055是指令艙(Command Module)的代碼,Luminary099是登月艙(Lunar Module)的代碼。每艘飛船各裝一臺(tái)阿波羅制導(dǎo)計(jì)算機(jī)(AGC),4KB內(nèi)存,72KB只讀存儲(chǔ)器,運(yùn)算速度約4萬(wàn)次每秒。作為對(duì)比,你現(xiàn)在用的手機(jī)內(nèi)存是它的百萬(wàn)倍。
但就是這個(gè)"電子算盤(pán)",在登月最后階段救了命。
1969年7月20日,登月艙"鷹號(hào)"下降過(guò)程中,AGC連續(xù)觸發(fā)1201和1202號(hào)警報(bào)——計(jì)算機(jī)過(guò)載。任務(wù)控制中心27歲的Steve Bales在幾秒內(nèi)判斷可以繼續(xù),阿姆斯特朗手動(dòng)接管,在燃料僅剩4%時(shí)找到著陸點(diǎn)。那段處理警報(bào)的代碼,現(xiàn)在就在GitHub的ALARM_AND_ABORT.agc文件里,注釋寫(xiě)得像急診室手冊(cè):記錄警報(bào)狀態(tài)、點(diǎn)亮警告燈、區(qū)分"要命的"和"還能忍的"。
另一個(gè)被瘋狂轉(zhuǎn)發(fā)的文件只有30行:用多項(xiàng)式逼近計(jì)算正弦余弦的匯編代碼。沒(méi)有浮點(diǎn)單元,沒(méi)有數(shù)學(xué)協(xié)處理器,程序員用移位和加法硬算三角函數(shù),精度足夠把飛船導(dǎo)航到月球。推上有人截圖感嘆:"我現(xiàn)在的IDE自動(dòng)補(bǔ)全都比這行數(shù)多。"
代碼里的活人痕跡
真正讓程序員破防的是注釋。MIT儀器實(shí)驗(yàn)室的程序員團(tuán)隊(duì)在60年代寫(xiě)下了這些代碼,當(dāng)時(shí)"軟件工程"這個(gè)詞還沒(méi)被發(fā)明。他們面對(duì)的硬件約束堪稱變態(tài):AGC重量32公斤,功耗55瓦,內(nèi)存用磁芯存儲(chǔ),每個(gè)比特一個(gè)小米粒大的磁環(huán),女工手工穿線編織。
在Luminary099的某個(gè)文件里,有人寫(xiě):"TEMPORARY, I HOPE HOPE HOPE"(臨時(shí)的,希望希望希望)。另一處注釋抱怨:"THIS ROUTINE IS CALLED BY PINBALL, WHICH IS CALLED BY THE KEYBOARD, WHICH IS CALLED BY THE ASTRONAUT"(這段代碼被PINBALL調(diào)用,PINBALL被鍵盤(pán)調(diào)用,鍵盤(pán)被宇航員調(diào)用)——三層調(diào)用棧的無(wú)奈,隔著55年都能摸到。
還有更皮的。程序員在代碼里埋了莎士比亞《亨利五世》的臺(tái)詞,在顯示模塊的注釋里寫(xiě):"IT WILL BE PROVEN THAT A LUNAR LANDING CAN BE ACHIEVED WITH A MANUAL OVERRIDE"(將證明登月可以靠手動(dòng)覆蓋完成)。這行注釋寫(xiě)于1969年之前,后來(lái)成真了。
這些注釋沒(méi)有被"清理",因?yàn)楫?dāng)年沒(méi)有代碼審查流水線,沒(méi)有Jira工單,只有打印紙和鉛筆。
GitHub倉(cāng)庫(kù)的README里,Chris Garry特意感謝了Virtual AGC項(xiàng)目的Ron Burkey——他從1990年代開(kāi)始,憑一人之力逆向工程整個(gè)AGC系統(tǒng),掃描原始文檔,寫(xiě)模擬器,讓這段代碼能在現(xiàn)代電腦上跑起來(lái)。現(xiàn)在你用Virtual AGC軟件,可以在Linux、Windows、Mac甚至FreeBSD上編譯執(zhí)行這些匯編,看著1969年的程序在你屏幕上閃爍。
為什么現(xiàn)在放出來(lái)
這不是NASA第一次開(kāi)源老代碼,但Apollo 11的特殊性讓這次發(fā)布有了不同重量。2016年Chris Garry首次上傳時(shí),GitHub服務(wù)器一度被擠爆,程序員們蜂擁而至,有人找bug,有人做表情包,有人單純想摸一摸"人類首次"的代碼質(zhì)感。
更深層的背景是太空計(jì)算的復(fù)興。NASA的Artemis計(jì)劃要2026年送人重返月球,SpaceX的星艦在測(cè)試軌道加油,商業(yè)月球著陸器接連發(fā)射。當(dāng)年的AGC代碼成了活教材——不是學(xué)它的匯編技巧,是看一群資源受限的工程師怎么在不可能的任務(wù)里做取舍。
MIT媒體實(shí)驗(yàn)室的David Mindell寫(xiě)過(guò)一本《Digital Apollo》,里面有個(gè)細(xì)節(jié):AGC的設(shè)計(jì)哲學(xué)是"讓人類在回路中"。計(jì)算機(jī)負(fù)責(zé)常規(guī)計(jì)算,關(guān)鍵時(shí)刻把控制權(quán)交還宇航員。這種"人機(jī)共生"的思路,在今天自動(dòng)駕駛和AI接管一切的爭(zhēng)論里,反而顯得超前。
55年前的代碼庫(kù),意外成了人機(jī)交互的考古現(xiàn)場(chǎng)。
GitHub上的Star數(shù)已經(jīng)超過(guò)幾萬(wàn),Issues區(qū)有人認(rèn)真提問(wèn):"這段中斷處理為什么不用更高效的算法?"也有人玩梗:"提交了PR,把縮進(jìn)從2空格改成4空格,被拒絕了。"最實(shí)用的貢獻(xiàn)可能是中文翻譯——有開(kāi)發(fā)者把關(guān)鍵注釋譯成中文,方便國(guó)內(nèi)航天愛(ài)好者閱讀。
如果你真想跑起來(lái),Virtual AGC項(xiàng)目提供了完整工具鏈。從匯編到二進(jìn)制,從模擬器到虛擬儀表盤(pán),甚至有個(gè)叫"Moonjs"的瀏覽器版本,讓你在網(wǎng)頁(yè)里體驗(yàn)登月艙的操控界面。當(dāng)年宇航員看的數(shù)字顯示,現(xiàn)在你的Chrome里就能復(fù)現(xiàn)。
代碼開(kāi)源的副作用是祛魅。你看不到"黑科技",只看到一堆條件跳轉(zhuǎn)和內(nèi)存地址。但正是這種樸素,讓這次發(fā)布有了特殊意義——它證明人類登月不是神話,是具體的人寫(xiě)的具體的代碼,一行一行,在磁芯存儲(chǔ)器里占著具體的物理空間。
有個(gè)細(xì)節(jié)很少被提及:AGC的內(nèi)存分配是手工計(jì)算的。程序員要知道每個(gè)變量存在哪個(gè)磁芯的哪個(gè)位置,因?yàn)榇鎯?chǔ)密度太低,每一比特都是成本。這種"內(nèi)存地理學(xué)"的訓(xùn)練,讓當(dāng)年的工程師對(duì)系統(tǒng)有著近乎肌肉記憶的熟悉。今天的我們依賴?yán)厥蘸吞摂M內(nèi)存,某種程度上是能力的退化,也是生產(chǎn)力的解放。
Chris Garry在GitHub的提交記錄里,最后一條是2023年的更新:修正了幾個(gè)掃描錯(cuò)誤,補(bǔ)全了缺失的頁(yè)面。Virtual AGC項(xiàng)目還在維護(hù),Ron Burkey已經(jīng)七十多歲,仍在回復(fù)郵件。這個(gè)開(kāi)源社區(qū)的速度很慢,以年為單位,但跨度是半個(gè)多世紀(jì)。
現(xiàn)在打開(kāi)那個(gè)倉(cāng)庫(kù),最先跳出來(lái)的文件是MAIN.agc,主程序入口。注釋第一行寫(xiě)著:"THIS IS THE MAIN PROGRAM FOR THE APOLLO GUIDANCE COMPUTER"。沒(méi)有版本號(hào),沒(méi)有作者署名,沒(méi)有版權(quán)聲明。1969年的程序員大概沒(méi)想到,他們的工作會(huì)在55年后被全球程序員圍觀、吐槽、致敬。
你編譯運(yùn)行的時(shí)候,模擬器會(huì)彈出一個(gè)復(fù)古的界面:數(shù)字在閃爍,狀態(tài)燈在變化。那是阿姆斯特朗和奧爾德林看過(guò)的同款顯示。代碼是死的,但執(zhí)行它的瞬間,某種東西活了過(guò)來(lái)。
最后一個(gè)問(wèn)題留給打開(kāi)倉(cāng)庫(kù)的你:如果讓你用4KB內(nèi)存寫(xiě)一段必須成功的代碼,你會(huì)先刪哪行注釋?
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.