來源:全文引用 金門大學 陳鍾誠教授 文章 2022.09.12
從 1972 年 Dennis Ritchie 在貝爾實驗室發明 C 語言至今,已經過了將近四十個年頭。在這個變化快速的電腦世界裡,C 語言彷彿成了不變的避風港。四十年來,C 語言的改變並不多,而且一直都是所有作業系統底層的主力語言。近來,由於 Linux 與開放原始碼的發展,C 語言的影響力更為增強。在這裡,我不禁要問一個問題,為何 C 語言可以經過四十年而幾乎毫不改變。
C 語言很快,這或許是原因之ㄧ,但是像 Pascal 或 Fortran 等語言也幾乎與 C 語言一樣快,那又為何非 C 語言不可。但是,C 語言不只是快,還具有指標,容易與組合語言連結,具有巨集、條件式編譯、inline 函數、結構化、可以使用記憶體映射輸出入,因此可以用高階語言撰寫低階輸出入驅動程式,還有撰寫作業系統。
這些特性,讓 C 語言特別適合撰寫嵌入式系統,在某些 deeply embedded 的資源受限型嵌入式系統中,只有很小的記憶體、很慢的 CPU、而且通常沒有硬碟。這種環境有點像相當於當年 Dennis Ritchie 所面對的環境,因為他們必須在很克難的資源中,發展出夠強大的作業系統。也正是因為這種環境的淬鍊、讓 C 語言在《嵌入式系統》和《作業系統》領域都有非常優異的表現。
UNIX 正是催生 C 語言的主要動力,當年 Ken Thompson 與 Dennis Ritchie 正是為了發展 UNIX 而設計出 C 語言的,這兩人也因為 UNIX/C 的貢獻而被 ACM 授予 Turing Award 這的電腦界的諾貝爾獎。
在 1978 年,Dennis 與另一位共同作者 Brian Wilson Kernighan 合力撰寫了第一本廣為流傳的 C 語言教科書,而這個版本的教科書由於影響深遠,成為人手一冊的 C 語言經典,因此後來我們這個版本的 C 語言教科書簡稱為 K&R 版本,這個經典書籍中所使用的 C 語言版本也因此而被稱為 K&R 版的 C 語言,以便與後來 1988 年的 ANSI C 版本,以及 1999 年的 ISO C99 版本有所區隔。 (一個很容易誤會的點是, Ken Thompson 與 Brian Wilson Kernighan 是不同的兩個人,Ken Thompson 是發明 UNIX 與 C 語言的那個 Turing Award 得獎者,但是 Brian Wilson Kernighan 則是 C 語言書籍的作者,這兩個人的名字雖然都以 K 開頭,但是此 K 非比 K,請讀者切勿混淆)。
因此,學習 C 語言的人,如果只是將 C 當作是一般的程式語言,就會難以體會 C 語言的威力之所在,我們必須進入嵌入式與作業系統的領域,才能體會 C 語言的優點。一但您能夠體會這些優點,C 語言將不再僅僅是一個普通的語言,您也將能體會為何 C 語言會經歷四十年而不墬。然後,您也才能發揮 C 語言的能力,並且體會這些設計背後的優點與缺點。
C 語言並非沒有缺點的,實際上,C 語言的缺點非常的多,多到可以用罄竹難書來形容。舉例而言,用 C 語言寫程式很容易有 bug,特別是在記憶體分配與回收這部份更是如此。C 語言沒有自動記憶体回收機制,沒有垃圾收集功能,因此常常導致忘記釋放記憶體,或者將同一個記憶體釋放數次,因而造成錯誤。C 語言的字串很原始,使用起來非常不方便。C 語言的標準函式庫甚至沒有基本的資料結構,像是陣列、串列、堆疊、字典等相關結構的函式庫。C 語言的條件式編譯讓程式看起來很冗長,使用標頭檔 *.h 讓你必需重複撰寫函數表頭,浪費許多時間。更糟的是,由於 C 語言的標準函式庫很小,因此在不同的平台上,每個廠商都實作出完全不同的函式庫,這導致 C 語言的程式難以跨越平台執行,您必須位每個平台打造一份程式,而不像 Java 那樣可以 Write Once,Run Anywhere。
但是,即便有了這麼多的缺點,C 語言仍然歷經四十年而不衰,這又是為甚麼呢?
每個 C 語言的缺點,幾乎都是伴隨著其優點而來的,C 語言的記憶體難以管理,是因為 C 語言具有強大的指標功能。字串函數很原始,是為了讓您可以使用字元陣列的方式處理字串,而不需要使用動態記憶體配置。無法跨越平台,是因為 C 語言適合用來打造底層的嵌入式系統,可以直接連結組合語言協同工作。從這個角度看來,C 語言的設計其實是相當精巧的,這也是 C 語言為何經歷四十年而不衰的原因。
C 語言幾乎是當今被廣泛使用的語言當中,唯一同時具有高階與低階特性的語言,這個特性主要是由指標所造成的。利用指標,您可以用記憶體映射的方法存取記憶體,這讓 C 語言可以直接與周邊裝置溝通,因此許多裝置驅動程式可以用 C 語言撰寫,而不需要全部用組合語言。
學習 C 語言的投資報酬率,必須以數十年甚至一輩子的眼光來看,而不是短視的。許多其他的語言,多如過江之鯽,每個兩三年就必須學習全新的語言,就像流行音樂或服飾一般,學會之後很快就會膩了。C 語言絕對不是流行的語言,而是一種經典的、長久的、耐用的語言,您在 C 語言的投資不會浪費,因為 C 語言將會陪伴您,走過數十年,甚至是一輩子。
資料來源:https://www.johntool.com/c-programming-language/ 20221102
C 語言基本上是指 C Language,並不包含 C++、C#。
C 語言是超強大的程式語言,其編碼方式和邏輯運算是 C++、C# 以及大多數程式語言的發展基礎。
C 語言擁有靈活高效的運算能力以及豐富的功能性、可以跨平台 (Linux、Windows、MacOS) 使用的特點,成為了近 30 年來備受軟體工程師青睞,用途最為廣泛的語言。
C 語言經常使用在作業系統的編譯器 (Compiler) 中,當作硬體和軟體間的橋樑,因此如果你想成為出色的作業系統開發者,就學 C 語言吧!
學習 C 語言的同時也會訓練邏輯能力,之後無論學習任何程式語言都難不倒,因為你已經奠定良好的基礎。
C的相關IDE
Code::Blocks :https://www.codeblocks.org/
Eclipse:https://www.eclipse.org/
Visual Studio Code :https://code.visualstudio.com/