C 程式設計教學:學 C 不是為了繼續學 C++

由於歷史緣由,很多語言和 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.” (可見這裡),我們大可不必在繞遠路。

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。

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

comments powered by Disqus