本文記述了C語言自20世紀70年代至今的歷史及發展。

早期發展

編輯
 
肯·湯普遜和丹尼斯·里奇,是C程式語言的開發者.

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語言開始移植到其他機器上使用。史蒂芬·強生英語Stephen C. Johnson實現了一套「可移植編譯器」,這套編譯器修改起來相對容易,並且可以為不同的機器生成代碼。從那時起,C在大多數計算機上被使用,從最小的微型計算機到與CRAY-2超級計算機。C語言很規範,即使沒有一份正式的標準,你也可以寫出C程序,這些程序無須修改就可以運行在任何支持C語言和最小運行時環境的計算機上。

C最初在小型機器上實現,並且繼承了一系列小語種編程語言的特點;與功能相比,C的設計者更傾向於簡單和優雅。此外,從一開始,C語言就是為系統級編程而設計,程序的運行效率至關重要,因此,C語言與真實機器能力的良好匹配也就不足為奇。例如,C語言為典型硬件所直接支持的對象:字符整數(也許有多種大小),以及浮點數(同樣可能有多種大小)提供了相應的基本數據類型。[1]

 
《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 函數
  • 函數可以返回 structunion 類型
  • void * 數據類型

1990年,國際標準化組織(ISO)成立 ISO/IEC JTC1/SC22/WG14 工作組,來規定國際標準的C語言,通過對ANSI標準的少量修改,最終製定了 ISO 9899:1990,又稱為C90。隨後,ANSI亦接受國際標準C,並不再發展新的C標準。[3]

K&R C語言到ANSI/ISO標準C語言的改進包括:

  • 增加了真正的標準庫
  • 新的預處理命令與特性
  • 函數原型允許在函數申明中指定參數類型
  • 一些新的關鍵字,包括 constvolatilesigned
  • 寬字符、寬字符串與多字節字符
  • 對約定規則、聲明和類型檢查的許多小改動與澄清

WG14工作小組之後又於1994年,對1985年頒布的標準做了兩處技術修訂(缺陷修復)和一個補充(擴展)。下面是 1994 年做出的所有修改:

  • 3 個新的標準庫頭文件 iso646.h、wctype.h 和 wchar.h
  • 幾個新的記號與預定義宏,用於對國際化提供更好的支持
  • printf/sprintf 函數一系列新的格式代碼
  • 大量的函數和一些類型常量,用於多字節字符寬字節字符[4]

在ANSI的標準確立後,C語言的規範在一段時間內沒有大的變動,然而C++在自己的標準化建立過程中繼續發展壯大。《標準修正案一》在1994年為C語言建立了一個新標準,但是只修正了一些C89標準中的細節和增加更多更廣的國際字符集支持。不過,這個標準引出了1999年ISO 9899:1999的發表。它通常被稱為C99。C99被ANSI於2000年3月採用。

2011年12月8日,ISO正式發布了新的C語言的新標準C11(之前被稱為C1X),官方名稱為ISO/IEC 9899:2011。新的標準提高了對C++的兼容性,並增加了一些新的特性。這些新特性包括泛型、多執行緒、帶邊界檢查的函式、匿名結構等[5]

C18沒有引入新的語言特性,只對C11進行了補充和修正[6]

C2x引入了一些新特性。目前可以確定的是,C2x標準將加入符合IEEE標準的十進制浮點數,這使得計算機能夠精確地儲存浮點數[7]

參考資料

編輯
  1. ^ Stephen Prata. C Primer Plus(第5版). 北京: 人民郵電出版社. 2005年2月: 3-4 [2020-06-10]. ISBN 9787115130228 (中文). 
  2. ^ Dennis M. Ritchie,Brian W. Kernighan. C程序设计语言. 北京: 機械工業出版社. 2004年1月 [2020-06-10]. ISBN 9787111128069 (中文). 
  3. ^ Stephen Prata. C Primer Plus(第5版). 北京: 人民郵電出版社. 2005年2月: 12 [2020-06-10]. ISBN 9787115130228 (中文). 
  4. ^ JTC1/SC22/WG14 - C. [2020-06-10]. (原始內容存檔於2020-06-13). 
  5. ^ ISO/IEC 9899:2011 (PDF). [2020-06-10]. (原始內容存檔 (PDF)於2018-03-29). 
  6. ^ ISO/IEC 9899:2018 (PDF). [2020-06-10]. (原始內容存檔 (PDF)於2020-07-22). 
  7. ^ ISO/IEC 9899:202x (PDF). [2020-06-10]. (原始內容存檔 (PDF)於2020-06-10).