close

因為見過太多人搞不清楚程式語言和編譯器之間的關係與區別,導致很多令人啼笑皆非的對話, 所以我打算在這篇解釋有關C語言標準、以及其發展歷史。

我想看過我前面文章的人大概都已經知道,程式語言是為了讓人能夠用比較容易閱讀理解的方法寫出電腦程式而被發明出來的, 然後使用編譯器將我們看得懂的程式碼(就是用程式語言寫出來的文章)翻議程電腦看得懂的機器碼,至此才能執行程式。 比方說,C語言只規定當你寫出printf("message");的時候,要把那個「message」顯示出來而已; 至於要如何顯示他才不管,讓編譯器去搞定就好。 又比方說,C語言規定程式碼要使用分號來標示一個敘述的結束,編譯器就必須要照這個規則序解析你寫的程式碼; 編譯器不能擅自使用換行、或其他的符號來當作敘述的結束,因為這樣就不符合C語言的標準,這個編譯器就不是個C語言編譯器了!

所以說穿了,程式語言就只是一大堆的語言「規則」而已,其本身並不是一個具體可見的東西; 而編譯器才是真正看得見摸得著的實物工具,用來將我們按照這些「規則」寫出來的文章翻譯成機器碼。

因此,程式語言必須先由某人發明出來,制定出一套這些語言規則的標準, 然後各個製做編譯器的公司、或工作室、或個人才能依據這些公佈的標準來製做編譯器給人使用。 所以,只要我們按照這些被公佈的統一標準來寫程式碼,就可以使用任何依據這些標準所製做的編譯器來產生程式; 就好比腳踏車的騎法和交通規則都是一樣的,而我們可以依自己的喜好買各種廠牌、型號、價格的車來騎。

編譯器特性

由於程式語言標準只會定義一些規則,以及其應有的行為,至於要如何做到這些行為就要看各家編譯器如何思考了。 比方說C語言規定使用printf會把小括弧裡的文字顯示出來,各家編譯器就要能做到這件事, 至於要用什麼方法做到把文字顯示出來?各編譯器就各憑本事!

這就好比老師叫同學們去買一包鹽,最後每個同學都買了一包鹽回來,這就叫作符合標準; 而其中有人走路去大賣場買、有人搭公車去鹽行買、有人做計程車去最近的超商買,這就叫作實做方法不同。 符合標準的特性確保了你下一樣的指令會得到可預期的一樣結果,而各種不同的實做方式則會產生不同的性能表現。 走路去鹽行的可能可以幫你買到最便宜的鹽,不過需要多一點時間; 同樣的,做計程車的那個可以在最短的時間內把鹽交在你手上,但你可能需要多付出一些資金。

把上面的道理套用在編譯器上就是,當前在世界上所流行的各種編譯器通常有著各種不同的特色、優點、甚至是適合的應用領域, 有些編譯器可以編出極具效率的程式碼、有些可以編出極小的程式、有些可能編譯速度其快無比、有些可能以方便的整合型快速開發環境著稱。 重點在於,編譯器是個工具,我們應該依據我們的實際需求更換使用不同的工具,而不是被一個工具綁死到底。 就好像聰明的木匠擁有一個工具箱的各式刀具,並且依據實際的裁切需要而選用不同的刀具一樣; 而愚笨的木匠則會使用同一把斧頭來做從砍神木到彫刻螞蟻的所有工作。 這些原則在我們日常生活上似乎是理所當然的,然而我會拿出來討論的原因就是, 在電腦的世界裡其實普遍的發生了很多套用在以往的生活習慣上非常匪夷所思的問題, 比方說被Microsoft綁死,沒有Word就不會寫文章的人、沒有IE就不會上網的人、甚至沒有Visual Studio就不會寫程式的人, 因此我強烈建議,為了你自己的生涯發展性以及工具取代性著想,請千萬不要成為上述那樣被工具綁死的人!

然而實際上要怎麼做才不會被工具綁住,成為被工具奴役而不是使用工具的人呢? 這些細節的注意事項我會在我的教學文章中慢慢告訴你,事實上我已經在這麼做了! 總歸而言,原則就是請依尋語言標準來寫作程式,切勿使用那種只有某個編譯器才有的特殊功能或旁門左道。

C語言歷史

經過前面、以及從前文章的解釋,想必讀者已經明白所謂程式語言就是一系列的語言規則標準。 而C語言又是怎麼產生的,其發展至今又曾發生過什麼變化嗎?

事實上C語言最初是由於Dennis Ritchie在約1969年在貝爾實驗室為了將Unix系統移植到PDP-11電腦上而發明出來的。 當時本來是要用一種被稱為B語言的程式語言(BCPL)來重寫Unix,卻發現B語言不夠完善而不足以用來移植Unix系統, 於是他索性用B語言做為藍本自己發明了一個新的程式語言。 由於這個新的程式語言是參考B語言發明的,但是比B更先進,於是就給他取了名字叫作C (發明的人高興取什麼名字就是什麼名字)。 然後他使用自己發明的C語言(當然也要自己做編譯器)重寫Unix,這是C語言第一次出現在世人眼前。 其後,由於C語言擁有種種令人喜愛的特性,使得C語言的應用很快的擴展到了各種裝置上。

這時候的C語言其實大部份都是發明人想到的東西而已,對於語言的標準還未存在書面的、嚴謹的規格, 編譯器的製做很難有統一的標準依歸,對於這個時代的C語言我們現在稱為「早期的C」。

1978年,C語言的發明人Dennis Ritchie和另一位科學家Brian Kernighan共同寫作發表了「The C Programing Language」一書。 此書的出版對於C語言的發展有了劃時代的意義,這是C語言第一次有了書面的規格,而此後的C語言編譯器也大都依照此書所記錄的規格來製做編譯器。 這個時期的C語言我們稱為「K&R C」。

但以一本書來做為業界公認的程式語言標準,約束力顯得不足,因此美國國家標準協會(ANSI)便在1989年為C語言制定了統一的標準, 隔年國際標準組織(ISO)也定了C語言的標準(不過這個版本比較少人提及)。 不管怎麼樣,這是C語言第一次有了從具有權威的機構所發行之完整而統一的標準規格定義,此後的編譯器便有了一個明確的設計依歸。 這個時代的C語言被稱為「C89」,在很長的一段時間裡成為C語言最重要的標準,也是一直到今天的所有編譯器幾乎都會支援的最低要求。

在C89推出後又十年的時間裡,C語言標準一直都沒有什麼更動,直到1999年ISO才推出了新版本的C語言標準。 這個版本的C語言多了很多很方便好用的功能,也同步收錄了很多C++語言所新增的不少特性(以//開頭的單行註解就是這時候被加進來的)。 這個版本的C語言被稱為「C99」,雖然多了很多功能,但由於很多經典的編譯器都是C89年代的產物, 因此若您未來工作上需要使用一些比較老舊的編譯器的話,可能會發現他不支援C99加入的新語法。

C99推出之後,C語言標準又好常一段時間沒有更動。 然而隨著時代的進步,C99面對於新的開發需求漸漸顯得吃力,於是在2011年ISO終於推出了C語言當前最新的語言標準,稱為「C11」。 C11雖然多了很多好用的新功能,但同時也表示了可能很多編譯器還沒有支援最新的C11; 若您必須使用一些老舊編譯器的話,那就是更吃不到葡萄了!

我們選擇的語言與工具

前面說了這麼多有關程式語言標準、歷史、及編譯器等知識, 想必讀者們已經明白我們學的是一系列的規則,至於編譯器則有各種廠牌型號可以選擇。 那麼,我為什麼推薦使用GCC來學習C語言呢?

首先就是GCC是跨平臺的,不管你的作業系統是BSD、Linux、Mac、還是Windows,都可以用一樣的方法使用GCC。 再者就是GCC是免費的開源軟體,讓您不需花費半毛錢就可以下載使用,而無需擔心盜版、破解、病毒、合法性等問題。 但請不要因為GCC不用錢就看不起它,GCC的性能在眾編譯器裡也許不是第一,但一定是當中的佼佼者。 而對於程式語言標準GCC一向是提供很良好的支援(作者我用過對於語言標準支援的最不好的是Visual C++), 使用者比較不容易發生明明按照標準寫的程式碼卻不能編譯通過等問題。因此我便推薦入門者使用GCC做為C語言的練習工具。

再看到語言標準的部份,前面提到C語言在C89定型後又陸續經過了一些增修, 那我的C語言教學系列究竟要教大家的是哪一個版本的C語言呢? 站在個人的喜好上,我當然是教最新版本的C11了。 但是考慮到讀者未來可能會因為某些需要而必須使用較為舊版的編譯工具, 所以我會儘量在解說到一些在新的語言標準裡被加入的功能時給予提示, 好讓讀者們能夠先有準備,知道在面對一些舊的軟體工具時可能沒有某些功能特性可以使用。

重點回顧

  • 編譯器是一種實際的產品,用來把程式碼翻譯成電腦可以執行的機器碼; 而程式語言本身只是一堆的規則,並不是有形的東西。
  • 編譯器等工具各門各類,你應該依據你面對的條件選擇最適合需求的工具; 而不是被綁在一個工具上,成為它的奴隸。
  • C語言從1969年被發明以來,歷經早期的渾沌到K&R C、C89、C99、以及最新的C11等變革。
  • 我的教學將以C11為主,並且推薦使用最新版本的GCC做為練習的工具。
arrow
arrow
    文章標籤
    C語言教學
    全站熱搜

    夜行者 發表在 痞客邦 留言(0) 人氣()