50年前的登月程序和程式設計師有多硬核

2019-08-05     程式設計師聖經
作者:陳皓
來源:https://coolshell.cn/articles/19612.html

2019年7月20日,是有紀念意義的一天,這天不是因為廣大網民幫周杰倫在新浪微博上的超話刷到第一,而是阿波羅登月的50周年的紀念日。早在幾年前,在Github上放出了當成Apollo飛船使用的原始碼(當然是彙編的),但完全不明白為什麼這幾天會有一些中國的小朋友到這個github的issue里用灌水……,人類歷史上這麼偉大的一件事,為什麼不借這個機會學習一下呢?下面是一些阿波羅登月與程式設計師相關的小故事,順著這些東西,你可以把你的周末和精力用得更有價值。


首先,要說的是Apollo 11導航的原始碼,這些代碼的設計負責人叫Margaret Heafield Hamilton ,是一個女程式設計師,專業是數學和哲學,1960年得到一個MIT麻省理工大學的臨時的軟體開發職位,負責在PDP-1和LGP-30上運行天氣預報的軟體(註:在計算機歷史上,PDP系統機器被稱為Hack文化的重要推手,PDP-11推了Unix作業系統,而Unix作業系統則是黑客文化的重要產品。參看《Unix傳奇》)。然後,她又為美國空軍編寫探測知敵方飛行的軟體,之後,於1965年的時候,她加入了MIT儀器實驗室,並成為了這個實驗室的主管,這個實驗實就是Apollo計劃的一部分,她負責編寫全新的月球登錄的導航軟體,以及後來該軟體在其他項目中的各個版本。

上圖是Hamilton站在她和她的麻省理工團隊為阿波羅項目製作的導航軟體原始碼旁邊,在Github上的開源的代碼 – Apollo-11 (2016年開源)。我們可以看到,有兩個重要的目錄,一個目錄叫「Comanche055」,一個目錄叫「Luminary099」,前者是指揮艙用的(英文為 Command Module )後者為登月艙用的(英文為 Lunar Module),這裡需要說明一下的是,指揮艙是把登錄艙推到月球上,在返回的時候,登錄艙是被拋棄掉的,而返回到地球的是指揮艙。如果你想看這兩份原始碼的紙版,你可以訪問這兩個連結:Comanche 55 AGC Program Listing 和 Luminary 99 REv.1 AGC Program Listing。其中的55 和 90 是各自的build 版本號。

我們細看一下,這些文件的日期是,1969年7月14日,而Apollo 11登月的日期是1969年7月16日起程,7月19日經過月球背面,7月20日下午8點登月。代碼寫好,兩天後就直接上生產,然後就登月,還是導航代碼,這代碼寫的的健壯性得有多強。

如果你仔細比較一下這兩個目錄中的文件,你會發現有些文件是一樣的,不但文件名一樣,而且內容也一樣。這說明這兩個模塊中的一些東西是相似的。


這些代碼應該是很難讀了,因為當時寫這些代碼的時候,C語言都沒有被發明,所以基本上來說都是彙編代碼了,而且還可以發現,這些代碼的源文件全是以agc後綴結尾的, 看來這還不是我們平時所了解的彙編,所謂的AGC代表了運行這些代碼的計算機 – Apollo Guideance Computer 。沿著這個Wikipedia的連結,你可以看到AGC這個電腦的指令是什麼樣的,看懂那幾條指令後,這些原始碼也就能讀懂了。當然,因為是寫成彙編的,所以,讀起來還是要費點神的。不過,其中有一個文件是 LUNAR_LANDING_GUIDANCE_EQUATIONS.agc 你會不會很好奇想去看看?

打開源文件,你還可以看到每個文件都有很多很多的注釋,非常友好,但是也有一些注釋比較有趣。這裡有一組短視頻帶你讀這些代碼 – Exploring the Apollo Guidance Computer(AGC) Code,一供10個小視頻,每個2分鐘左右,如果你英文聽邊還行(我覺得很容易聽懂),可以看看,了解一下AGC的工作方式,挺有趣意思的。

當時的AGC有32公斤,主頻只有2MHz,2K的RAM,36K的ROM。嗯,當年就是這麼一個小玩意,把人送上了月球,今天,一個聊天程序就占內存幾GB……

下面是AGC在Apollo 1指揮艙里的樣子(圖片截自上面的視頻),這個高質量的3D掃描來自 Simithsonian 3D: Apollo 11 Command Module (我覺得美國人干這些事干就是很漂亮啊,這種高清的3D掃描太牛了,如果你仔細看,這個艙里還有太空人在艙壁上的手寫)


這個AGC的操作介面又叫DSKY – Display 和 Keyboard的縮寫,下圖是一個 AGC 模擬器,其官方主頁在 https://www.ibiblio.org/apollo/原始碼在 Github/VirtualAGC。在這個介面上我們可以看到:下面的鍵盤上左邊有兩個鍵,一個是動詞Verb一個是名詞Noun,Verb指定操作類型,Noun指定要由Verb命令修改的數據。右邊的顯示器下面有三個5位的數字,這三個數值顯示表示太空飛行器姿態的矢量,以及所需速度變化的顯示矢量。是的,當年的導航就靠這三個數字和裡面的程序了。


如果你想了解AGC更多的細節,你可以看看 這篇 AGC for Dummies。這篇文章講述了AGC這個嵌入式系統的背景和操作指令。一份詳細的AGC 彙編語言手冊可以讓你了解更多的細節。

另外,我在Youtube上找到了一個講當時Apollo電腦的紀錄片 – Navigation Computer,太有趣了。比如:21分51秒開始講存儲用的 Rope Memory 繞線內存,Hamilton 也出來講了一下在這種內存上編程,畫面切到一個人用個比較長的金屬針在一個像主板一樣的東西上,左右穿梭,就像刺繡一樣,但是繡的不是圖案,而是程序……太硬核了,真正的通過「硬編織」的方式來寫程序。


看完上面這個紀錄篇,我是非常之驚嘆,驚嘆於50年前的工程能力,驚嘆於50年前這些人面對技術的的一絲不苟,對技術的尊重和嚴謹的這種精神和方法,一點都不比較今天差。

不過,最牛的還不是這個,我在Hamilton的Wikipedia詞條上找到了他說的一個事件—— 當年Apollo登陸雷達開關放在了錯誤的位置,導致AGC收到了不少錯誤的信號。結果就是AGC既得執行著陸必須的計算,又要接受這些占用其15%時間的額外數據。但是AGC的程序居然可以用高優先級的任務打斷低優先級的任務,於是,AGC自動剔除了低級別的任務以保證了重要的任務完成。Hamilton 原話說—— 如果當時的程序不能識別錯誤並從錯誤中恢復,我懷疑阿波羅不能成功登月。if the computer hadn』t recognized this problem and taken recovery action, I doubt if Apollo 11 would have been the successful moon landing it was。

看到這裡,你有沒有覺得——「這個女程式設計師的一小步,是整個人類的一大步」?

Hamilton 的牛逼之外還在於,她是第一個將「軟體工程」提出來的人,在MIT,她想讓軟體開發就像其它工程一樣,有相應的工程紀律,給於相關的尊重,於是她創造了Software Engineering這個詞。2018年,IEEE在紀念軟體工程50周年的時候,他們把 Hamilton 請過去講了一個叫 What the Errors Tell Us 的主題。她絕對可以稱得上是程式設計師的Pioneer。

三年前,Apollo的原始碼被開源時候,Twitter有個叫 Lin Clark 的人發了一條推:「我媽50年前的代碼被放到Github上了」,雖然,她不是 Hamilton 的女兒,但她媽媽也是Apolload其中一個程式設計師,現在Lin Clark同樣也是一個程式設計師,目前在 Mozilla工作,Staff Engineer,專長 WebAssembly, Rust, 和 JavaScript ,也是個非常厲害的程序,Youtube上各種演講,也是一個跟他媽媽一樣牛的人。

當她在Twitter上這麼自豪地發了一條這樣的推後,我不知道各位有什麼想法?想不想你的後代在未來也會這樣自豪的發條微博?


最後,尤其是想對那些到Apollo原始碼的issue里發spam垃圾信息的人說一下,你看看人家,再看看你們自己,你們是不是想讓你們的孩子在登月100周年紀念的時候說——50年前我爹那個傻叉在Apollo的github的issue列表時寫了些垃圾,還以為自己多機靈?!

(全文完)

文章來源: https://twgreatdaily.com/zh/9BLnYWwBUcHTFCnfUX74.html