Categories
程式開發

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)”的實現:

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

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

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

APL鍵盤(來源

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

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

   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

這在科學界確實是一件大事。如此多的應用數學都可歸結為對大型矩陣的大規模運算。當你可以把外部產品 ∘.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。

10 PRINT "Hello, World!"
20 END

重要意義:其最大的技術影響力在於運行時解釋器。 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隕落的準確分析比本文其餘部分還要長的多。

擴展閱讀:編程語言PascalPascal及其繼承者

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種最具影響力的編程語言 2

來源

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 KoskinenKevlin 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還要多。

原文鏈接:

https://www.hillelwayne.com/post/influential-dead-languages/