bells
安裝本網站至主畫面:

[C 語言] 程式設計教學:學 C 不是為了繼續學 C++

PUBLISHED ON MAY 8, 2018 — PROGRAMMING
Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

    由於歷史緣由,很多語言和 C 的確長得有點像,像是 C++、Java、C# 等語言的確有參考 C 的一些特質;甚至 JavaScript 這種本質上向 Scheme 致敬,但為了商業考量,刻意在語法上向 C 及 Java 靠攏。那麼,我們是不是要先學 C,再來學 C++ 或其他語言呢?其實這是沒有必要的,這些語言只是在語法上參考前人,但不會完全照抄其特性,需要學什麼語言,大可以直接學習該語言即可。

    第一個程式語言比較難學,因為這時候我們要同時學習許多事物,像是要會使用編輯器或 IDE,可能要學一點點命令列模式的使用方式,要習慣撰寫程式碼,同時要學一些抽象的思維,這時候就會花比較久的時間。第二個語言就會快一些,像是可以繼續用同一個編輯器,只是多加一兩個 plugin,命令列的使用方式也大同小異,很多程式語言背後的思維就是命令式程式設計 (imperative programming) 或物件導向程式設計 (object-oriented programming),只是語法上略有不同。在學到第三、第四個以上的程式語言就會更快了,但程式語言並不是學越多越好,而是要能用得精熟,能夠將該語言用於實務上;會 20 個語言的 Hello World 還不如專心用一個語言寫出實際的東西。

    由於 C++ 的確保留一些 C 的特性,的確會有一些人會覺得要先學 C 再學 C++,像 C 程式設計藝術 (C: How to Program) 的前半部是 C 語言,卻在後半部偷塞 C++,就給讀者這樣的暗示。如果讀者真的需要學 C++,先學 C 是沒有必要的。很多情境,在 C 和 C++ 的處理方式不同,實在不需要學兩次。像 C++ 有 vector,我們大可不必再回頭用 array;除非是為了相容於 C 程式碼,我們也很少在 C++ 中使用 C 風格字串。連 C++ 的爸爸 Bjarne Stroustrup 都特定發了篇文章說 “Learning Standard C++ as a New Language.” (可見這裡),我們大可不必在繞遠路。尤其 C++ 在 C++11 標準後出現許多新的語法,和 C 的差距越來越遠了,除了相容性,我們甚少要再寫 C 風格的程式碼。

    Java 和 C 就離得更遠了,除了表面上一些語法的差異,更重要的是背後運行的 Java 平台。C (或 C++) 由於貼近硬體,除了語法和標準函式庫是相同的,很多系統 API 是相異的,如果去觀察一些跨平台 C (或 C++) 的函式庫,其實內部都用很多條件編譯來處理各個平台的差異性,而 Java 基本上就直接把機器抽象化,程式設計者就不需要再煩惱這些問題了。Bjarne Stroustrup 對 Java 的評論是 “Java isn’t platform independent; it is a platform.“,值得我們思考。Java 除了吸收一些 C 和 C++ 的語法,把一些指標等低階操作都拿掉了,基本上是另外一套東西,我們不需要繞一大圈,先學 C 再學 Java。同樣的情形也適用於 C#。

    程式設計有一部分是抽象思維,有一部分是實際工具,先學 A 再學 B 通常對抽象思考有幫助,但語法和工具都要重新學習。C (或 C++) 可用的開發工具會受到系統的影響,而不像 Java 或其他高階語言那麼地跨平台,我們也會在後續文章中介紹這一部分。

    [Update on 2018/05/26] 不可否認地,學習 C 的確對學習 C++ 和 Objective-C 等語言有所幫助,因為這些語言是在相容於 C 的前提下建立的新語言。更精確地說,我們應該直接使用 C++ 和 Objective-C 的最佳實務,而非繼續使用相容於 C 但次佳的手法;例如,雖然我們可以在 C++ 和 Objective-C 中撰寫 C 風格的物件,但我們應優先使用這些語言提供的物件系統,而非繼續使用舊式語法。

    你或許對以下產品有興趣
    TAGS: C 語言
    Xmas tree