認識C語言
C語言具有高效、靈活、功能豐富、表達力強和較高的可移植性等特點,在程式設計中備受青睞,成為最近25年使用最為廣泛的程式語言。目前,C語言編譯器普遍存在於各種不同的作業系統中,例如Microsoft Windows、macOS、Linux、Unix等。C語言的設計影響了眾多後來的程式語言,例如C++、Objective-C、Java、C#等。
C語言設計目標是提供一種能以簡易的方式編譯、處理低階記憶體、產生少量的機器碼以及不需要任何執行環境支援便能執行的程式語言。C語言也很適合搭配組合語言來使用。儘管C語言提供了許多低階處理的功能,但仍然保持著良好跨平台的特性,以一個標準規格寫出的C語言程式可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(微控制器或稱MCU)以及超級電腦等作業平台。挾其強大的程式能力,相信C語言是值得學習的。
C語言最早是由丹尼斯·里奇(Dennis Ritchie)為了在PDP-11電腦上運行的UNIX系統所設計出來的程式語言,第一次發展在1969年到1973年之間。
在1980年代初期,C語言已成為Unix作業系統的主要程式語言,更深入了個人電腦、嵌入式處理器、與大型電腦等領域。廣泛用於系統與應用軟體的開發。
C語言很快,這或許是其被广泛使用原因之一,但是像Pascal或Fortran等語言也幾乎與C語言一樣快,那又為何非C語言不可。
但是,C語言不只是快,還具有指標,容易與組合語言連結,具有巨集、條件式編譯、inline 函數、結構化、可以使用記憶體映射輸出入,因此可以用高階語言撰寫低階輸出入驅動程式,還有撰寫作業系統。
- 高效率的編譯程式:C的執行效率與使用的普遍性,遠勝於其他程式語言。還可以像組合語言那樣直接存取硬體。
- 介於高階與低階的語言:C語言不但具有低階語言的優點,同時兼具了高階語言的易讀性、易於除錯等特性,故又稱為「中階語言」。此外C語言可以很容易與組合語言連結,利用低階語言特長來提高程式執行效率。
- 可攜性佳:程式語言可攜性(Portability)極佳,可以在少量修改或甚至完全不修改即可在另一作業系統執行。當想跨越平台來執行C語言(如在Unix的C語言原始程式碼移至Windows環境執行,通常只需要修改極少部分程式碼,就可以再重新編譯後執行。而且提供C編譯器的系統近50種,從早期Apple II到超級電腦都有相容的C編譯器。
- 專為程式設計師所設計:C最初在小型機器上實作,並且繼承了一系列小語種程式語言的特點;與功能相比,C的設計者更傾向於簡單和優雅。C提供了豐富運算子(Operator),使得C的語法得以簡潔,而且方便的是,大多數C語言環境都提供撰寫好的程式庫(Library),內含多個函數供程式設計師使用,無須重新撰寫程式碼。[1]
C語言並非沒有缺點的,實際上,C語言的缺點非常之多。舉例而言,用C語言寫程式很容易有bug,特別是在記憶體分配與回收這部份更是如此。
- C語言沒有自動記憶体回收機制,沒有垃圾收集功能,因此常常導致忘記釋放記憶體,或者將同一個記憶體釋放數次,因而造成錯誤。
- C語言的字串很原始,使用起來非常不方便。
- C語言的標準函式庫甚至沒有基本的資料結構,像是陣列、串列、堆疊、字典等相關結構的函式庫。
- C語言的條件式編譯讓程式看起來很冗長,使用標頭檔
*.h
讓你必需重複撰寫函數表頭,浪費許多時間。 - 更糟的是,由於C語言的標準函式庫很小,因此在不同的平台上,每個廠商都實作出完全不同的函式庫,這導致C語言的程式難以跨越平台執行,您必須位每個平台打造一份程式,而不像Java那樣可以“一次编译,到处执行”(英语:Write Once,Run Anywhere)。
但是,即便有了這麼多的缺點,C語言仍然歷經四十年而不衰,這又是為甚麼呢?
每個C語言的缺點,幾乎都是伴隨著其優點而來的,C語言的記憶體難以管理,是因為C語言具有強大的指標功能。字串函數很原始,是為了讓您可以使用字元陣列的方式處理字串,而不需要使用動態記憶體配置。無法跨越平台,是因為C語言適合用來打造底層的嵌入式系統,可以直接連結組合語言協同工作。從這個角度看來,C語言的設計其實是相當精巧的,這也是C語言為何經歷四十年而不衰的原因。[2]
- 參考
- m:w:zh:C語言 (導言)
- 《C語言教學手冊 第4版》 作者:洪維恩著
- 專業級 C語言(CC授權)