C語言的三個標準
目前,有許多C實現可用。在理想情況下,編寫C程序時,假設該程序中未使用機器特定的編程技術,那么它的運行情況在任何實現中都應該相同。要在實踐中做到這一點,不同的實現要遵循同一個標準。C語言發展之初,并沒有所謂的C標準。1978年,布萊恩·柯林漢(BrianKernighan)和丹尼斯·里奇(Dennis Ritchie)合著的The C Programming Language(《C語言程序設計》)第1版是公認的C標準,通常稱之為K&R C或經典C。特別是,該書中的附錄中的“C語言參考手冊”已成為實現C的指導標準。例如,編譯器都聲稱提供完整的K&R實現。雖然這本書中的附錄定義了C語言,但卻沒有定義C庫。與大多數語言不同的是,C語言比其他語言更依賴庫,因此需要一個標準庫。實際上,由于缺乏官方標準,UNIX實現提供的庫已成為了標準庫。
1)第1個ANSI/ISO
C標準隨著C的不斷發展,越來越廣泛地應用于更多系統中,C社區意識到需要一個更全面、更新穎、更嚴格的標準。鑒于此,美國國家標準協會(ANSI)于1983年組建了一個委員會(X3J11),開發了一套新標準,并于1989年正式公布。該標準(ANSI-C)定義了C語言和C標準庫。
國際標準化組織于1990年采用了這套C標準(ISO-C)。ISO-C和ANSI-C是完全相同的標準。ANSI/ISO標準的最終版本通常叫作C89(因為ANSI于1989年批準該標準)或C90(因為ISO于1990年批準該標準)。另外,由于ANSI先公布C標準,因此業界人士通常使用ANSI-C。在該委員會制定的指導原則中,最有趣的可能是:保持C的精神。委員會在表述這一精神時列出了以下幾點:
- 信任程序員;Trust the programmer.
- 不要妨礙程序員做需要做的事;Don't prevent the programmer from doing what needs to be done.
- 保持語言精練簡單;Keep the language small and simple.
- 只提供一種方法執行一項操作;Provide only one way to do an operation.
- 讓程序運行更快,即使不能保證其可移植性。Make it fast, even if it is not guaranteed to be portable.
在最后一點上,標準委員會的用意是:作為實現,應該針對目標計算機來定義最合適的某特定操作,而不是強加一個抽象、統一的定義。在學習C語言過程中,許多方面都反映了這一哲學思想。
2)C99標準
1994年,ANSI/ISO聯合委員會(C9X委員會)開始修訂C標準,最終發布了C99標準。該委員會遵循了最初C90標準的原則,包括保持語言的精練簡單。委員會的用意不是在C語言中添加新特性,而是為了達到新的目標。
- 第1個目標是,支持國際化編程。例如,提供多種方法處理國際字符集。
- 第2個目標是,“調整現有實踐致力于解決明顯的缺陷”。因此,在遇到需要將C移至64位處理器時,委員會根據現實生活中處理問題的經驗來添加標準。
- 第3個目標是,為適應科學和工程項目中的關鍵數值計算,提高C的適應性,讓C比FORTRAN更有競爭力。
這3點(國際化、彌補缺陷和提高計算的實用性)是主要的修訂目標。在其他方面的改變則更為保守,例如,盡量與C90、C++兼容,讓語言在概念上保持簡單。用委員會的話說:“……委員會很滿意讓C++成為大型、功能強大的語言”。C99的修訂保留了C語言的精髓,C仍是一門簡潔高效的語言。本書指出了許多C99修改的地方。雖然該標準已發布了很長時間,但并非所有的編譯器都完全實現C99的所有改動。因此,你可能發現C99的一些改動在自己的系統中不可用,或者只有改變編譯器的設置才可用。
3)C11標準
維護標準任重道遠。標準委員會在2007年承諾C標準的下一個版本是C1X,2011年終于發布了C11標準。此次,委員會提出了一些新的指導原則。出于對當前編程安全的擔憂,不那么強調“信任程序員”目標了。而且,供應商并未像對C90那樣很好地接受和支持C99。這使得C99的一些特性成為C11的可選項。因為委員會認為,不應要求服務小型機市場的供應商支持其目標環境中用不到的特性。另外需要強調的是,修訂標準的原因不是因為原標準不能用,而是需要跟進新的技術。例如,新標準添加了可選項支持當前使用多處理器的計算機。