10 種最具影響力的編程語言

前幾天,我讀了這篇“ 20 種有史以來最重要的編程語言”,這是一張“我剛剛編出來的荒謬的表格”。它之所以荒謬,是因為他列出的“最重要的”語言中包含了 Go,但沒有包含 ALGOL、Smalltalk 或 ML。他也沒有提到 Pascal,因為它“基本上已經消亡了”。荒謬!這完全違背了“有史以來最重要”的含義。

那麼,讓我們來討論一下那些“幾乎已經消亡”的語言,以及它們如此重要的原因。

免責聲明:是的,不是所有這些都已經消亡了,也不是所有這些都被遺忘了。就像大多數人一樣,是聽說過 Smalltalk 的,對吧?此外,這可能還會出現上億個錯誤,因為當你對 60 年的計算機歷史進行調查時,你總會犯一些錯誤。如果你發現什麼錯誤,可隨時大聲指責我!

免責聲明 2:是的,我知道其中一些是“首個發明”的,而另一些是“首個普及”的。歷史很複雜!

探測影響力

在開始之前,先簡單介紹一下如何尋找影響力。僅僅知道 X 是首個具有 Z 特性的語言並不意味著 X 實際上影響了 Z。雖然 Absys 可以說是首個邏輯編程語言,但幾乎所有的邏輯編程實際上都是源於 Prolog 了,後者是獨立開發的。最終,只有一種方法可以確定 X 影響了 Y:引用。這意味著:

  • Y 在其參考手冊中引用了 X;
  • Y 引用了的論文中引用了 X;
  • Y 的作者說過“我們受到了 X 的影響”。

引用是可傳遞的。有時,Q 語言的手冊會列出激勵性文獻 R,其中 R 引用了論文 S 作為靈感,並提到 S 的靈感是從語言 T 那裡得到的。那麼,我們就知道 T 影響了 Q,即使這個鏈條有好幾個步驟。這意味著需要通過多種途徑尋找信源。為了加快速度,我們使用啟發式的方法來決定在哪裡查找。

一種有效的啟發式方法是編程語言的同根詞。對於語言來說,獨立地提出相同的語法是非常罕見的。因此,如果兩種語言某種語法相同,則其中一種可能會影響另一種。例如:即使沒有閱讀 Matz 的設計決策,我們也知道 Ruby 受到了 Smalltalk 的影響,因為它們都使用 select 方法過濾列表。這不是確鑿的證據。也許它是 Matz 獨立開發出來的,也許 Ruby 和 Smalltalk 都受到共同祖先的影響。但這給了我們一個開始尋找的方向。

語言

COBOL

背景:CODASYL,1960 年。COBOL 是由計算領域的商業 / 科學分裂形成的。那時,高級工業語言要麼用於工程計算,要麼用於管理數據。工程師們都支持 FORTRAN,而商業世界卻是一團亂碼,充斥著諸如 COMTRAN、FLOW-MATIC 等語言,因此,國防部成立了一個委員會,共同制定了一種通用的商業語言。那就是 COBOL。

COBOL 與 ALGOL、FORTRAN 和 LISP 一起構成了四種“母”語。今天,雖然我們認為它是小語種,但它曾經是世界上最流行的語言。我們的許多遺留商業系統仍然在其上運行著。

重要意義:就語法和語義而言,我們在現代計算中很少看到 COBOL 了。 COBOL 最重要的附加功能是提出了記錄數據的概念。在 FORTRAN 和 ALGOL 中,唯一的數據結構是靜態數組。但是,在 COBOL 中,我們可以讀取包含分層數據的結構化文件,它會自動將這些文件解構為代表變量。它是現代結構體的先驅。

消亡原因:這裡有兩個因素。一:COBOL 與其他 PLT 所做的工作沒有重疊。很少有人會基於 COBOL 進行構建。這意味著,建立在祖先教訓之上的第二代或第三代語言幾乎沒有 COBOL 基因了。這不是 COBOL 的本質問題,更多的是因為學術界對 COBOL 的創建過程不屑一顧。CODASYL 是一個商業團體,顯然它不值得關注(1)。即使是對於今天的語言來說,COBOL 也是非常複雜的。這意味著 COBOL 編譯器在微型計算機和微型電腦上落後於同時代的編譯器,為其他語言的繁榮並最終超越它提供了空間。

ALGOL

背景:ALGOL 委員會,1960 年。ALGOL-58 早在兩年前就問世了,但很快就被取代了,因此我將它們組裝在一起。該委員會想為算法研究提供一種良好的語言。換句話說,ALGOL 是一種形式化的“偽代碼”。

在四種母語中,ALGOL 是最早“消亡”的語言。大家仍然知道 LISP(2) ,COBOL 仍然為大量的遺留系統提供支持,並且大多數科學軟件包仍然具有 FORTRAN。但是我見過很多程序員,他們甚至都沒有聽說過 ALGOL。你可能會認為它是最不重要的母語了,但事實恰恰相反。在這四種母語中,只有 LISP 可以與 ALGOL 的普遍重要性相提並論。

重要意義:讓我們來看一下:詞法作用域、結構化編程、嵌套函數、形式化語言規範、按名稱調用語義、BNF 語法、塊註釋……今天的每一種現代語言都深受 ALGOL 的影響。

消亡原因:ALGOL 是一種研究語言,而不是商業語言。它是專為算法研究而設計的。規範沒有定義任何 I/O,這使得它在實踐中無法使用。當然,你可以編寫一個編譯器擴展,但是你還需要添加更多其他的東西。

人們就是這麼做的。 1960 年,有 70 人通過用 I/O 和額外的數據結構來擴展 ALGOL,開發了大量的類似 ALGOL 的語言。這包括 JOVIAL、SIMULA、CLU 和 CPL。後來的語言都是基於這些類 ALGOL 語言而不是直接基於 ALGOL 進行擴展的。我們稱 C 為“類 ALGOL(ALGOL-like)”,但實際上它是“類 BCPL(BCPL-like)”,也就是“類 CPL(CPL-like)“,即為類 ALGOL。 ALGOL 的孩子們把它埋沒了。

最終,ALGOL 人試圖將其擴展到 ALGOL-68,而 ALGOL-68 完全脫離了 ALGOL-60,但它並沒有獲得那麼大的影響力。 ALGOL-60 的血統通過 Nikolaus Wirth 的 Pascal 仍在延續。

APL

背景:Ken Iverson,1962 年。最初它是一種用於數組數學的手寫表示法,後來 IBM 將其作為編程語言使用。作為一種語言,APL 專注於數組處理:它能夠精確地處理大數字塊。

如果你以前曾聽說過 APL,則可能知道它是“那種奇怪的符號語言”。最臭名昭著的代碼片段之一就是這個“生命遊戲(the Game of Life)”的實現:

<code>life←{↑1 ⍵∨.∧3 4=+/,¯1 0 1∘.⊖¯1 0 1∘.⌽⊂⍵}/<code>

必須使用專用的鍵盤來編寫它,就像這樣:

10 種最具影響力的編程語言

APL 鍵盤(來源)

儘管如此,APL 因其內存需求低而在大型機上廣受歡迎。

重要意義:數組處理。每次將兩個數字列表相加就意味著需要一個映射或一個循環,APL 引入了同時操作整個數組的概念。例如:

<code>   1 + 1 2 3 4
2 3 4 5
1 2 3 4 + 1 2 3 4
2 4 6 8
2 4 ⍴ ⍳8
1 2 3 4
5 6 7 8
1 2 3 4 +[2] 2 4 ⍴ ⍳8
2 4 6 8
6 8 10 12/<code>


這在科學界確實是一件大事。如此多的應用數學都可歸結為對大型矩陣的大規模運算。當你可以把外部產品 ∘.f ,外部產品就很容易拿到了!

通過這一創新,APL 引出了 R、numpy、pandas、Matlab 等。APL 的直系後代還包括:J、Dyalog、K、Q。它們雖然沒有那麼成功,但在金融領域仍然有大量的應用。

消亡原因:很明顯,問題在於鍵盤。如果你無法使用 ASCII 進行編寫,那麼你就不能編寫太多的內容。Iverson 用 J 修復了該問題,J 使用了有向圖來代替不同的符號。編寫~:,而不是≠。不過,那是在 1990 年,要普及一種完全不同的編程風格還是為時已晚了。

更微妙的問題在於,APL 和 J 僅適用於同構數據的處理。不能將字符串和數字都存儲在同一個數據結構中(除非你使用 box,這是一個完整的“蠕蟲罐頭”),並且處理字符串通常是一場噩夢。因此沒有數據幀,這就將許多現代數據科學排除在外了。

擴展閱讀:作為思想工具的符號。

BASIC

背景:John Kemeny,1964 年。最初它是一種簡化了的類 FORTRAN 語言,旨在幫助工程技術以外的人們使用計算機。

BASIC 的真正騰飛是在微型計算機時代。最初的微型計算機沒有足夠的內存來編譯“真正的”編程語言,而我們可以把 BASIC 編譯器精簡到大約 2 KB。 BASIC 成為了早期程序員的通用語言。在 20 世紀 70 年代,如果你在家編程,那麼你可能是在微型計算機上編寫 BASIC。

<code>10 PRINT "Hello, World!"20 END/<code>

重要意義:其最大的技術影響力在於運行時解釋器。 BASIC 是首個具有實時解釋器( the Dartmouth Time Sharing System,達特茅斯時間共享系統)的語言,領先了 APL 一年。而且 APL 系統僅面向 IBM 客戶,因此,在很長一段時間內,實時解釋器就是 BASIC 的,或是不存在的。(3)

BASIC 有更大的社會影響力。它為家庭,尤其是孩子們帶來了編程。 在 80 年代和 90 年代,許多有影響力的程序員首先學習的都是如何使用 BASIC 編程。許多企業程序也是用 BASIC 編寫的,這可能加速了 Cobol 的衰落。

BASIC 還有一個妙招:Office 工具!微軟最終將 BASIC 變成了 Visual Basic,並將其用作 Office 的宏語言。之後,將它擴展到了 OpenOffice 和 LibreOffice,從而鞏固了 BASIC 在特定利基市場的地位。最近,它已被 JavaScript 取代,現在成為了一種遺留的宏語言。

消亡原因:人們認為 BASIC 是一種“次要”的語言。如果你是個小孩或小企業主,你可能會使用它,但是真正的程序員使用的是真正的語言。一旦製造商可以廉價地製造出具有超過 16k 內存的微型計算機時,他們就開始會為了 Pascal 和 C 而貶低 BASIC 了。

BASIC 作為一種遺留的語言教學方式在孩子們的生活中延續了一段時間,但似乎也已經消失在這個利基市場之外了。

PL/I

** 背景:IBM,1966 年。IBM 的業務被分成兩種語言:科學家使用 FORTRAN,商業人士使用 COMTRAN。面對來自 COBOL 的競爭,為了簡化系統,他們試圖開發一種對工程和商業都有用的語言。它看起來像是兩種語言的超集,在頂部還添加了許多附加功能。(4)** 現在每個人都可以使用相同的語言了,並且 IBM 可以賺很多錢!耶!

重要意義:ALGOL-68 的作者嘲笑 PL/I,將其稱為過時的語言。但是 ALGOL-68 所做的每件事情,PL/I 都能做得更快更好。雖然 COBOL 是首個提出結構化數據的,但 PL/I 是首個將其作為類型實現的語言。在 COBOL 中,使用名稱讀取用戶會用到兩個全局變量:user 和 name。在 PL/I 中,可以使用一個帶有 user.name 字段的變量。 PL/I 還是首個使用了指針操作直接內存、使用了常量和函數重載的高級語言。(5)

這些概念中有許多是通過 C 進入主流編程的,C 是 BCPL 和 PL/I 的結合體。 C 甚至使用了 PL/I 的註釋語法。

消亡原因:所有的 FORTRAN 程序員都認為它太像 COBOL 了,而所有的 COBOL 程序員都認為它太像 FORTRAN 了。 IBM 曾試圖用一種語言來處理這兩種既定的語言,但這種語言要複雜得多。他們是唯一使用編譯器的團隊,但這也無濟於事,這意味著其他所有人都不信任廠商鎖定。當 IBM 能夠在這兩個問題上取得進展時,更廣闊的計算世界已經進入到了微型計算機時代,在那裡 PL/I 被 BASIC 淘汰了。

擴展閱讀: PL/I 的選擇。

SIMULA 67

背景:Ole Dahl 和 Kristen Nygaard,1967 年。他們擴展了 ALGOL 來進行仿真。首先,他們開發了 SIMULA I,它具有專用的仿真器和“活動”語法。 SIMULA I 獲得了一些早期的應用,但是兩人對該語言的“專業化”程度以及在仿真中存在的大量重複代碼感到不滿。他們希望創建一個更通用的框架來表示一般事物,而不僅僅是仿真。

他們的想法是允許用戶使用多態函數解析來定義稱之為“類”的新類型。然後,用戶可以將仿真特性作為對象系統中的一個特例來進行構建,從而用戶就可以輕鬆根據自己的特定需求來定製對應的仿真特性了。

重要意義:雖然 SIMULA 並不是首個“真正的” OOP 語言,但它是首個具有適當對象的語言,併為其他語言的構建奠定了基礎。這包括類 / 對象的拆分、子類、虛擬方法和受保護的屬性等。 它幾乎啟發了所有 1967 年之後的關於對象的學術研究。CLU 和 ML 都將 SIMULA 作為其主要靈感的來源。 Bjarne Stroustroup 在 SIMULA 上完成了他的博士學位,最終將它的許多思想整合到了 C ++ 中。

消亡原因:在同一份博士論文中,Stroustroup 聲稱 SIMULA 太慢了,無法大規模使用。 “如果你不在大型機上工作,那麼祝你一切順利”。值得一提的是,Smalltalk-80 採用了同樣的思路,甚至更進了一步,它在背後還附加了 13 年的摩爾定律。甚至 Smalltalk 也常常被嘲笑太慢了。每個人都在 SIMULA 中實現了他們可以集成到更快、更簡單的語言中的想法。

擴展閱讀:編譯 SIMULA:技術起源的歷史研究,《SIMULA 的歷史》。

Pascal

背景:Niklaus Wirth,1970 年。在 ALGOL-68 的結構變得過於複雜,而不適合 Wirth 的喜好之後,他抓住了 ALGOL-60 的精髓從而開發了 Pascal。Pascal 最初是作為“ CS 入門”語言而發展起來的,到 80 年代初,它已成為了 Usenet 工作板上第二受歡迎的語言。Wirth 認為整個 Pascal、Modula、Oberon 家族是一個統一的語言概念。

重要意義:Pascal 沒有引入任何全新的觀點。它是一種刻意保守的語言,它試圖挑選出過去十年最好的部分,並以一個統一的包來提供它們。 Pascal 將 ALGOL 語法帶出了學術界,以至於 ALGOL 的賦值語法 := 被稱為“Pascal 風格”。從這一點上來看,大多數看起來像 ALGOL 的語言特性很可能是受 Pascal 啟發的,而不是直接受 ALGOL 本身啟發的。

儘管 Pascal 並不是很有創意,但它的變體卻很有創意。Wirth 還率先提出了“逐步細化”的概念,以作為編寫嚴謹軟件的一種手段。這最終導致了 Modula(推廣了一級軟件模塊)和 Euclid(首個用於生產的形式化驗證語言)的產生。

消亡原因:我在此稱之為“加擊”。與這個列表中的大多數其他語言不同,Pascal 沒有重大的結構化障礙,也沒有強有力的競爭對手。當然,它與 C 存在競爭關係,但在很長一段時間裡,它仍然表現良好。人們通常將其歸因於“為什麼 Pascal 不是我最喜歡的語言”這篇論文,但這個答案太簡潔了,而歷史要複雜得多。另外,Delphi 在 TIOBE 和 PYPA 度量中仍然排名很高,因此它並沒有像 SIMULA 一樣完全消亡了。對 Pascal 隕落的準確分析比本文其餘部分還要長的多。

擴展閱讀:編程語言Pascal , Pascal 及其繼承者。

CLU

背景:Barbara Liskov,1975 年。Liskov 想要處理抽象數據類型。它就這樣產生了。這就是 CLU 的全部原因。

重要意義:CLU 可能是人們從未聽說過的最有影響力的語言。迭代器? CLU。抽象數據類型?CLU。泛型? CLU。異常檢查? CLU。

我們並沒有採用相同的術語,因此它並不是 100%都來自於 CLU,但仍然如此。未來十年的每種語言規範都是對 CLU 進行命名的。 CLU 做了很多。

消亡原因:CLU 是一種展示性語言。Liskov 想讓人們接受她的想法,而不是這種特定的語言。他們做到了:如今幾乎所有的語言都應歸功於 CLU。她一完成 CLU,便轉到了 Argus,該項目本來是為了展示她關於併發的想法。它並沒有採用幾乎相同的方法,而且留下了很多需要挖掘的東西。

擴展閱讀:

CLU 的歷史

ML

背景:Robin Milner,1976 年 6 月,Milner 正在構建 LCF 校準器,這是首批校準器助手之一。如果採用正確的格式編寫了一份證明,LCF 可以檢查出它是否正確。為了幫助撰寫證明,Milner 創建了一個基於健全數學形式的元語言,這在當時意味著嚴格的靜態類型和高階函數。最終,ML 被標準化為 Standard ML。

重要意義:ML 可以說是最古老的“代數編程語言”。有很多東西可以歸因於 ML:代數數據類型、模塊、類型化函數式編程。令人驚訝的是,它並不是第一次這樣做的!設計第一個 ML 只是為了配合 LCF 的使用,它並不是一種通用語言,因此缺少了許多這類特性。隨著人們開始更廣泛地使用它,他們從其他研究語言中汲取了一些想法並將其納入 ML。不過,一個非常重要的概念確實源於 ML:類型推斷。 ML 是首個無需鍵入類型的靜態類型語言,因為編譯器會為你找出相應類型。這為類型化 FP 逃離學術界並進入生產應用鋪平了道路。

ML 還極大地影響了現代定理的校驗。 Isabelle、CVC3 和 Coq 的“程序”語言都是基於 ML 的。儘管近年來,FP 的 Haskell 分支變得越來越流行,但很多類型理論都是基於 ML 的。

(7)

消亡原因:ML 具有許多有趣的特性,但人們關注它僅是因為它的類型推斷。當時 ML 仍然是一種專用於定理校驗的語言。 SML 與 Haskell 在同一年問世,Haskell 是一種“更純粹”的類型化 FP 語言示例。

Smalltalk

背景:Alan Kay,1972 年、1976 年和 1980 年。這有一個不斷變化的目標。 Smalltalk-72 是首個,Smalltalk-76 將“面向對象編程”的概念引入到了更廣闊的世界,而 Smalltalk-80 則被廣泛採用。

Smalltalk 不是首個使用對象的語言,但它是首個提出“面向對象”的語言。區別在於,Simula 除了具有數字和布爾值等基本類型之外,還具有其他的對象,而在 Smalltalk 中,布爾值也是對象。如果你想了解更多,可以查看我寫在這裡的內容。

重要意義:我們有時認為 Smalltalk 是“真正的” OOP,而 Java 和 Python 之類的語言並不是“真正的” OOP,但事實並非如此。就像其他範式一樣,OOP 是一個由許多不同影響所組成的巨大的混合體。但 Smalltalk 無疑是推廣這一概念。如果你翻開 80 年代中期或 90 年代初期的任何一本關於 OOP 基礎理論的書籍,它們都是建立在 Smalltalk 上的。許多人還將 Smalltalk 示例轉換為 C++,少數人將使用另一種語言,但每個人都會使用 Smalltalk。

Smalltalk 還傳播了對象可作為共享數據的概念,從而導致了 CORBA 的出現,並啟發創建了可計算 Actor 模型。

消亡原因:人們普遍認為 Smalltalk 衰落,是因為人們改用了 C++。但這並不是真的。 Smalltalk 確實有一些問題,特別是它很難與其他工具交互,並且運行時性能很差。但是,即使到了 1990 年代,Smalltalk 仍在做著受人尊敬的生意,許多人認為它將成為一種占主導地位的商業語言。

Java 的發展趨勢:

10 種最具影響力的編程語言

(來源)

Smalltalk 並不是“Javapocalypse”的唯一受害者:Java 還邊緣化了 Eiffel、Ada95 以及 OOP 世界幾乎所有的其他語言。一個有趣的問題不是“為什麼 Smalltalk 會消亡”,而是“為什麼 C++ 能夠生存”。我認為這是因為 C++ 具有更好的 C 互操作性,因此能更容易地擴展到遺留系統中。

總結

這只是已消亡的重要語言中的一小部分。我沒有涵蓋 ALPHARD、ALTRAN、Argus、Automath、BCPL、COMTRAN、CPL、Eiffel、FLOW-MATIC、HOPE、Hypercard、ISWIM、JOVIAL、MacSyma、Mesa、Miranda、Multics Shell、PLANNER、SMP、Sketchpad 或 SNOBOL 。它們都以自己的方式為現代編程領域做出了貢獻。歷史是複雜的。

最具影響力的語言從未成為主流。很少有人會使用它們中的任何一個。但是每一種語言都鼓舞了人們,也鼓舞了其他人,因此這些被遺忘的語言的基因在它們被遺忘了幾十年後才顯現出來。但也有不計其數的語言沒有把它們的想法表達出來。 《編程語言百科全書》列出了 8,000 多種編程語言。它們中的許多想法從未消失。想想如果沒有人聽說過 SIMULA,或者 Liskov 從未分享過 CLU,我們將會損失多少東西。

這就是我喜歡研究歷史的原因之一。去了解我們丟失了什麼並重新將其找回來。


這篇文章的初稿最初是在我的時事通訊上分享的。如果你覺得它很有趣,為什麼不訂閱它呢?

感謝 Miikka Koskinen 、 Kevlin Henney 、Eric Fischer 和 Levi Pearson 對本文更正和反饋。


備註

  1. 這很諷刺。
  2. 不管怎樣,人們都知道 Lisplikes,足夠接近了。
  3. 究竟是 BASIC 還是 JOSS 是首個尚存爭議,因為它們幾乎是在同一時間開發的,而且都分階段推出的。但是 JOSS 只有幾百個用戶,對現代語言幾乎沒有影響。
  4. 請注意,PL/I 讀作“Programming Language One”,而不是“Programming Language Eye”。I 應該是羅馬數字。
  5. PL/I 實際上將這些稱為“泛型函數”,但其實現與重載相同。PL/I 沒有任何抽象數據類型的概念,而這種抽象數據類型出現是十年之後的事情了。
  6. 這裡的時間軸有點奇怪。人們說它是在 1972-73 年出版的,但他們在 1977 年時提交 POPL 論文時,聲稱它時在“兩年前”可用的。
  7. Haskell 從 HOPE 和 Miranda 那裡獲得的收益比 ML 還要多。

關注我並轉發此篇文章,私信我“領取資料”,即可免費獲得InfoQ價值4999元迷你書!


分享到:


相關文章: