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