我們都知道每一種編程語言都有着自己的語法標准,並且每隔一段時間都會出現新的標准,達到優化語言性能的目的。對於開發者而言,了解和學習這些新的標准是很有必要的。下面介紹一些主流編程語言的標准規范的更替歷史。
C語言
K&R C
1978年,丹尼斯·里奇和布萊恩·柯林漢合作出版了《C程序設計語言》的第一版。書中介紹的C語言標准也被C語言程序員稱作“K&R C”,第二版的書中也包含了一些ANSI C的標准。K&R C主要介紹了以下特色:
- 結構(struct)類型
- 長整數(long int)類型
- 無符號整數(unsigned int)類型
- 把運算符=+和=-改為+=和-=。因為=+和=-會使得編譯器不知道用戶要處理i = -10還是i =- 10,使得處理上產生混淆。
即使在后來ANSI C標准被提出的許多年后,K&R C仍然是許多編譯器的最低標准要求,許多老舊的編譯仍然運行K&R C的標准。
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標准。
K&R C語言到ANSI/ISO標准C語言的改進包括:
- 增加了真正的標准庫
- 新的預處理命令與特性
- 函數原型允許在函數申明中指定參數類型
- 一些新的關鍵字,包括 const、volatile 與 signed
- 寬字符、寬字符串與多字節字符
- 對約定規則、聲明和類型檢查的許多小改動與澄清
WG14工作小組之后又於1994年,對1985年頒布的標准做了兩處技術修訂(缺陷修復)和一個補充(擴展)。下面是 1994 年做出的所有修改:
- 3 個新的標准庫頭文件 iso646.h、wctype.h 和 wchar.h
- 幾個新的記號與預定義宏,用於對國際化提供更好的支持
- printf/sprintf 函數一系列新的格式代碼
- 大量的函數和一些類型與常量,用於多字節字符和寬字節字符
C99
在ANSI的標准確立后,C語言的規范在一段時間內沒有大的變動,然而C++在自己的標准化創建過程中繼續發展壯大。《標准修正案一》在1994年為C語言創建了一個新標准,但是只修正了一些C89標准中的細節和增加更多更廣的國際字符集支持。不過,這個標准引出了1999年ISO 9899:1999的發表。它通常被稱為C99。C99被ANSI於2000年3月采用。
在C99中包括的特性有:
- 增加了對編譯器的限制,比如源程序每行要求至少支持到 4095 字節,變量名函數名的要求支持到 63 字節(extern 要求支持到 31)。
- 增強了預處理功能。例如:
- 增加了新關鍵字 restrict, inline, _Complex, _Imaginary, _Bool
- 支持 long long, long double _Complex, float _Complex 等類型
- 支持不定長的數組,即數組長度可以在運行時決定,比如利用變量作為數組長度。聲明時使用 int a[var] 的形式。不過考慮到效率和實現,不定長數組不能用在全局,或 struct 與 union 里。
- 變量聲明不必放在語句塊的開頭,for 語句提倡寫成 for(int i=0;i<100;++i) 的形式,即i 只在 for 語句塊內部有效。
- 允許采用(type_name){xx,xx,xx} 類似於 C++ 的構造函數的形式構造匿名的結構體。
- 初始化結構的時候允許對特定的元素賦值,形式為:
-
struct test{int a[3],b;} foo[] = { [0].a = {1}, [1].a = 2 }; -
struct test{int a, b, c, d;} foo = { .a = 1, .c = 3, 4, .b = 5 }; // 3,4 是對 .c,.d 賦值的
-
- 格式化字符串中,利用 \u 支持 unicode 的字符。
- 支持 16 進制的浮點數的描述。
- printf scanf 的格式化串增加了對 long long int 類型的支持。
- 浮點數的內部數據描述支持了新標准,可以使用 #pragma 編譯器指令指定。
- 除了已有的 __line__ __file__ 以外,增加了 __func__ 得到當前的函數名。
- 允許編譯器化簡非常數的表達式。
- 修改了 / % 處理負數時的定義,這樣可以給出明確的結果,例如在C89中-22 / 7 = -3, -22 % 7 = -1,也可以-22 / 7= -4, -22 % 7 = 6。 而C99中明確為 -22 / 7 = -3, -22 % 7 = -1,只有一種結果。
- 取消了函數返回類型默認為 int 的規定。
- 允許在 struct 的最后定義的數組不指定其長度,寫做 [](flexible array member)。
- const const int i 將被當作 const int i 處理。
- 增加和修改了一些標准頭文件,比如定義 bool 的 <stdbool.h> ,定義一些標准長度的 int 的 <inttypes.h> ,定義復數的 <complex.h> ,定義寬字符的 <wctype.h> ,類似於泛型的數學函數 <tgmath.h>, 浮點數相關的 <fenv.h>。 在<stdarg.h> 增加了 va_copy 用於復制 ... 的參數。<time.h> 里增加了 struct tmx ,對 struct tm 做了擴展。
- 輸入輸出對寬字符以及長整數等做了相應的支持。
但是各個公司對C99的支持所表現出來的興趣不同。當GCC和其它一些商業編譯器支持C99的大部分特性的時候,微軟和Borland卻似乎對此不感興趣。
C11
2011年12月8日,ISO正式發布了新的C語言的新標准C11,之前被稱為C1X,官方名稱為ISO/IEC 9899:2011。新的標准提高了對C++的兼容性,並增加了一些新的特性。這些新特性包括泛型宏、多線程、帶邊界檢查的函數、匿名結構等。但直到現在仍未有編譯器完整的支持。
C++
1983年,C with Classes改命名為C++(++是C語言中的增值操作符)。加入了新的特性,其中包括虛函數、函數名和運算符重載、引用、常量、用戶可控制的自由空間存儲區控制、改良的類型檢查,以及新的雙斜線(//)單行注解風格。
1985年,發布第一版《C++程序設計語言》,提供一個重點的語言引用,至此還不是官方標准。
1989年,發布了Release 2.0。引入了多重繼承、抽象類別、靜態成員函數、常量成員函數,以及成員保護。1990年,出版了The Annotated C++ Reference Manual。這本書后來成為標准化的基礎。稍后還引入了模板、異常處理、名字空間、新的強制類型轉換,以及布爾類型。
隨着C++語言的演變,也逐漸演化出相應的標准程序庫。最先加進C++標准庫的是流I/O程序庫,其用以取代傳統的C函數,如printf和scanf。隨后所引入的程序庫中最重要的便是標准模板庫,簡稱STL。
多年后,一個聯合的ANSI-ISO委員會於1998年對C++標准化(ISO/IEC 14882:1998)。在官方發布1998標准的若干年后,委員會處理缺陷報告,並於2003年發布一個C++標准的修正版本。2005年,一份名為Library Technical Report 1(簡稱TR1)的技術報告發布。雖然還不是官方標准的一部分,不過它所提供的幾個擴展可望成為下一版C++標准的一部分。幾乎所有目前仍在維護的C++編譯器皆已支持TR1。
目前最新的C++標准是2017年12月發布的ISO/IEC 14882:2017,又稱C++17或C++1z。
目前已經出版的標准文檔如下:

Java
版本歷史
- 1995年5月23日,Java語言誕生
- 1996年1月,第一個JDK-JDK1.0誕生
- 1996年4月,10個最主要的操作系統供應商申明將在其產品中嵌入JAVA技術
- 1996年9月,約8.3萬個網頁應用了JAVA技術來制作
- 1997年2月18日,JDK1.1發布
- 1997年4月2日,JavaOne會議召開,參與者逾一萬人,創當時全球同類會議規模之紀錄
- 1997年9月,JavaDeveloperConnection社區成員超過十萬
- 1998年2月,JDK1.1被下載超過2,000,000次
- 1998年12月8日,JAVA2企業平台J2EE發布
- 1999年6月,SUN公司發布Java的三個版本:標准版(J2SE)、企業版(J2EE)和微型版(J2ME)
- 2000年5月8日,JDK1.3發布
- 2000年5月29日,JDK1.4發布
- 2001年6月5日,NOKIA宣布,到2003年將出售1億部支持Java的手機
- 2001年9月24日,J2EE1.3發布
- 2002年2月26日,J2SE1.4發布,自此Java的計算能力有了大幅提升
- 2004年9月30日18:00PM,J2SE1.5發布,成為Java語言發展史上的又一里程碑。為了表示該版本的重要性,J2SE1.5更名為Java SE 5.0
- 2005年6月,JavaOne大會召開,SUN公司公開Java SE 6。此時,Java的各種版本已經更名,以取消其中的數字“2”:J2EE更名為Java EE,J2SE更名為Java SE,J2ME更名為Java ME
- 2006年12月,SUN公司發布JRE6.0
- 2009年12月,SUN公司發布Java EE 6
- 2010年11月,由於Oracle公司對於Java社區的不友善,因此Apache揚言將退出JCP
- 2011年7月28日,Oracle公司發布Java SE 7
- 2014年3月18日,Oracle公司發表Java SE 8
- 2017年9月21日,Oracle公司發表Java SE 9
- 2018年3月21日,Oracle公司發表Java SE 10
Python
python版本分為兩大類:python2.0與python3.0。
Python 2.0於2000年10月16日發布,增加了實現完整的垃圾回收,並且支持Unicode。同時,整個開發過程更加透明,社區對開發進度的影響逐漸擴大。Python 3.0於2008年12月3日發布,此版不完全兼容之前的Python源代碼。不過,很多新特性后來也被移植到舊的Python 2.6/2.7版本。
總結
對於編程語言來說,不同的版本就代表在語法規范和功能函數庫存在區別。在實際開發的過程中,我們需要注意這些問題。
參考資料:
https://zh.wikipedia.org/wiki/C%E8%AF%AD%E8%A8%80
https://zh.wikipedia.org/wiki/C%2B%2B
https://zh.wikipedia.org/wiki/Java
https://zh.wikipedia.org/wiki/Python
