C 語言程式設計教學:老狗變得出新把戲,談 C 語言的演進

PUBLISHED ON MAY 10, 2018 — PROGRAMMING

    C 語言是一個超過 40 歲的程式語言,但並非停滯不前,而經過了數個版本的演進:

    • K&R C
    • ANSI C (或 C89)
    • C99
    • C11

    在類 Unix 系統上,還有一個額外的標準:

    • POSIX

    如果讀者還沒學 C,對於一些細節尚不了解,可先大略看一下,之後再回頭閱讀。

    K&R C

    這個版本是早期 C 還沒標準化時,所出現的非正式標準,來自於 Brian Kernighan and Dennis Ritchie 於 1978 年所著的 The C Programming Language ,這本書的第二版補足了 ANSI C 的部分。

    包括以下項目:

    • 標準化的 I/O 函式庫
    • long int 型別
    • unsigned int 型別
    • 修改複合指派 (compound assignment) 運算子的撰寫方式

    ANSI C

    註:也稱為 C89。

    第一個 C 語言的國際標準,大部分 C 的學習者所認知的 C 語言就是這個版本,甚至有些 C 程式設計者仍堅守著這個版本的 C;一個實例就是 Lua 官方直譯器強調他們的 Lua 實作根隨著 ANSI C 的標準,因此有著最佳的可攜性 (portability)。C89 後還有一些較小的更新,像是 C95,但這些後續的更新在 C 語言特性上沒有顯著改變。

    正式的 C 標準文件需付費購買,在網路上散布這些文件是犯法的,因此,一般在網路上查得到的 C 標準文件多為非正式版本 (draft),像是這裡,後續各版本亦同。

    C99

    繼 C89 後第一個重大的版本更新,包括但不限於以下項目:

    • 單行註解 // ...
    • 行內函式 (inline function)
    • 複數 (complex number)
    • 加強對浮點數的支援
    • 布林 (boolean) 等數個新型別
    • 泛用型別 (type-generic) 函式,這是一些關於數學運算的巨集
    • 可在 for 迴圈開頭宣告變數

    C11

    另一個重大的版本更新,包括但不限於以下項目:

    • 泛用型別函式 (type-generic expression)
    • 多執行緒支援
    • 改善對萬國碼 (unicode) 的支援
    • 匿名結構

    C17 則是對 C11 的一些改善,主要的目標為修復 C11 的一些 bug,不會引入新的語法特性。

    註:不要將 C17 和 C++17 搞混,前者是 C 標準,後者則是 C++ 標準。

    POSIX

    POSIX (Portable Operating System Interface) 本身不是 C 語言標準,而是類 Unix 系統的標準,該標準規範有關殻程式 (shell)、命令列工具、一些 C 函式庫等項目。對於 C 語言來說,POSIX 標準提供了一些除了 C 標準函式庫以外的 API。Windows 家族系統沒有遵守 POSIX 標準,但目前市面上知名的系統,包括 Mac OS、GNU/Linux、BSD 系統等,大抵上都是 POSIX 相容的。

    各個 C 編譯器的支援

    常見的 C 編譯器中,GCCClang 對 C 標準支援較好,支援 C89、C99 和一部分的 C11,而 Visual C++ 僅支援 C89 和一部分的 C99。這些訊息可能會隨時間改變,最好的方式是自行查閱各編譯器的官方手冊。

    本系列文的方向

    我們會合理地使用新的語言特性,但會附註這些特性是在那個時期的 C 標準中。我們的目標編譯器會以 GCC 為優先考量,因 GCC 在類 Unix 系統上相當容易取得,甚至在 Windows 家族系統上也可以透過 MinGW 取得 GCC 的移植品;而 Visual C++ 對 C 語言的支援相對落後,沒有必要死守在舊有的標準中。

    現代語言在發展時,大抵上也一併發展相關的工具;但 C 語言的開發工具會因系統而異,因此,我們會分 Windows、Mac、GNU/Linux 等系統來討論 C 相關的工具。

    TAGS: C 語言
    comments powered by Disqus