編程語言的標准規范


 

我們都知道每一種編程語言都有着自己的語法標准,並且每隔一段時間都會出現新的標准,達到優化語言性能的目的。對於開發者而言,了解和學習這些新的標准是很有必要的。下面介紹一些主流編程語言的標准規范的更替歷史。

 

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

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

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

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

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)。
  • 增強了預處理功能。例如:
    • 支持取可變參數 #define Macro(...) __VA_ARGS__
    • 使用的時候,允許省略參數,被省略的參數會被擴展成空串。
    • 支持 // 開頭的單行注釋(這個特性實際上在C89的很多編譯器上已經被支持了)
  • 增加了新關鍵字 restrict, inline, _Complex, _Imaginary, _Bool
    • 支持 long long, long double _Complex, float _Complex 等類型
  • 支持不定長的數組,即數組長度可以在運行時決定,比如利用變量作為數組長度。聲明時使用 int a[var] 的形式。不過考慮到效率和實現,不定長數組不能用在全局,或 structunion 里。
  • 變量聲明不必放在語句塊的開頭,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函數,如printfscanf。隨后所引入的程序庫中最重要的便是標准模板庫,簡稱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++17C++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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM