程式語言歷史

本條目探討**程式語言**在歷史上的主要發展。更詳細的事件發生年表，請參閱程式語言年表。

## 1940 之前

第一個程式語言的出現早於現代的計算機的誕生。首先，這種語言是種代碼。

於 1804 年發明的雅卡爾織布機，運用打孔卡上的坑洞來代表縫紉織布機的手臂動作，以便自動化產生裝飾的圖案。

愛達・勒芙蕾絲在 1842 年至 1843 年間花費了九個月，將義大利數學家費德里科・路易吉關於查爾斯・巴貝奇新發表機器分析機的回憶錄翻譯完成。她於那篇文章後面附加了一個用分析機計算伯努利數方法的細節，被部分歷史學家認為是世界上第一個電腦程式。

赫爾曼・何樂禮在觀察列車長對乘客票根在特定位置打洞的方式後得到靈感，把資訊編碼記載到打孔卡上，隨後根據這項發現使用打孔卡來編碼並紀錄 1890 年的人口統計資料。

第一個計算機程式碼是針對他們的應用面設計的。在 20 世紀的前十年主要是用十進位來算數，後來人們發現不只是用文字，也可以用數字來表現邏輯。例如，阿隆佐・邱奇曾以公式化 (formulaic) 的方式表達 λ 演算。圖靈機是一種紙帶標記 (tape-marking) 機器 (就像電話公司用的那種) 操作方法抽象化後的集合。圖靈機這種透過有限數字 (finite number) 呈現機器的方式，奠定了程式如同馮・紐曼結構計算機中的資料一樣地儲存的基礎。但不同於 λ 演算，圖靈機的程式碼並沒有辦法成為高階程式語言的基石，這是是因為它主要的用途是分析演算法的複雜度。

第一個現代程式語言很難界定。最一開始是因為硬體限制而限定了語言，打孔卡允許 80 行 (column) 的長度，但某幾行必須用來記錄卡片的順序。FORTRAN 則納入了一些與英文字詞相同的關鍵字，像是「IF」、「GOTO」（原字詞為 go to），以及「CONTINUE」。之後採用磁鼓作為記憶體使用，也代表計算機程式也必須插入 (interleave) 到磁鼓的轉動 (rotation) 中。和現今比較起來，這也讓程式語言必須更加依賴硬體 (hardware-dependent)。

對部分的人認為必須在「程式語言」的狀態確立之前，根據能力 (power) 以及可讀性 (human-readability) 的程度來決定歷史上第一個程式語言是什麼語言。提花織布機和查爾斯・巴貝奇所製作的差分機都具備在大量限制下，簡單描述機器應執行行為的語言。也有種並非設計給人類運用的受限特定領域語言，是將打孔卡運用到自動演奏鋼琴上。

## 1940 年代

最早被確認的現代化、電力啟動 (electrically powered) 的計算機約在 1940 年代被創造出來。程式設計師在有限的速度及記憶體容量限制之下，撰寫人工調整 (hand tuned) 過的組合語言程式。而且很快就發現到使用組合語言的這種撰寫方式需要花費大量的腦力 (intellectual effort) 而且很容易出錯 (error-prone)。

康拉德・楚澤於 1948 年發表了他所設計的 Plankalkül 程式語言的論文。但是在他有生之年卻未能將該語言實作，而他原本的貢獻也被其他的發展所孤立。

## 1950 與 1960 年代

有三個現代程式語言於 1950 年代被設計出來，三者衍生的語言直到今日仍舊廣泛地被採用：

* FORTRAN (1955)，名稱取自「**FOR**mula **TRAN**slator」(公式翻譯器)，由約翰・巴科斯等人所發明；
* LISP，名稱取自「**LIS**t **P**rocessor」(列舉處理器)，由約翰・麥卡錫等人所發明；
* COBOL，名稱取自「**CO**mmon **B**usiness **O**riented **L**anguage」(通用商業導向語言)，由被葛麗絲・霍普深刻影響的 Short Range Committee 所發明。

另一個 1950 年代晚期的里程碑是由美國與歐洲計算機學者針對「演算法的新語言」所組成的委員會出版的《ALGOL 60 報告》（名稱取自「**ALGO**rithmic **L**anguage」，即演算法語言）。這份報告強化了當時許多關於計算的想法，並提出了兩個語言上的創新功能：

* 巢狀區塊結構：可以將有意義的程式碼片段群組成一個塊，而非轉成分散且特定命名的程式。
* 詞法作用域：區塊可以有區塊外部無法透過名稱存取，屬於區塊本身的變數、程式以及函式。

另一個創新則是關於語言的描述方式：

* 一種名為巴科斯 - 諾爾範式 (BNF) 的數學化精確符號被用於描述語言的語法。之後的程式語言幾乎全部都採用類似 BNF 的方式來描述程式語法中上下文無關的部份。

Algol 60 對之後語言的設計上帶來了特殊的影響，部分的語言很快的就被廣泛採用。後續為了開發 Algol 的擴充子集合，設計了一個名為 Burroughs 大型系統。

延續 Algol 的關鍵構想所產生的成果就是 ALGOL 68：

* 語法跟語意變的更加正交 (orthogonal)，採用匿名的常式 (routines)，採用高階 (higher-order) 功能的遞迴式類型 (typing) 系統等等。
* 整個語言及語意的部分都透過為了描述語言而特別設計的 Van Wijngaarden grammar 來進行正式的定義，而不僅止於上下文無關的部份。

Algol 68 一些較少被使用到的語言功能 (如同步與並列區塊)、語法捷徑的複雜系統，以及型態自動強制轉換 (coercions)，使得實作者興趣缺缺，也讓 Algol 68 獲得了「難用」的名聲。尼克勞斯・維爾特就乾脆離開該設計委員會，另外再開發出更簡單的 Pascal 語言。

在這段期間被開發出來的重要語言包括有：

* 1951 - Regional Assembly Language
* 1952 - Autocode
* 1954 - FORTRAN
* 1954 - IPL (LISP 的先驅)
* 1955 - FLOW-MATIC (COBOL 的先驅)
* 1957 - COMTRAN (COBOL 的先驅)
* 1958 - LISP
* 1958 - ALGOL 58
* 1959 - FACT (COBOL 的先驅)
* 1959 - COBOL
* 1962 - APL
* 1962 - Simula
* 1962 - SNOBOL
* 1963 - CPL (C 的先驅)
* 1964 - BASIC
* 1964 - PL/I
* 1967 - BCPL (C 的先驅)

## 1960 年代晚期 - 1970 年代晚期：確立了基礎範式

1960 年代晚期至 1970 年代晚期的期間中，程式語言的發展也有了重大的成果。大多數現在所使用的主要語言範式都是在這段期間中發明的：

* **Simula**，於 1960 年代晚期由奈加特與達爾以 Algol 60 超集合的方式發展，同時也是第一個設計支援物件導向進行開發的程式語言。
* **C**，於 1969 至 1973 年間由貝爾實驗室的研究人員丹尼斯・里奇與肯・湯普遜所開發，是一種早期的系統程式設計語言。
* **Smalltalk**，於 1970 年代中期所開發，是一個完全從零開始 (ground-up) 設計的物件導向程式語言。
* **Prolog**，於 1972 年由 Colmerauer、Roussel 以及 Kowalski 所設計，是第一個邏輯程式語言。
* **ML**，於 1973 年由羅賓・米爾納所發明，是一個基於 Lisp 所建構的多型 (polymorphic) 型態系統，同時也是靜態型別函式程式語言的先驅。

這些語言都各自演展出自己的家族分支，現今多數現代程式語言的祖先都可以追溯他們其中至少一個以上。

在 1960 年代以及 1970 年代中結構化程式設計的優點也帶來許多的爭議，特別是在程式開發的過程中完全不使用 GOTO。這項爭議跟語言本身的設計非常有關係：某些語言並沒有包含 GOTO，這也強迫程式設計師必須結構化地編寫程式。儘管這個爭議在當時吵翻了天，但幾乎所有的程式設計師都同意就算語言本身有提供 GOTO 的功能，在除了少數罕見的情況下去使用 GOTO 是種不良的程式風格。結果是之後世代的程式語言設計者發覺到結構化程式語言的爭議實在既乏味又令人眼花繚亂。

在這段期間被開發出來的重要語言包括有：

* 1968 - Logo
* 1970 - Pascal
* 1970 - Forth
* 1972 - C
* 1972 - Smalltalk
* 1972 - Prolog
* 1973 - ML
* 1975 - Scheme
* 1978 - SQL (起先只是一種查詢語言，擴充之後也具備了程式結構)

## 1980 年代：增強、模組、效能

1980 年代的程式語言與之前相較顯得更為強大。C++ 合併了物件導向以及系統程式設計。美國政府標準化一種名為 Ada 的系統程式語言並提供給國防承包商使用。日本以及其他地方運用了大量的資金對採用邏輯程式語言結構的第五代程式語言進行研究。函式程式語言社群則把焦點轉移到標準化 ML 及 Lisp 身上。這些活動都不是在開發新的範式，而是在將上個世代發明的構想進一步發揚光大。

然而，在語言設計上有個重大的新趨勢，就是研究運用模組或大型組織化的程式單元來進行大型系統的開發。Modula、Ada，以及 ML 都在 1980 年代發展出值得注意的模組化系統。模組化系統常拘泥於採用泛型程式設計結構：泛型存在 (generics being)、本質 (essence)，參數化模組 (parameterized modules)。(參閱多型)

儘管沒有出現新的主要程式語言範式，許多研究人員仍就擴充之前語言的構想並將它們運用到新的內容上。舉例來說，Argus (程式語言) 以及 Emerald 系統的語言配合物件導向語言運用到分散式系統上。

1980 年代的程式語言實作情況也有所進展。電腦系統結構中 RISC 的進展假定硬體應當為編譯器設計，而非身為人類的組合語言程式設計師。藉由中央處理器速度增快的幫助，編譯技術也越來越積極，RISC 的進展對高階語言編譯技術帶來不小的關注。

語言技術持續這些發展並邁入了 1990 年代。

在這段期間被開發出來的重要語言包括有：

* 1980 - Ada
* 1983 - C++ (就像有類別的 C)
* 1984 - Common Lisp
* 1985 - Eiffel
* 1986 - Erlang
* 1987 - Perl
* 1988 - Tcl
* 1989 - FL (Backus)

## 1990 年代：網際網路時代

1990 年代未見到有什麼重大的創新，大多都是以前構想的重組或變化。這段期間主要在推動的哲學是提升程式設計師的生產力。許多 "快速應用程式開發" (RAD) 語言也應運而生，這些語言大多都有相應的整合開發環境、垃圾回收等機制，且大多是先前語言的衍生語言。這類型的語言也大多是物件導向的程式語言，包含有 Object Pascal、Visual Basic，以及 C#。Java 則是更加保守的語言，也具備垃圾回收機制。與其他類似語言相比，也受到更多的觀注。新的手稿語言則比 RAD 語言更新更好。這種語言並非直接從其他語言衍生，而且新的語法更加開放地 (liberal) 與功能契合。雖然手稿語言比 RAD 語言來的更有生產力，但大多會有因為小程式較為簡單，但是大型程式則難以使用手稿語言撰寫並維護的顧慮。儘管如此，手稿語言還是網路層面的應用上大放異彩。

在這段期間被開發出來的重要語言包括有：

* 1990 - Haskell
* 1991 - Python
* 1991 - Visual Basic
* 1993 - Ruby
* 1993 - Lua
* 1994 - CLOS (part of ANSI Common Lisp)
* 1995 - Java
* 1995 - Delphi (Object Pascal)
* 1995 - JavaScript
* 1995 - PHP
* 1997 - REBOL
* 1999 - D

## 現今的趨勢

程式語言持續在學術及企業兩個層面中發展進化，目前的一些趨勢包含有：

* 在語言中增加安全性與可靠性驗證機制：額外的堆疊檢查、資訊流 (information flow) 控制，以及靜態執行緒安全。
* 提供模組化的替代機制：混入，委託，以及剖面導向。
* 元件導向 (component-oriented) 軟體開發。
* 元程式設計、反射或是存取抽象語法樹。
* 更重視分散式及移動式的應用。
* 與資料庫的整合，包含 XML 及關聯式資料庫。
* 支援使用 Unicode 編寫程式，所以原始碼不會受到 ASCII 字元集的限制，而可以使用像是非拉丁語系的指令碼或延伸標點符號。
* 圖形化使用者介面所使用的 XML (XUL、XAML)。

在這段期間被開發出來的重要語言包括有：

* 2001 - C#
* 2001 - Visual Basic .NET
* 2002 - F#
* 2003 - Scala
* 2003 - Factor
* 2006 - Windows PowerShell
* 2007 - Clojure
* 2009 - Go
* 2014 - Swift (程式語言)

## 程式語言發展史上的傑出人物

* 約翰・巴科斯，發明了 Fortran。
* 阿蘭・庫珀，開發了 Visual Basic。
* 艾茲格・迪傑斯特拉，開創了正確運用程式語言 (proper programming) 的框架。
* 詹姆斯・高斯林，開發了 Oak，該語言為 Java 的先驅。
* 安德斯・海爾斯伯格，開發了 Turbo Pascal、Delphi，以及 C#。
* 葛麗絲・霍普，開發了 Flow-Matic，該語言對 COBOL 造成了影響。
* 肯尼斯・艾佛森，開發了 APL，並與許國華合作開發了 J。
* 比爾・喬伊，發明了 vi，BSD Unix 的前期作者，以及 SunOS 的發起人，該作業系統後來改名為 Solaris。
* 艾倫・凱，開創了物件導向程式語言，以及 Smalltalk 的發起人。
* 布萊恩・柯林漢，與丹尼斯・里奇合著第一本 C 程式設計語言的書籍，同時也是 AWK 與 AMPL 程式設計語言的共同作者。
* 約翰・麥卡錫，發明了 LISP。
* 約翰・馮・諾伊曼，作業系統概念的發起者。
* 丹尼斯・里奇，發明了 C。
* 比雅尼・史特勞斯特魯普，開發了 C++。
* 肯・湯普遜，發明了 Unix。
* 尼克勞斯・維爾特，發明了 Pascal、Modula 與 Oberon。
* 拉里・沃爾，創造了 Perl 與 Raku。
* 吉多・范羅蘇姆，創造了 Python。

## 參閱

* ACM 程式設計語言研討會歷史
* 編譯器撰寫歷史
* 計算機硬體歷史
* 程式語言
* 計算年表
* 程式語言年表
* 程式語言列表

## 參考文獻

## 延伸閱讀

* Sammet, Jean E., "Programming Languages: History and Fundamentals" Prentice-Hall, 1969

## 外部連結

* The History of Programming Languages by Diarmuid Pigott
* History and evolution of programming languages.
* The Evolution of Programming Languages （頁面存檔備份，存於網際網路檔案館） by Peter Grogono. PDF.
* Graph of programming language history （頁面存檔備份，存於網際網路檔案館）
* Topics in history and comparing programming languages by Dennie Van Tassel.