為了執行十年前程式碼,工程師甚至翻出 1977 年的 Apple II

作者 | 發布日期 2020 年 09 月 13 日 0:00 | 分類 科技史 , 軟體、系統 line share follow us in feedly line share
為了執行十年前程式碼,工程師甚至翻出 1977 年的 Apple II


「Hello, World!」46 年過去,這段世人熟知的程式碼仍散發歷久彌新的魅力,和它一起登場的 C 語言,如今也成長為世界前幾大通行程式設計語言,為網路至現實世界都編織更美好的未來。

為了回顧和紀念程式設計史,GitHub 電腦神經科學家 Nicolas Rougier 和理論生物物理學家 Konrad Hinsen 共同發起 Ten Years Reproducibility Challenge(十年程式碼挑戰)活動,鼓勵大家找出自己十年前或更早寫的程式碼,看看現在還否執行,程式碼相關研究能否重現。

目前活動頁面有幾十名參與者提交十多年前寫的程式碼,當年看來算得上尖端技術,但現在不少被當事人打上「執行可能性低」的標記。這在外行人看來很難理解,程式設計的字母和符號都沒變,為什麼無法執行?

首先改變的程式設計語言和工具

之前流行的玩笑是「寫 C 語言的看不起寫 C++ 的,寫 C++ 的看不起寫 Java 的,寫 Java 的看不起寫 C# 的,最後大家一起看不起寫 PHP 的」。

這句充分說明程式設計語言的變化。

TIOBE(程式設計語言排行榜單)公布近 20 年程式設計語言排行變化趨勢圖,總體來看,Java 和 C 語言仍然占據老大老二位置,Python 異軍突起,PHP、C++、C# 持續走低,SQL「起死回生」,Swift 半路「殺出」。

▲ 2002~2020 年程式設計語言趨勢圖。(Source:TIOBE)

工具變化往往和程式設計語言變化同步。

2009 年,Spring 需要若干 XML 配置和 Java 檔案,而 2019 年只需要一個 Java / Kotlin 檔案就可以,十年前只有 Plain Old Javascript、jQuery、ExtJS 可選,如今有 20 多種選擇。

▲ 工具的變化。

▲ 可選性大大提升。

「唯一沒大變的,可能就是演算法了吧?」某位工程師說。十年前 Statistics(統計)十年後搖身一變成了 Machine Learning(機器學習),可是演算法公式還是一樣。

先問在不在,再問能不能「run」

想知道十年前的程式碼還能不能「run」,首先必須能找到十年前的程式碼──這也是「十年程式碼挑戰」雖然在圈內引起不少關注,但截至目前參與者不多的原因之一。

知名代管平台 GitHub 是 2008 年 4 月才上線,很多人是在 2012 年後才開始使用它代管程式碼,之前的程式碼大多以論文、雜誌期刊等方式儲存,遺失了不少。

例如,法國國家資訊與自動化研究所電腦科學家 Roberto DiCosmo 在 1998 年發表論文,寫出名為「OcamlP3l」的並列程式設計系統,但找遍自己和合著者的硬碟及副本,也沒能找到程式碼,最後機緣巧合才在一個程式碼網站找到當年的程式碼。

還有一位參與活動的 Rougier,程式碼發表在 32 年前的雜誌《Tremplin Micro》,而這家雜誌社早已消失於歷史的長河了,如果沒有其他副本途徑又找不到當年的雜誌,這程式碼相當於在程式設計歷史上從未存在。

很難想像,身為網路產物,程式碼也會因為新舊時代儲存方式革新而遺失,這是「十年程式碼挑戰」帶給程式設計圈的第一個現實意義,如何妥善保管之前的程式碼是值得好好思考的事。

你「run」憑你「run」,沒當年軟硬體也白搭

找到當年程式碼後,別高興得太早,第二個問題來了,相當多程式碼是「run」在當年的軟硬體,現在還能找得到這些軟硬體嗎?

前文提到的 Rougier 就遇到這問題。32 年前 1988 年他才 16 歲,為 Apple II 電腦(1977~1993 年)寫了影像放大器的程式碼,是截至目前「十年程式碼挑戰」活動最老的程式碼。

▲ Apple II。

還好 Rougier 的同事在清理辦公室時搶救出一台 Apple II,這台「老古董」可不好「伺候」,老式硬碟無法和現在電腦連線,程式碼執行也就成了大難題。最終 Rougier 在亞馬遜找到 1993 年的老磁碟機,寫入 3 次資料才「救活」硬碟,有了執行程式碼的必要硬體基礎。

遇到類似問題的人不少,比如活動發起者 Hinsen 說,他在 1990 年代寫的程式碼都儲存在軟碟片,但現在找不到讀取軟碟片的的工具了。

▲ 系統也會影響老舊程式碼執行。(Source:Sabino Maggi / nature)

另外,系統環境也很重要。

Sabino Maggi 是義大利電腦物理學家,他在 1996 年用 Fortran 語言建模超導裝置,並用微軟 Visual Basic 處理結果。20 多年過去,「Visual Basic 是一門死掉的語言,早就被 Visual Basic.NET 取代」,Maggi 只能用自己的 Mac 電腦做出十年前 Windows 虛擬器嘗試執行程式碼。好巧不巧,Windows 在 1996 年發表的眾多系統版本不向上相容,導致 Maggi 的程式碼沒能成功執行。

別人 9 歲寫的程式碼還能執行,我還在玩泥巴

▲ 十年程式碼挑戰第一個提交的程式碼。

「When I was 9, I tried to heal a trees broken branch with grass.」(當我 9 歲時,嘗試用草治療一棵樹的斷枝。)一位年輕人在 YouTube 說自己 9 歲寫的程式碼還能執行,某位用戶就回了上述評論,獲得 6,363 個讚。

這次參與「十年程式碼挑戰」的程式碼都長什麼樣?

進入 GitHub 活動頁面,發現這些程式碼和想像不太一樣,很大部分和科學研究有關,和一般食衣住行直接連結性較低。

比如第一個參與者 John (EBo) David 提交的程式碼,寫於 22 年前,名為「The behavior of landscape metrics commonly used in the study of habitat fragmentation」(用於生境破碎化研究的景觀度量行為)。

還有程式碼涉及物理和數學研究領域,像「fermions at unitarity」(統一費米子)、「Poincaré dodecahedral space parameter estimates」(亨利·龐加萊 12 面體空間參數估計值)等。

而「Typographical features for scene text recognition」(場景文字辨識的印刷功能)、「Effects of fire on regional evapotranspiration in the central Canadian boreal forest」(火對加拿大中部北方森林中區域蒸散的影響)算是和普通人連結度稍高的了。

▲ 15 年前有關心血管疾病研究的程式碼。

能讓我們感覺一點「現代網路」的程式碼也有一些,如「Accuracy Study and Improvement of Network Simulation in the SimGrid Framework」(SimGrid 框架網路模擬的準確性研究和改進)讓人想到近幾年爆紅的「AI」,這程式碼實際發表於 2009 年。基因學、神經學、電腦學、生物學、物理學、數學等都有涉及。

「十年程式碼挑戰」參與的程式碼之所以和想像「軟體開發」程式碼不同,推測可能有兩個原因。

第一,得益於完善的論文制度,很多和論文相關或發表論文的程式碼都好好保存下來,只有有儲存的程式碼才有可能參與活動。第二,十多年前無論電腦還是程式設計水準都不像現在普及,電腦和程式碼運用更集中尖端領域。

(本文由 愛范兒 授權轉載;首圖來源:GitHub