程式語言歷史

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

## 1940之前

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

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

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

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

最早的電腦程式碼是針對他們的應用面設計的。例如，阿隆佐·邱奇曾以公式化(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)，名稱取自「FORmula TRANslator」(公式翻譯器)，由約翰·巴科斯等人所發明。
- LISP，名稱取自「LISt Processor」(列舉處理器)，由約翰·麥卡錫等人所發明。
- COBOL，名稱取自「COmmon Business Oriented Language」(通用商業導向語言)，由被葛麗絲·霍普深刻影響的Short Range Committee所發明。

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

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

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

- 一種名為巴科斯-諾爾範式 (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年由Alain 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)。

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

- 2000 - ActionScript
- 2001 - C#
- 2001 - D
- 2001 - Visual Basic .NET
- 2002 - Scratch
- 2003 - Scala
- 2003 - Factor
- 2005 - F#
- 2005 - HolyC
- 2006 - Windows PowerShell
- 2007 - Clojure
- 2008 - Nim
- 2009 - Go
- 2011 - Dart
- 2011 - Kotlin
- 2012 - Julia
- 2012 - TypeScript
- 2012 - Elm
- 2012 - Elixir
- 2014 - Swift (程式語言)
- 2015 - Rust
- 2019 - Bosque
- 2021 - Microsoft Power Fx

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

- 約翰·巴科斯，發明了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.