為什麼要 (或不要) 學習 C 語言

在大專院校的資訊科系中,C 語言是必學的,這有一些教學上的考量,不純然以實用觀點出發;不過,現在自學程式的風氣較以往興盛,對於這些人來說,C 語言是否還要學呢?筆者一開始自學程式設計時,也傻傻地買了 C 語言的書來看,但是 C 語言要學到能做出足夠實用的應用程式來,其實並不是那麼容易,經過一段時間後,筆者才慢慢了解 C 語言在電腦界的位置。C 語言的知識仍然有其必要,但是否要深入學習,則要看當下的情境而定。

對於初學者來說,雖然大專院校都以 C 語言做為學習工具,但這不代表我們就要用 C 語言做為第一個語言。對於初學者來說,學習程式設計的重心應該在於學習高階的概念,並不是成天在跟指標 (pointer) 奮戰,或是用一些低階的手法處理字串。國外的一些 MOOC 開始用 Python 做為程式設計教學的工具,代表國外的教學者也有類似的想法。我們不用神化 Python,其實 Ruby 也提供相似程度的高階抽象;重點並不是使用 Python 或是 Ruby 或是其他語言,而是使用一個可以專注在學習程式設計的工具。

那麼,是不是代表我們就不用學 C 了呢?倒也不是。C 語言在電腦科學上有著特殊的地位,不僅是第一個廣泛使用的跨平台語言,也是許多重要軟體所採用的工具。像是作業系統、驅動程式、編/直譯器等軟體界的基礎建設都是用 C 寫成;一些常見的函式庫,也是用 C 寫成 (一部分用 C++),再製作不同語言的 binding;許多程式語言都會提供 C 的 API,用來擴展語言的功能;對於嵌入式系統,由於硬體效能的限制,仍然需要 C 這個層級的工具。雖然高階語言的舒適圈很舒服,但許多延伸模組內部其實內部是用 C (一些是 C++) 寫成。

有些程式學習者會以為 C 語言沒有用,這是因為一般人一開始使用電腦是從 Windows 開始,而 Windows 設計的使用對象是一般使用者,軟體都做成安裝精靈程式,使用者不會接觸到函式庫。對於開發者來說,Windows 生態圈沒有一個良好的套件機制讓開發者分享 C 函式庫,一些學習者誤以為 C 語言只有標準函式庫那些東西,說實在的,只有標準函式庫很難寫到實用的程式。不過,原本 C 語言就沒有規範套件的形式,一些類 Unix 系統,像是 GNU/Linux 或 BSD 家族系統,是透過系統套件自行處理掉這些問題。

由於語言的選擇變多、分工變細,直接用到 C 的機會比從前少,一些程式設計者會轉用和 C 接近但對物件導向支援更好的 C++,或是轉用 Java 或 C# 等運行在虛擬機器之中的語言;對於不注重效能的程式,使用 Python 或 Ruby 等高階語言就足以處理;Go (golang) 等新興編譯語言和 C 速度差異不大,但寫起來更輕鬆。C 仍然是電腦界的地基,許多基礎工具仍會用 C 撰寫,其他高階語言也會用 C 做為接口。了解 C 對了解電腦的確有一些幫助,只是不是每個人都要跳下來自己寫 C。

上篇為什麼 Nim 無法造成流行
下篇教程、範例、指引、原始碼:由淺至深的學習之路