C 語言

C 作為系統的通用語言

/ lingua franca -> LING-gwuh FRANK-uh /

在貿易與旅行中,通用語(lingua franca)是不同背景的人用來互相理解的共同語言。在系統程式設計中,C 扮演這個角色。作業系統核心、語言執行期、資料庫、嵌入式韌體、以及高階語言底下的函式庫,都是用 C 寫的、或透過 C 對外呈現自己——所以 C 是幾乎一切底層之物都能說的共同語言。

幾個具體性質讓 C 贏得這個地位。它是覆在機器之上一層薄而可預測的層:它的構造緊貼 CPU 與記憶體實際運作的方式、隱藏行為很少,這正是「貼近金屬」的意思。它小而穩定,自 1989 年起標準化,所以很久以前寫的程式碼仍能編譯。幾乎每一款曾被製造出來的處理器都有 C 編譯器,賦予它非凡的可攜性。而關鍵的是,C 定義了一個穩定的應用二進位介面(ABI)——一套呼叫慣例與資料佈局——當其他語言想呼叫既有程式碼、或想被它呼叫時,就以此為目標。這正是為什麼來自 Python、Rust、Go 以及幾乎每種語言的繫結,都以「C 介面」(FFI)表達:C 是語言之間最小公分母的契約。

為什麼重要與一個誠實的平衡:因為這麼多基礎軟體是 C 寫的,理解 C 就是理解其他一切所立足的地板——即使你用高階語言寫程式,你通常也是在底下呼叫 C。誠實的提醒是:C 貼近機器同時也是它的危險:它不提供記憶體安全、不做邊界檢查,還有一長串未定義行為,這正是像 Rust 這類較新系統語言存在的原因。C 的歷久不衰是關於無所不在與穩定,而非關於它是最安全的工具——這兩件事同時為真。

/* 一個具穩定 ABI、其他語言可呼叫的 C 函式: */ int add(int a, int b) { return a + b; } /* Python(透過 ctypes)、Rust(透過 extern "C")、Go(透過 cgo), 以及幾乎每種語言都能呼叫這個同一個編譯好的 add()。 */

因為 C 的 ABI 穩定且通用,一個編譯好的 C 函式就成了許多語言所繫結的共同介面。

C 的主導地位來自無所不在、穩定、與通用的 ABI——而非來自它安全。它不提供記憶體安全或邊界檢查、且有許多未定義行為,這正是像 Rust 這類較新語言的動機。這兩個事實同時成立。

又称
the universal systems languageC's portability系統通用語系統共通語言