# 從登月計劃看電腦軟體發展
> 資料整理: [jserv](https://wiki.csie.ncku.edu.tw/User/jserv)
## Apollo 的命名典故
在希臘和羅馬神話中,阿波羅 (Apollo) 是太陽神,也是光明之神、真理之神。Apollo 是宙斯與黑暗女神勒托 (Leto) 的兒子,也是音樂家、詩人和射手的保護神。他從不說謊,光明磊落,典型形象是右手拿七弦的里拉琴,左手拿象徵太陽的金球。他擅長彈奏里拉琴,精通箭術,他把醫術傳給人們;而且由於他聰明,通曉世事,因而他也是預言之神。Apollo 掌管音樂、醫藥、藝術、預言,是希臘神話中最多才多藝,也最俊美的神祇,同時象徴著男性之美。
正因為 Apollo 的正面形象,美蘇冷戰時期,美國在 1960 年代末期到 1970 年代初期的登陸月球計畫,就命名為阿波羅計畫 (the Apollo Program)。1967 年 1 月,[Apollo 1](https://en.wikipedia.org/wiki/Apollo_1) 還在地面時因為太空艙高壓氧氣使火勢無法控制,3 名太空人罹難,由於這次嚴重挫敗,致使 Apollo 2 到 Apollo 6 之間的計畫被取消。而隨後的 Apollo 7 到 Apollo 10 獲得成功,並在技術上屢次超越過往。最終,1969 年 7 月的 Apollo 11,人類首度登陸月球,直到 1972 年 12 月的 Apollo 17 才停止。
## 時代背景
前美國總統甘迺迪 (John F. Kennedy) 曾在 Rice 大學演講時提到:
> I believe that this nation should commit itself to achieving the goal,
> before this decade is out, of landing a man on the Moon and returning
> him safely to the Earth.
(我相信美國在 1960 年代結束前,將全力以赴地實現一個目標,那就是讓人類登陸月球,並確保安全返回)
這句話非常明確:在美蘇冷戰時期,讓所有參與太空國防的上萬名人員,乃至於當時的聯邦人民都知道,枝幹該把怎樣的養份送到主幹,更明確來說,機構的專家會去研究夠耐用的船體、天文物理的專家會去研究重力對路線的影響、電子通訊的工程人員構思一系列有效的傳輸方式,而投身教育者則是從國會議員到普羅大眾都涵蓋,確保資金和人才供給不斷絕。
阿波羅 11 號 (Apollo 11) 作為 NASA 阿波羅計畫中的第 5 次載人任務,實現人類第一次登月 (並成功返回地球的) 任務,繞行月球 30 周。阿波羅計畫可參考國家地理頻道拍攝的紀錄片〈[阿波羅任務](https://youtu.be/egaFqQar6mc)〉
距離阿姆斯壯在 1969 年在月球上踏出一小步,即將在 2019 年屆滿 50 週年,近期有《登月先鋒》和《Spacewalk 太空漫步》等大螢幕電影作品。
阿波羅計畫規模在高峰期間,參加工程的企業約 2 萬個,大學 200 所,科學機構 80 餘個,包含 2 萬多名科學家和 40 萬名人員直接或間接地參與這項計劃。整個工程耗資巨大,總計約 255 億美元 (以金價計相當於今天的 9500 億美元)。1965 年,NASA 的財政支出甚至占聯邦財政預算的 5. 3%。
> 蘇聯的投入也不遑多讓,1966 年到 1970 年期間,蘇聯在太空項目上投入 79 億盧布 (約合 240 億美元)
上面甘迺迪那席話就在 1962 年,啟動阿波羅計畫之際。可是甘迺迪總統在內的領導人明知道太空競賽要耗費巨大成本,而選民不容易買單,為何執意去做呢?這要從冷戰的微妙關係談起。
1961 年以前,美國在太空領域全面落後蘇聯,1961 年 4 月,蘇聯太空人成功繞行地球軌道,蘇聯人歡呼的同時,美國人的神經也緊繃著。同年 4 月 19 日,美國支持的古巴流亡者在入侵古巴的豬玀灣事件 ([Bay of Pigs Invasion](https://en.wikipedia.org/wiki/Bay_of_Pigs_Invasion)) 中慘敗,百餘位僱傭軍被卡斯楚的軍隊擊斃,更多人被俘獲。種種跡象,讓總統大位沒坐穩當的甘迺迪清醒地意識到,他的政府面臨嚴重的信任危機。
1961 年 5 月 5 日,美國太空人 Alan Shepard 少將乘坐「自由」7 號飛船進入太空,美國終於有首位太空人,Shepard 只不過在太空中停留 15 分 22 秒,甚至沒有進入地球軌道,完全不能與稍早蘇聯太空人加加林的 108 分鐘環繞地球一圈成就相比,當時蘇聯領導人赫魯雪夫甚至輕蔑地比喻為「跳蚤的一躍」。
為積極應對蘇聯的挑戰,甘迺迪決定勵精圖治,與蘇聯展開航天競賽。鑒於月球是蘇聯人未曾踏上的地方,儘管實現登月極度困難,但足以吸引所有美國人的熱情,因此才有上述 1961 年 5 月 25 日,甘迺迪在美國國會鄭重向世界宣布的話:「美國將在十年之內致力於將人送上月球,並將其安全送返地球。」
1963 年甘迺迪總統遇刺,繼任的林登詹森總統在甘迺迪逝世一個星期後,發布行政命令,將卡納維拉爾角和阿波羅發射設施以甘迺迪的名字重新命名。
1960 年代,阿波羅計畫投入當時的 255 億美元,產生三千多項技術進展,新產品涵蓋國民經濟種種面向,催生一大批新生工業。今天小到紙尿布,大到軍事、雷達、航空、電腦、合成材料、半導體製程、通訊、醫療衛生等等,直接或間接地與阿波羅計劃有關。回顧這一大批高科技的誕生,粗估阿波羅計劃每投入 1 美元,可獲得 4 到 5 美元的產出,換言之,阿波羅計劃帶動 20 世紀六七十年代全人類科學技術和工業的發展。
延伸閱讀:
* [登陸月球跟我們有什麼關係?阿波羅計畫留下的科技遺產](https://pansci.asia/archives/166328)
## 太空競賽的發軔
蘇聯於 1957 年 10 月 4 日發射 Sputnik I (俄語: Спутник-1),後者是首顆進入行星軌道的人造衛星,隨即震撼整個西方,在美國境內引發一連串事件,如[史普尼克危機](https://en.wikipedia.org/wiki/Sputnik_crisis)、華爾街發生股災,至此美蘇兩國之間的太空競賽正式展開。
蘇聯於 1959 年 9 月 12 日發射的無人月球探測器月球 2 號 (俄語: Луна-2),是首個在月球表面硬著陸 (指探測器不裝備任何減速裝置,利用撞毀前的短暫時間進行探測) 的太空飛行器,同年 9 月 14 日,月球 2 號在月球上墜毀,探測結果表明,月球幾乎沒有磁場,且月球周圍沒有像[范艾倫輻射帶](https://en.wikipedia.org/wiki/Van_Allen_radiation_belt)一樣的輻射帶。月球 2 號上攜帶二枚刻有蘇聯國徽的裝飾物,1959 年 9 月 15 日,蘇聯領導人赫魯雪夫把一枚這飾品的複製品贈與美國總統艾森豪。同年隨後蘇聯太空探測器月球 3 號發回第一張月球背面的圖片,人類首度瞭解到月球背面的景象。
東方計劃(俄語: Восто́к)是首次將人成功地送入地心軌道的蘇聯載人太空飛行計劃。這計劃從澤尼特間諜衛星出發,設計東方號太空船,並從 SS-6 洲際彈道飛彈改造成東方號火箭。在「東方號」這一名稱正式公布之前,該計劃被嚴格保密。1961 年 4 月 12 日著陸的東方一號,尤里·加加林是第一位進入太空的人類。
上升計劃 (俄語: Восход,意思為「上升」或者「日出」) 接續東方計劃,後者的剩餘資源讓蘇聯得以持續投入,維持太空領域領先地位。上升計劃的二次太空飛行利用上升號太空船和火箭,主要目的是爭取人類太空史上的「第一」紀錄:蘇聯趕在美國雙子星計劃之前,成功進行第一次多人太空飛行和第一次太空漫步。當這兩個成就取得後,上升計劃就被廢止,部分由於蘇聯領導層的更迭。
1965 年的「上升 2 號」是蘇聯發射的一艘載人太空飛船,這艘飛船實現人類歷史上第一次艙外活動。之後任務被聯盟號任務所取代,後者原先是蘇聯登月計劃的一部分,目的是將蘇聯太空人送上月球。
蘇聯一度佔盡當時太空探索領域的若干第一紀錄:
* 第一個人造衛星 (1957 年 10 月 4 日)
* 第一個哺乳類上太空 (1957 年 11 月 3 日):來自莫斯科的街頭混種母犬「萊卡」,乘著蘇聯的人造衛星史普尼克 2 號繞行地球,配合蘇聯領導人赫魯雪夫要求在十月革命的 40 周年之際倉促進行這趟有去無回的旅程
* 第一個人類上太空 (1961 年 4 月 12 日)
* 第一次太空漫步 (1965 年 3 月 18 日):執行上升 2 號任務時,完成史上第一次艙外活動
* 第一次會合飛行 (1961 年 8 月 6 日)
* 第一個女性太空人 (1963 年 6 月 16 日) 且第一個非軍人身份的太空人: 東方 6 號的 Valentina Tereshkova,至今仍然是唯一一位獨自進入太空的女性航空員
* 第一張月球背面影像 (1959 年 10 月 7 日):Luna3 探測船
延伸閱讀:
* [太空漫步 (Spacewalk) 電影預告](https://youtu.be/EKE8UdUAlyk)
* [如果蘇聯在登月競賽獲勝的話](https://www.bbc.com/ukchina/trad/vert_fut/2016/02/160226_vert_fut_how-the-soviets-beat-america-to-the-moon)
* [請送命吧最好的朋友!《太空犬》萊卡替身人類的遠征](https://global.udn.com/global_vision/story/8664/5420097)
* [人類首顆衛星發射 60 週年:蘇聯巨大宣傳攻勢](https://www.bbc.com/zhongwen/trad/science-41508450)
* [加加林太空飛行 60 週年:人類首次載人航天少為人知的危險](https://www.bbc.com/zhongwen/trad/science-56717342)
## 有著共同起源的火箭技術
1934 年 12 月 19 日及 20 日,馮·布勞恩的研究團隊成功發射兩枚重500公斤,安裝陀螺儀並以液態氧及乙醇為動力來源的 A2 火箭,發射地點位於德國與荷蘭邊界的博爾庫姆島,此次測試兩枚火箭以 2.2 公里及 3.5 公里的射程掉落北海,A-2 火箭開發案持續到 1936 年。由於 A-2 火箭得到滿意的成果,於是德軍更近一步著手研究第二代的 A-3 與 A4 火箭開發計畫,其中 A4 火箭的預定目標為射程 175 公里、最大射高 80 公里、酬載量 1 噸的大型火箭,由於實驗規模已經大到舊試驗場無法提供足夠測試空間,因此德國選擇東部奧得河的出海口處的一個漁村,興建新的火箭試驗基地 (HVP)。
除了液態火箭,德國空軍也在此地開始研發 FI-103 無人駕駛飛行器的研究工作,後者就是 V1 火箭的前身,代號 FZG-78。1942 年 FI-103 研發成功後,由納粹的宣傳部長戈培爾將此新式兵器命名為「V1 火箭」。V 指德語的 Vergeltungswaffe (復仇武器) 一詞縮寫,意味著德國要用這種新兵器為 1942 年 5 月 31 日英國空軍出動飛機千餘架轟炸科隆、美國第八航空隊於 1942 年 8 月 17 日開始在晝間對關鍵性目標實施精確轟炸等納粹國防的挫敗,予以雪恥復仇,當時德國空軍總參謀部被迫從蘇聯前線抽出力量,轉移到後方進行本土防空。
1937 年獲得德國陸軍的支持,2000 萬馬克交付 A-4 火箭的研發。A-5 火箭則是 A-3 火箭的改良版,A-4 火箭吸取 A-5 火箭的研發經驗後,於 1942 年正式研發成功,隨即量產製造。1944 年 9 月正式命名為「V-2 火箭」,並在 9 月 8 日的倫敦攻擊揚名於世。
V2 火箭使用當時極為先進的慣性導航系統。二只陀螺儀自主地保持預先設定的火箭彈道。由 Hagen der Accumulatoren Fabrik AG (AFA) 工廠 (戰後重組為巴斯夫集團) 生產的電池為彈道控制和舵面操縱提供電力。這些電池和所謂的「混合儀器」安裝在戰鬥部下方的儀表艙內。這些儀器包括一台模擬式電子計算機,獲取從陀螺儀傳來的橫向和縱向誤差並據此操作燃氣和空氣舵改正飛行彈道。
1944 年 6 月 13 日到 1945 年 3月的十個月期間,德軍共發射 15000 枚 V-1 飛彈與 3000 枚 V-2 飛彈,共造成英國超國三萬人喪生。V 型彈道飛彈的出現,亦拉開新式作戰的序幕,V-2 的出現意味著各種新興彈道飛彈的戰略及戰術運用,這在日後冷戰鐵幕的對立有更顯著的展現。
第二次世界大戰的尾聲,美蘇雙方都急著要掌握德國的火箭技術,但按照雅爾達密約,V-2 火箭生產工廠的主要所在地佩訥明德 (德語: Peenemünde,位於德國東北烏瑟多姆島上)劃給蘇聯託管,美國心有不甘。在美國政府的支持下,美軍組成一支突擊隊,展開「[迴紋針行動](https://en.wikipedia.org/wiki/Operation_Paperclip)」:1945 年 5 月 22 日到 5 月 31 日,美軍挺進巴伐利亞區並佔領當地,動用 300 節火車車廂和 13 艘輪船,把近百枚的 V-2 火箭及相關的一切設備和半成品搶運一空,蘇聯紅軍在 6 月 1 日抵達時,只見一座座空蕩蕩的工廠。稍早 3 月 29 日,在黑森州的布羅姆斯基爾興火車站,美國人繳獲 10 枚完整的 V-2 火箭及移動發射平台、推進劑和操作說明。這些 V-2 火箭很快就運送至美國,成為美國火箭科技的基礎。1945 年 5 月 2 日,馮·布勞恩 (時年 33 歲) 向美軍投降,並於同年 9 月協同其他的科學家抵達美國。除了軍事用途,V-2 火箭在研究高層大氣和電離層,及對地球表面拍照等科學課題上,也發揮助益。
「迴紋針行動」後,尚有代號為陰天(Overcast)的行動:在 1945 年夏天開始對重要火箭工程師的爭奪。蘇聯也在同一時期,於佔領區抓捕一大批德國科學家,並於 1946 年將他們和其家庭成員,及剩餘的工程和製造設施運往蘇聯本土,以便進行火箭的開發。蘇聯的 R-1 飛彈就是 V-2 火箭的複製,於 1947 年在卡普斯京亞爾靶場發射。於是,V-2 火箭也成為蘇聯太空和導彈武器的技術基石。
Sergei Korolev (烏克蘭語: Сергій Павлович Корольов)) 是蘇聯發展太空火箭及洲際導彈計劃的主持人,之後又主持蘇聯太空計劃,Sputnik I 就是他全程成功督造。1947 年至 1953 年間 Korolev 的團隊成功仿製及自行設計近程、中程、遠端和戰術導彈。1953 年開始主導研究 R-7 洲際彈道導彈,1957 年 8 月 3 日該導彈試飛成功。後來在 R-7 的基礎上改良,利用多節導彈接駁的原理發明「衛星號」運載火箭。1961 年初,由 Korolev 改進的火箭將加加林送上太空。由於 Korolev 對蘇聯太空計畫和洲際飛彈的影響重大,整個冷戰時期他的大名甚至被嚴格保密,相關資訊直到蘇聯解體才陸續解密。
延伸閱讀:
* [NASA、納粹、麻省理工,火箭為何從東方升起?](https://youtu.be/gN4-tpg0tKA)
* [錢學森的理論講的到底是什麼?](https://youtu.be/eIPvmqjGZ9E)
## 太空競賽刺激電腦軟硬體的急遽發展
1961 年 5 月 25 日甘迺迪總統正式宣布美國將實施阿波羅登月計劃時,NASA 內部仍未在登月方案有共識,直到 1962 年夏天最終選定月球軌道的對接法,也就是用運載火箭把飛船複合體發射到月球軌道上;在選好著月點以後,飛船上分離一個小登月艙;太空人乘登月艙在月面上著陸;當完成科學任務後,太空人再乘登月艙返回軌道上,與飛船主體對接;當太空人回到飛船上後,拋掉登月艙,然後返回地球。
這意味著運載火箭能否勝任這一任務,成為至關重要的問題。火箭的研製費用也成為整個研發計劃中最大的一筆開支:
* 阿波羅飛船登月艙的研製費用為 30.1 億美元
* 飛船系統的費用則為 46.5 億美元
* 土星系列火箭的總投入為 65 億美元
為使聯邦政府及各大航空太空工業利益均沾,並發揮各公司的特長,土星系列火箭的研發採取各級分包:
* 第一級承包給善於研製大飛機的波音公司
* 第二級承包給對液氫液氧發動機作出突出貢獻的北美航空公司
* 第三級則承包給大型民用飛機的先驅者道格拉斯公司
值得注意的是,麻省理工學院儀器實驗室及 IBM 等公司則贏得電氣儀表方面的合約,這使得太空計畫和電腦技術的躍進有著緊密關聯。
1960 年代中期啟動 Project MAC (與阿波羅登月計畫平行,由 DARPA 贊助的大型計畫) 的 Multics 專案,定位開發多人分時多工作業系統,並且運作於多核的硬體環境 (multi-processor!),更有意思的是,Project MAC 這麼龐大的計畫卻由麻省理工學院 (MIT) 領軍開發關鍵技術,並由 GE (美國通用電氣) 提供硬體及 AT&T 旗下的 Bell Laboratories 開發軟體和技術支持 (受到反壟斷條款的處分,AT&T 不得涉及硬體銷售,但研發專利技術並授權他人不在此限),今日我們熟知的 C 語言開創者 -- 已故的 Dennis M. Ritchie (縮寫 dmr) 和如今供職於 Google Inc. 並帶領一群高手投入 Go 程式語言開發的 Kenneth Thompson (縮寫 ken) -- 即服務於 Bell Labs。
以商業的角度來說,Multics 是個失敗的作業系統,但 ken 和 dmr 卻汲取其中的養分,帶著戲謔的口吻,開發出名為 UNICS 的作業系統,"uni-" 和 "multi-" 是對比的前綴,後來 UNICS 被正名為 UNIX,自此為世人熟知,並且影響你我生活的個別面向。UNIX 第一版用組合語言開發,提供了檔案系統的服務,後來用 C 語言重寫,其中 Research UNIX version 6 (UNIXv6) 是大量被學校和公司行號採用的作業系統 (在 AT&T 的律師團收取天價授權費之前)。
當時電腦很大 但登月艙很小,如何放進去是個大難題,所以才研發矽晶片。且當時矽晶片散熱極差,致使當機嚴重,MIT 博士 [Halcombe "Hal" Laning](https://en.wikipedia.org/wiki/J._Halcombe_Laning) 發展基於優先權的排程策略,大幅改善分時系統的缺點。Apollo 11 登月前一直出現錯誤的 1201 警報,令人緊張,當下 NASA 也摸不著頭緒,後來研究才知道 Buzz Aldrin 太早啟動返航電腦,雷達訊號讓電腦處裡應接不暇,前述的優先權排程策略就發揮作用,避免非預期的電腦當機。老鷹號登月電腦導航的主記憶體才佔 72KB,擔心登月的成就被蘇聯追上,所以放棄全部由電腦導航的策略,以加速過程,於是部分目測導航,部分電腦備援。
延伸閱讀:
* [Moon Machines: Software for the Apollo Mission: 72KB RAM](https://youtu.be/DWcITjqZtpU)
* [Moon Machines](https://en.wikipedia.org/wiki/Moon_Machines)
## 軟體
![](https://i.imgur.com/WHUdmwy.jpg)
電腦科學先鋒 Margaret Hamilton 過去致力於投身 NASA - National Aeronautics and Space Administration 阿波羅登月計畫中的軟體開發,2016 年她從歐巴碼總統手上獲得總統自由勳章。
* [Apollo software engineer Margaret Hamilton receives Presidential Medal of Freedom](https://www.theverge.com/2016/11/23/13734214/apollo-software-engineer-margaret-hamilton-presidential-medal-of-freedom)
自從曼哈頓計畫發展出第一個原子彈以來,就鮮少有資訊系統的專案是由女性來主持,而 Hamilton 女士就是少數領導人類科技發展的軟體主管,她也使用「軟體工程」這樣的字眼,以區別軟體開發與硬體還有其他工程學類別。1960 年當時 24 歲的 Hamilton 在 MIT 擔任程式設計師,最初的動機是賺錢來支持她丈夫在哈佛大學工讀法學院,並打算在丈夫畢業後,換她去讀研究所,不料她卻一直工作下去,還主導阿波羅計畫的軟體開發。
* [Her code got humans on the moon - and invented software itself](https://www.wired.com/2015/10/margaret-hamilton-nasa-apollo/)
值得一提的是,1969 年,當時任職於 Bell Labs 的 Ken Thompson 和 Dennis Ritchie 在參與 Multics 計畫 (該計畫的前身就是承包阿波羅計畫的 MIT,在接受 DARPA 贊助開發而出的 CTSS 多人多工作業系統) 後,另起爐灶開發 UNIX 作業系統的第一版,而作為 UNIX 作業系統最成功的後繼者 —— Linux 核心 —— 的開創者 Linus Torvalds 也在 1969 年出生,另外,網際網路的前身 Advanced Research Projects Agency Network (ARPANET) 也在同一年建立,連同 Apollo 11,這一年使得今日我們所處的環境徹底改變。
## 經典重現
2009 年,適逢 Apollo 11 成功登月 40 週年,[Virtual AGC](http://www.ibiblio.org/apollo/) 計畫嘗試從 MIT Instrumentation Laboratory 掃描的技術文件圖片中,重新還原用於 Apollo 11 的 Command Module code (Comanche054) 和 Lunar Module code (Luminary099),使其得以在現代的電腦環境中運作,其中 AGC 是 [Apollo Guidance Computer](https://en.wikipedia.org/wiki/Apollo_Guidance_Computer) 的縮寫。[Virtual AGC](http://www.ibiblio.org/apollo/)重製的程式碼中,可見以下宣告:
```
# Assemble revision 055 of AGC program Comanche by NASA
# 2021113-051. April 1, 1969.
#
# This AGC program shall also be referred to as Colossus 2A
# Prepared by
# Massachussets Institute of Technology
# 75 Cambridge Parkway
# Cambridge, Massachusetts
```
另一個專案 Moonjs 則在 Virtual AGC 的基礎上,用 JavaScript 重新在網頁呈現 AGC 線上模擬,可參見:
http://svtsim.com/moonjs/agc.html
使用時,務必閱讀左上方 "Launch checklist",按下 "Enable IMU" 後,等待 90 秒直到 "NO ATT" 指示燈關閉,隨後在左下方循序按下 VERB, 3, 7, ENTR, 0, 1, ENTR 等按鍵,以及 PROG 按鍵,等待 IMU 校正完畢切換到 Major mode 02,才可按下 LAUNCH 以發射。
Virtual AGC 計畫還原的程式碼進一步整理在 GitHub,請見:
https://github.com/chrislgarry/Apollo-11
我們用今天的角度要回顧 Apollo 11 AGC 程式碼時,往往會迷失在這些組合語言程式列表中,不過我們要知道,真正在太空艇中使用的程式碼保存於磁芯—線圈記憶體 (core rope memory),這是過往的技術,用「一針一線」去「編織」0 和 1 的數位資料 (每單位稱為 core bit)。使用磁芯—線圈記憶體技術的考量在於,可以有效抵抗宇宙射線。於是,MIT 程式設計師開發出來的程式碼,經過組譯器轉換成機器可讀的 0 和 1 序列後,就經由工廠的操作員 (絕大多數為女性),像是老太婆打毛線一樣,去「編織」為對應的 core bit,所以 MIT 有些人就戲稱這樣的記憶體為 LOL memory,意思是 "Little Old Lady memory"。
閱讀 Virtual AGC 計畫整理出的程式碼,我們不難發現 Don Eyles 的大名,他是登月艇裡頭程式的主要開發者,在 Apollo 11 發射之際,他才 22 歲,就負責開發影響人類歷史的重大計畫。這讓我們想到,ARRC 由一群在 NASA 服務過、在太空領域深度耕耘各領域專家所組成的「火箭大叔」,帶領著一群年輕人打造台灣人自製的火箭,宣示要讓台灣有自主發射衛星能力。2010 年,ARRC 首次大型試射成功,跌破眾人眼鏡,計畫主持人的吳宗信教授 (後來成為太空中心主任) 看見學生的眼淚,說道:「你會發現真的做得到,只是沒有人給他們這個機會」。工程就是為了解決人類的種種問題而生,工程師則是肩負這使命的一群無名英雄,年紀不應該是顯著的限制。
* Tales from the lunar module guidance computer: http://www.doneyles.com/LM/Tales.html
航太科技是科技發展的火車頭,今天我們熟知的 3D 列印、燃料電池、太陽能板、遙控系統等等,都是阿波羅計畫為了克服種種難題,發展而出的各式副產品。於是,發展自製火箭系統、整合產業鏈,等於是讓台灣產業鏈從機械代工端,走向航太產業。阿拉巴馬大學航太工程與機械學系教授 Gary. C. Cheng 評論道:
「ARRC 的價值絕對不僅是他們的發射成果,更重要的是他們發展的科技,以及栽培出的下一代,就如同 NASA 不斷為美國科技業帶來突破與各種新產品那樣。」
當時在阿波羅計畫中參與飛行電腦系統的 Phill Parker 事後回顧 Don Eyles 等人的程式碼,撰寫一篇文章 "Apollo Lunar Module Computer Source Code Humour !",可見: http://forum.nasaspaceflight.com/index.php?topic=34348.0
這份登月紀錄影片對應的字幕,可參見: http://www.firstmenonthemoon.com/
[ [source](https://www.zhihu.com/question/48363995) ] Apollo 11 著陸時,因為同時開了著陸雷達和對接測速雷達,導致 AGC 產生了記憶體不足錯誤。系統拋棄了低優先級的任務,保證最重要的的姿態穩定和發動機推力調節能繼續正常運行。雖然著陸雷達掛了,但飛船仍然是可控的。主導航系統有平台式 IMU(模擬穩定迴路,機械相連的六分儀),電腦可直接讀取姿態角/速度/位置。備用導航系統使用尤拉角微分方程實現捷聯慣性導航,測量器件精度極高並且飛船動態小,更新速率小於 100Hz 都夠了。位置修正的資訊直接從六分儀和平台的角度感測器讀出,代入公式計算即可得到修正量。
[ [source](https://www.zhihu.com/question/48363995) ] 資料下載到地面使用硬體編碼器,電腦直接傳送原始資料即可安排發送。其他的設備如主發動機、推力向量機構、姿態控制噴口,以及一些熱控元件。這些用到了 PID 控制或者簡單的開關控制,每秒更新幾次到幾十次。
[ [source](https://www.zhihu.com/question/48363995) ] 鍵盤和顯示器:有一個 CRT 圖形顯示器,可顯示著陸月球 / 返回地球時的彈道信息。還有另外一個計算器數位管線和鍵盤(居然由繼電器驅動)地面設備因為不太受到體積和重量限制,做得就更加誇張了:主控大廳是 [Eidophor](https://en.wikipedia.org/wiki/Eidophor) 光閥實現的巨幅投影機,一台電腦控制整個地面操作中心,產生所有影像。
現在的自動化控制程式,會用較新的理論,比如慣性導航可換四元數演算法 (但是德國 [MikroKopter](http://www.mikrokopter.de/en/home) 仍然是尤拉角微分方程)。或者添加一些新的方法,例如中國國家太空總署的「嫦娥任務」使用雷射雷達進行地形識別和導航。但基本的思路仍然和當年的程式接近。換了 C++ 語言和現代的 x86 處理器,這套程式的實作不會有根本的變化。一個自動化系統最核心的部分,仍然是這些物理定律、演算法和工程參數,它決定一套自動化系統的基本能力和技術特性。
在月球著陸期間,登月艙的著陸雷達 PGNC 因為資料過載出現 4 次 1202 (執行中過載 —— 沒有剩餘空間) 警報和 1 次 1201 (執行中過載——沒有核心配置) 警報。過載的資料是因為操作導致的。這些錯誤並不會對任務造成嚴重影響,反而正是 AGC 軟體的設計合理而使得問題得到非常順利的解決。
## Computers in Spaceflight: The NASA Experience
- [ ] [Part I : Manned Spacecraft Computers](http://history.nasa.gov/computers/Part1.html)
- Chapter 1: The Gemini Digital Computer: First Machine in Orbit
- Chapter 2: Computers On Board The Apollo Spacecraft
- Chapter 3: The Skylab Computer System
- Chapter 4: Computers in the Space Shuttle Avionics System
- [ ] [Part II: Computers On Board Unmanned Spacecraft](http://history.nasa.gov/computers/Part2.html)
- Chapter 5: From Sequencers to Computers: Exploring the Moon and the Inner Planets.
- Chapter 6: Distributed Computing On Board Voyager and Galileo
- [ ] [Part III: Ground Based Computers for Space Flight Operations](http://history.nasa.gov/computers/Part3.html)
- Chapter 7: The Evolution of Automated Launch Processing.
- Chapter 8: Computers in Mission Control.
- Chapter 9: Making New Reality: Computers in Simulations and Image Processing.
## 軟體和程式碼分析
* [Moonjs: An Online Apollo Guidance Computer (AGC) Simulator](http://svtsim.com/moonjs/agc.html)
- [source code](https://github.com/siravan/moonjs)
- 使用時,務必閱讀左上方 "Launch checklist",按下 "Enable IMU" 後,等待 90 秒直到 "NO ATT" 指示燈關閉,隨後在左下方循序按下 VERB, 3, 7, ENTR, 0, 1, ENTR 等按鍵,以及 PROG 按鍵,等待 IMU 校正完畢切換到 Major mode 02,才可按下 LAUNCH 以發射。
- [ ] Source Code Review
* [One Giant Leap: The Apollo Guidance Computer](http://ed-thelen.org/comp-hist/vs-mit-apollo-guidance.html)
* [Don Eyles Walks Us Through the Lunar Module Source Code](http://hackaday.com/2016/07/05/don-eyles-walks-us-through-the-lunar-module-source-code/)
* [Apollo 11: The computers that put man on the moon](http://www.computerweekly.com/feature/Apollo-11-The-computers-that-put-man-on-the-moon)
* [A Glimpse into the Apollo Guidance Computer](https://medium.com/@borja/a-glimpse-into-the-apollo-guidance-computer-8ee06e5e1a5c#.e3dy1gin9)
* [Apollo Guidance Computer revisited](http://eandt.theiet.org/magazine/2009/12/smart-apollo.cfm)
* [Apollo Lunar Module Computer Source Code Humour !](http://forum.nasaspaceflight.com/index.php?topic=34348.0)
- 當時在阿波羅計畫中參與飛行電腦系統的 Phill Parker 事後回顧 Don Eyles 等人的程式碼
* [reverse engineering of the Apollo-11 code](https://github.com/proudindiv/Apollo-11/blob/master/Apollo-11.pdf)
**AGC 內建一套虛擬機器**
為了有效使用記憶體空間,AGC 團隊撰寫一套虛擬機器 (也稱為 [p-code machine](https://en.wikipedia.org/wiki/P-code_machine)),引入名為 "interpretive language" 的虛擬指令集,允許和原生的機械碼指令 (instruction) 混合執行。當虛擬機器 (程式碼稱為 "interpreter" [直譯器]) 用完寶貴的記憶體空間時,虛擬機器會使用一組通用資源,讓新的指令得以執行,相較於事先準備一組副程式,虛擬機器對記憶體存取更有效率。
interpretive language 使用 7-bit 編碼的 opcode,置入 15-bit address fields,指令格式如下:
![](https://hackmd.io/_uploads/ryTUVcRso.png)
> 出處: [AGC4 Basic Training Manual](http://www.ibiblio.org/apollo/NARA-SW/E-2052.pdf) (page 2–2)
換句話說,這樣的安排將 2 道虛擬指令放在 3 個 word (對應 48-bit,AGC 使用 16-bit word 長度,其中 15-bit 保存資料,而剩下的 1-bit 作為 [parity bit](https://en.wikipedia.org/wiki/Parity_bit)), 看起來有點怪,但對於空間使用可以很有效率。要注意的是,AGC 程式本身並不會察覺前述編碼格式,這個 interpretive language 交錯在其他指令中,當在 AGC 組合語言想要呼叫一個直譯器副程式 (interpreter subroutine) 時,可以這樣寫:
```
TC INTPRET
```
其中,`TC` 是原生的 AGC 指令,意思是 "Transfer Control",明確來說,就是移轉執行控制權給特定的副程式,這裡當然就是交給直譯器。一旦 TC 執行時,AGC 將會直譯在記憶體裡頭的虛擬指令,而非原生的 AGC 指令,詳細可見 [INTERPRETER.agc](https://github.com/chrislgarry/Apollo-11/blob/master/INTERPRETER.s) 程式碼。
對照 [THE_LUNAR_LANDING.s](https://github.com/chrislgarry/Apollo-11/blob/master/THE_LUNAR_LANDING.s) (原始檔名 THE_LUNAR_LANDING.agc) 可見以下:
```
FLAGORGY TC INTPRET # DIONYSIAN FLAG WAVING
CLEAR CLEAR
NOTHROTL
REDFLAG
CLEAR SET
LRBYPASS
MUNFLAG
CLEAR CLEAR
P25FLAG # TERMINATE P25 IF IT IS RUNNING.
RNDVZFLG # TERMINATE P20 IF IT IS RUNNING.
```
左邊的 `FLAGORGY` 是副程式的名稱,而 `TC INTPRET` 就是呼叫直譯器,這段程式碼就是以 interpretive language 撰寫,最終會組譯為虛擬指令。
副程式命名和程式註解非常經典:
```
FLAGORGY TC INTPRET # DIONYSIAN FLAG WAVING
```
- Dionysian 是衍生於 Dionysus,後者是古希臘神話中的酒神,相傳 Dionysus 是古希臘色雷斯人信奉的葡萄酒之神,不僅握有葡萄酒醉人的力量,還以布施歡樂與慈愛在當時成為極有感召力的神,這裡 Dionysian 有狂野、不受禮教制約的意思。顯然,Dionysian 對比就是 "Apollonian",開了阿波羅計畫的玩笑,就在嬉皮盛行的年代。
- 酒神與太陽神或是種哲學的、文學的概念,一種二分法。德國哲學家尼采的《悲劇的誕生》描述以希臘神話的神祇命名的兩個極端:一個是太陽神阿波羅,另一個是豐收之神和酒神戴奧尼索斯。他們均是天神宙斯的兒子。阿波羅代表詩歌、預言、俊美整齊和光明;戴奧尼索斯則代表生命力、戲劇、狂喜和醉酒。文學評論家以他們對比的性格描述不同的藝術風格,但希臘神話中他們並非相反象徵或仇敵。
前述的組合語言到底表示什麼呢?
在 AGC 組合語言中,interpretive language 指令就像自身在記憶體的模樣:兩個 opcode,緊跟著 2 個位址 (address),其中第一個位址表示第一個 opcode,第二個位址則表示第二個 opcode。我們實際上只有兩道指令:
- CLEAR
- SET
這指令處理保存於記憶體的單一 bit 的旗標,在 AGC 中特稱為 "switches",地址欄位實際用來指定 switch 編號,個別定義於 [FLAGWORD_ASSIGNMENTS.s](https://github.com/chrislgarry/Apollo-11/blob/master/FLAGWORD_ASSIGNMENTS.s) 原始程式碼中:
- CLEAR NOTHROTL: "Permit full throttle"
- CLEAR REDFLAG: "Landing site redesignation not permitted"
- CLEAR LRBYPASS: "Do not bypass landing radar updates"
- SET MUNFLAG: "[Servicer](https://github.com/chrislgarry/Apollo-11/blob/master/SERVICER.s) calls MUNRVG" ([MUNRVG](https://github.com/chrislgarry/Apollo-11/blob/master/SERVICER.s#L1008-1011) is a subroutine that performs some computations needed by the thrusting program)
- CLEAR P25FLAG: "P25 not operating"
- CLEAR RNDVZFLG: "P20 not running"
- P20 and P25 are programs used during the rendezvous between the command module and the lunar module.
前述程式碼用了 [threaded code](https://en.wikipedia.org/wiki/Threaded_code) 的技巧,也是後來 Forth 程式語言 (最早用於航空科技) 的基礎之一,C 語言的前身 B 語言編譯器在 PDP-7 上不產生機械碼指令,而是 threaded code。
**詼諧的程式碼註解**
我們對照 [THE_LUNAR_LANDING.s](https://github.com/chrislgarry/Apollo-11/blob/master/THE_LUNAR_LANDING.s) (原始檔名 THE_LUNAR_LANDING.agc)
Line #243 到 Line #254
可以發現以下有趣的註解: (省略組合語言指令)
```
# ASTRONAUT: PLEASE CRANK THE
# SILLY THING AROUND
# PROCEED SEE IF HE'S LYING
# ENTER INITIALIZE LANDING RADAR
# OFF TO SEE THE WIZARD ...
```
這段程式碼屬於 P63SPOT3 副程式/常式 (subroutine),用來檢查著陸用雷達 (Landing Radar; LR) 天線是否位於 position 1,若是,則跳躍到另一一段程式 (副程式 P63SPOT4) 來初始化著陸用雷達,否則執行另一道指令,對應的註解就是: "Astronaut: Please crank the silly thing around"。
第 317 行就是著陸確認程序,要求太空人去載入 V06N43,程式註解寫道:
```
"Astronaut: Now look where you ended up"
```
多美好的註解呀!這時太空人預期就會在月球表面。
BURN_BABY_BURN - - MASTER_IGNITION_ROUTINE
這要追溯到1965年,洛杉磯暴亂,其靈感來自於非凡的唱片 DJ 兼廣播電台老闆 Magnificent Montague。在點播最受歡迎的新唱片時,Magnificent Montague 就會說「燃燒吧,寶貝,燃燒起來!」在1950年代中期到 1960 年代中期,Mangificent Montague 是芝加哥、紐約和洛杉磯黑人樂的魅力之音。
[ALARM_AND_ABORT.s](https://github.com/chrislgarry/Apollo-11/blob/master/ALARM_AND_ABORT.s) (原始檔名 ALARM_AND_ABORT.agc):
- Line #179
`TC WHIMPER -1 # YES. DON'T DO POODOO. DO BAILOUT.`
依據 [Apollo Guidance Computer Block II - CMC Data Cards](http://www.ibiblio.org/apollo/CMC_data_cards_15_Fabrizio_Bernardini.pdf) 可知:
"POODOO abort, does software restart (ENEMA) and "GO TO POOH" (flashing Verb 37) unless "AVERAGE G" is running then only software restart"
## 硬體重建
- [Build Your Own NASA Apollo Landing Computer (no kidding)](http://www.galaxiki.org/web/main/_blog/all/build-your-own-nasa-apollo-landing-computer-no-kidding.shtml)
## 相關討論
- [HN: Don Eyles Walks Us Through the Lunar Module Source Code](https://news.ycombinator.com/item?id=12036864)
- [HN: Source code for the Apollo 11 Guidance Computer](https://news.ycombinator.com/item?id=8063192)
- [HN: Apollo 11 Guidance Computer source code](https://news.ycombinator.com/item?id=12048945)
- [Assembly Code That Took America to the Moon Now Published On GitHub](https://developers.slashdot.org/story/16/07/10/162241/assembly-code-that-took-america-to-the-moon-now-published-on-github)
- video: [Computer for Apollo](https://www.youtube.com/watch?v=YIBhPsyYCiM)
- [Tales from the lunar module guidance computer](http://www.doneyles.com/LM/Tales.html)
- [The Lunar Module Computer](http://www.abc.net.au/science/moon/computer.htm)
- [Her Code Got Humans on the Moon—And Invented Software Itself](http://www.wired.com/2015/10/margaret-hamilton-nasa-apollo/)
Books / Reports
- [The Apollo Guidance Computer: Architecture and Operation](https://www.amazon.co.uk/Apollo-Guidance-Computer-Architecture-Operation/dp/1441908765) (Amazon)
- [slides](http://tcf.pages.tcnj.edu/files/2013/12/Apollo-Guidance-Computer-2009.pdf)
- [Page 1 to Page 15](https://download.e-bookshelf.de/download/0000/0739/63/L-G-0000073963-0002355812.pdf)
- [Optimal Trajectory Planning for the Apollo Moon Landing: Descent, Ascent, and Aborts](http://www.aerospades.com/uploads/3/7/3/2/37325123/apollo_moon.pdf)
- [Spacebone Digital Computer Systems](http://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19710024203.pdf)
- [An Analysis and a Historical Review of the Apollo Program Lunar Module Touchdown Dynamics](http://www.lpi.usra.edu/lunar/documents/SP-2013-605.pdf) (2013)