C語言的歷史
本文記述了C語言自20世紀70年代至今的歷史及發展。
早期發展
C語言最早由丹尼斯·里奇(Dennis Ritchie)為了在PDP-11電腦上運行的Unix系統所設計出來的程式語言,第一次發展在1969年到1973年之間。
C源於BCPL語言,後者由馬丁·理察德(Martin Richards)於1967年左右設計實現。BCPL是一門"無類型"的程式語言:它僅能操作一種資料類型,即機器字(machine word)。1970年,肯·湯普遜為執行在PDP-7上的首個Unix系統設計了一個精簡版的BCPL,這個語言被稱為B語言,它也是無類型的。
Unix最早運行在PDP-7上,是以組合語言寫成。在PDP-11出現後,丹尼斯·里奇與肯·湯普遜着手將Unix移植到PDP-11上,無類型的語言在PDP-11上愈發顯得不合適。PDP-11提供了多種不同規格大小的基本對象:一位元組長的字元,兩位元組長的整型數以及四位元組長的浮點數。B語言無法處理這些不同規格大小的對象,也沒有提供單獨的運算子去操作它們。
C語言最初嘗試通過向B語言中增加資料類型的想法來處理那些不同類型的數據。和大多數語言一樣,在C中,每個對象都有一個類型以及一個值;類型決定了可用於值的操作的含義,以及對象佔用的儲存空間大小。
1973年,Unix作業系統的核心正式用C語言改寫,這是C語言第一次應用在作業系統的核心編寫上。
1975年C語言開始移植到其他機器上使用。史蒂芬·強生實現了一套「可移植編譯器」,這套編譯器修改起來相對容易,並且可以為不同的機器生成代碼。從那時起,C在大多數電腦上被使用,從最小的微型電腦到與CRAY-2超級電腦。C語言很規範,即使沒有一份正式的標準,你也可以寫出C程式,這些程式無須修改就可以執行在任何支援C語言和最小執行時環境的電腦上。
C最初在小型機器上實現,並且繼承了一系列小語種程式語言的特點;與功能相比,C的設計者更傾向於簡單和優雅。此外,從一開始,C語言就是為系統級編程而設計,程式的執行效率至關重要,因此,C語言與真實機器能力的良好匹配也就不足為奇。例如,C語言為典型硬件所直接支援的對象:字元,整數(也許有多種大小),以及浮點數(同樣可能有多種大小)提供了相應的基本資料類型。[1]
K&R C
1978年,丹尼斯·里奇和布萊恩·柯林漢合作出版了《C程式語言》的第一版。書中介紹的C語言標準也被C語言程式設計師稱作「K&R C」(柯里C),第二版的書中也包含了一些ANSI C的標準。
K&R C主要引入了以下語言特性:
- 標準I/O庫
- 結構(
struct
)類型 - 長整數(
long int
)類型 - 無號整數(
unsigned int
)類型 - 把運算子
=+
和=-
改為+=
和-=
。因為=+
和=-
會使得編譯器不知道用戶要處理i = -10
還是i =- 10
,使得處理上產生混淆。
即使在後來ANSI C標準被提出的許多年後,K&R C仍然是許多編譯器的最低標準要求,許多老舊的編譯仍然運行K&R C的標準。[2]
ANSI C 和 ISO C
1989年,C語言被美國國家標準協會(ANSI)標準化,編號為ANSI X3.159-1989。這個版本又稱為C89。標準化的一個目的是擴充K&R C,增加了一些新特性。
- void 函數
- 函數可以返回 struct 或 union 類型
- void * 資料類型
1990年,國際標準化組織(ISO)成立 ISO/IEC JTC1/SC22/WG14 工作群組,來規定國際標準的C語言,通過對ANSI標準的少量修改,最終製定了 ISO 9899:1990,又稱為C90。隨後,ANSI亦接受國際標準C,並不再發展新的C標準。[3]
K&R C語言到ANSI/ISO標準C語言的改進包括:
- 增加了真正的標準庫
- 新的預處理命令與特性
- 函數原型允許在函數申明中指定參數類型
- 一些新的關鍵字,包括 const、volatile 與 signed
- 寬字元、寬字串與多位元組字元
- 對約定規則、聲明和型別檢查的許多小改動與澄清
WG14工作小組之後又於1994年,對1985年頒佈的標準做了兩處技術修訂(缺陷修復)和一個補充(擴充)。下面是 1994 年做出的所有修改:
- 3 個新的標準庫標頭檔 iso646.h、wctype.h 和 wchar.h
- 幾個新的記號與預定義巨集,用於對國際化提供更好的支援
- printf/sprintf 函數一系列新的格式代碼
- 大量的函數和一些類型與常數,用於多位元組字元和寬位元組字元[4]
C99
在ANSI的標準確立後,C語言的規範在一段時間內沒有大的變動,然而C++在自己的標準化建立過程中繼續發展壯大。《標準修正案一》在1994年為C語言建立了一個新標準,但是只修正了一些C89標準中的細節和增加更多更廣的國際字元集支援。不過,這個標準引出了1999年ISO 9899:1999的發表。它通常被稱為C99。C99被ANSI於2000年3月採用。
C11
2011年12月8日,ISO正式發佈了新的C語言的新標準C11(之前被稱為C1X),官方名稱為ISO/IEC 9899:2011。新的標準提高了對C++的相容性,並增加了一些新的特性。這些新特性包括泛型、多線程、帶邊界檢查的函數、匿名結構等[5]。
C18
C18沒有引入新的語言特性,只對C11進行了補充和修正[6]。
C2x
C2x引入了一些新特性。目前可以確定的是,C2x標準將加入符合IEEE標準的十進制浮點數,這使得電腦能夠精確地儲存浮點數[7]。
參考資料
- ^ Stephen Prata. C Primer Plus(第5版). 北京: 人民郵電出版社. 2005年2月: 3-4 [2020-06-10]. ISBN 9787115130228 (中文).
- ^ Dennis M. Ritchie,Brian W. Kernighan. C程序设计语言. 北京: 機械工業出版社. 2004年1月 [2020-06-10]. ISBN 9787111128069 (中文).
- ^ Stephen Prata. C Primer Plus(第5版). 北京: 人民郵電出版社. 2005年2月: 12 [2020-06-10]. ISBN 9787115130228 (中文).
- ^ JTC1/SC22/WG14 - C. [2020-06-10]. (原始內容存檔於2020-06-13).
- ^ ISO/IEC 9899:2011 (PDF). [2020-06-10]. (原始內容存檔 (PDF)於2018-03-29).
- ^ ISO/IEC 9899:2018 (PDF). [2020-06-10]. (原始內容存檔 (PDF)於2020-07-22).
- ^ ISO/IEC 9899:202x (PDF). [2020-06-10]. (原始內容存檔 (PDF)於2020-06-10).