Linus Torvalds計劃將Linux核心遷移至現代C語言

語言: CN / TW / HK

在此之前,Linux的核心基礎為古老的C89標準;如今,Torvalds決定升級至2011年釋出的、更為現代的C11標準。

大家都知道,Linux是由C語言編寫而成。但各位可能不太瞭解,這裡使用的是一種早已過時的C方言:C語言標準的1989年版本,即C89,也稱ANSI X3.159-1989或ANSI C。Linus Torvalds當然知曉這一切,並決定將Linux的官方C版本更新至2011年釋出的C11標準。

這次調整其實並不像聽起來那麼誇張,畢竟C89時至今日仍然擁有普遍支援。由於一切C編譯器都能向下相容早期版本,所以C89程式在編譯或者執行上不會出現任何問題。換句話說,任何相容C11的編譯器都能順利相容C89遺留程式碼。

既然如此,幹嘛還要費這個勁呢?理由也很簡單,舊版本無法提供新版本中的很多實用功能。

這種情況當然引起了Torvalds的注意。當時有人打算修復核心連結串列primitive中預測執行函式的潛在安全問題,卻發現補丁中存在另一個問題。在嘗試修復時,Torvalds意識到在C89當中,傳遞給連結串列遍歷巨集的迭代器必須在迴圈本體之外的範圍進行宣告。

Torvalds隨後寫信給Linux核心郵件列表(LKML),認為“之所以會引發這種非預測性bug,原因就是C89當中根本不存在「迴圈宣告變數」這種東西。正是因為無法在迴圈之內宣告迭代器變數,list_for_each_entry() -這類巨集在本質上總會把最後一個HEAD條目洩漏到迴圈以外。”

如何解決?把C89遷移至更新的C語言標準就能徹底消滅這類問題。所以,“是時候考慮轉向C99標準了——雖然這項標準也已有20多年曆史,但至少比C88更新、能夠支援塊級變數宣告。”

Linux核心開發人員Arnd Bergmann認可這項計劃的可行性,並補充稱不如直接升級到2011年的C11標準。這主要是考慮到C99的流行度並不太高,而C11引入了標準化多執行緒支援並增強了安全性,所以最好能一步到位。

直上C11並不困難。就連Linux核心中的最小C編譯器GCC 5.1都能夠支援C11。這個理由說服了Torvalds,“這個問題已經醞釀了很多年,我真的很希望能邁出這一步。”

隨後,在確保新的C標準能夠在核心中正常工作之後,Torvalds決定按下“發射按鈕”,表示“讓我們在5.18合併視窗的早期嘗試一下。”考慮到5.18合併視窗即將到來,所以最早可能在3月份就可能在核心中見到C11的身影。

但事情真能這麼順利嗎?Linux核心開發人員兼記者Jonathan Corbet警告稱,“千萬要注意,在合併視窗與5.18釋出之間可能會出現很多問題。語言標準版本的升級有可能在核心中某些不為人知的角落引發bug,所以必須儘早發現問題才能保證及時進行版本還原。但如果一切真的進展順利,下一個Linux核心版本將正式轉向C11。”

原文連結: Linus Torvalds prepares to move the Linux kernel to modern C