第一個C編譯器:回顧Dennis Ritchie開創行業的遺留程式碼

BigGo Editorial Team
第一個C編譯器:回顧Dennis Ritchie開創行業的遺留程式碼

由 Dennis Ritchie(也被稱為 dmr)在20世紀70年代早期編寫的原始C編譯器,已成為程式設計師和計算機科學家們的一個引人入勝的歷史文物。這段原始程式碼,現在儲存在 legacy-cc 程式碼庫中,讓我們得以一窺最終發展成為萬億美元產業的謙遜起點。

無法被編譯的編譯器

該程式碼庫包含了大約1972年左右最早的C編譯器版本。有趣的是,這些原始檔無法用現代C編譯器(如 GCC)進行編譯。這些歷史程式碼代表了程式語言發展的過渡階段,多位評論者指出,第一個C編譯器實際上是用B語言編寫的,程式碼庫透過漸進式變化逐步演變,最終成為我們現在所認識的C語言。

「這可能是我最喜歡的軟體之一。從中學到了很多東西!」

來自另一個時代的語法

這些程式碼揭示了早期C語言與其現代版本之間的顯著差異。一位評論者強調了關鍵字如 extern 和 auto 的不尋常用法——這些術語在現代C語言中仍然存在,但今天的功能已經不同。在這些早期檔案中,extern 被用來將全域性符號引入函式作用域,並且所有變數在沒有明確宣告的情況下預設為 int 型別。陣列宣告有時會指定大小,有時則不會,而無大小的陣列本質上就像指標一樣工作。

這種語法代表了許多人所稱的 K&R C(Kernighan 和 Ritchie 的C語言),它早於大多數程式設計師今天所熟悉的標準化 ANSI C/C89。儘管幾十年前就已被棄用,但這種風格在直到最近還被 GCC 透過 -traditional 標誌支援。

關於 legacy-cc 的關鍵資訊

  • 原作者:Dennis Ritchie (dmr)
  • 時期:大約1972年
  • 硬體:為 PDP-11 開發
  • 顯著特點
    • K&R 風格的函式宣告
    • 預設 "int" 型別
    • 不尋常的記憶體管理技術
    • 兩階段編譯器設計

有用資源

創造性的記憶體管理

程式碼庫中最引人入勝的方面可能是一個名為 waste() 的函式,它引發了相當多的討論。該函式似乎透過遞迴自呼叫故意消耗空間:

waste()  /* waste space */
{
 waste(waste(waste),waste(waste),waste(waste));
 waste(waste(waste),waste(waste),waste(waste));
 ...
}

雖然簡短的註釋只是說明浪費空間,但社群分析表明這實際上是一種保留記憶體的巧妙技術。一位評論者解釋說,編譯器的兩個階段都使用這種方法來確保保留的記憶體區域在各階段具有相同的地址,從而允許帶有指標的表示式樹在階段之間高效傳遞。這表明那個時代的硬體限制迫使程式設計師開發出在今天標準看來可能顯得奇怪的創造性解決方案。

歷史影響

這段程式碼的意義遠遠超出了其技術上的奇特之處。正如一位評論者所指出的,Oracle 資料庫的第一個公開可用版本(v2,1979年釋出)是用 PDP-11 的組合語言編寫的。當 Oracle 後來為了跨平臺可移植性用C語言重寫第3版(1983年)時,他們發現大型機缺乏C編譯器。Oracle 沒有用 COBOL 或其他大型機語言重寫資料庫,而是為大型機建立了自己的C編譯器。

這種模式在整個行業中不斷重複,C語言成為系統程式設計的通用語言,使軟體能夠在各種硬體平臺上實現可移植性。與C語言一同開發的 UNIX 作業系統本身,到1980年已被移植到 IBM 的 System/370 大型機上。

對簡單性和複雜性的思考

該程式碼庫引發了關於C語言本質的深思熟慮的討論。雖然許多程式設計師欣賞C語言表面上的簡單性,但幾位評論者指出,這種簡單性在某種程度上是虛幻的。該語言可能很小且接近硬體,但透過隱式型別轉換、別名規則和記憶體管理需求,它包含了顯著的語義複雜性。

正如一位評論者所優雅地表述的那樣,C語言很小,但並不簡單。它被認為的簡單性來自於透過限制強大的抽象來強制程式保持簡單,而不是因為語言本身易於實現或完全理解。

檢視這段歷史程式碼為我們提供了關於計算技術發展歷程的寶貴視角,同時提醒我們,即使是最複雜的現代系統也能追溯到這些謙遜的起點。legacy-cc 程式碼庫成為了一個證明,展示了一個由一位傑出頭腦創造的相對較小的軟體,如何為數十年的技術進步奠定基礎。

參考:legacy-cc