基礎:機器模型
貼近硬體(close to the metal)
當有人說某段程式碼「貼近硬體」,意思是它在非常接近實際硬體之處工作,程式與矽晶片之間幾乎沒有東西阻隔。所謂「金屬」就是那台實體機器——晶片、記憶體、導線。離硬體很遠的程式碼用人類舒適的語彙說話(「儲存這位顧客」);貼近硬體的程式碼則用機器自己的語彙說話(「把這 8 個位元組寫到這個位址」)。
實務上,貼近硬體意味著你這位程式設計師,要直接為那些高階程式碼默默幫你處理的事負責:資料究竟坐落在記憶體何處、何時被配置與釋放、用了哪個 CPU 暫存器或哪條指令、一個值佔幾個位元組。C 和組合語言之所以貼近硬體,正是因為它們讓你能指定並掌控這些細節。回報是精確的掌控,以及往往頂尖的效能,因為你能讓自己寫的東西契合硬體擅長之事、避開隱藏的開銷。
誠實的取捨:同樣的貼近,也撤掉了安全網。高階語言也許會悄悄阻止你讀過陣列尾端;貼近硬體時,機器會樂意照做,然後搞壞某個東西。所以「貼近硬體」既是優勢(掌控、速度、可預測性),也是危險(沒有護欄、容易當機)——這正是為什麼系統程式設計師要花那麼多力氣,去搞懂機器到底是怎麼運作的。
一個網頁框架讓你寫 user.save(),永遠不必想到位元組。一個寫入網路卡的 C 驅動程式,可能會做 *(volatile uint32_t *)0xFEBC0010 = 0x1——把一個確切的 32 位元值,戳進一個確切的硬體位址。第二個就是貼近硬體。
同樣的意圖(「改一個設定」),但一個是跟物件對話,另一個是跟一個實打實的硬體位址對話。
「貼近硬體」是相對的,不是某個固定層級。相對於 Python,C 貼近硬體;但組合語言又更貼近,而微碼或矽晶片本身則更近。這個說法告訴你的是方向,而非確切的階梯位置。
又稱
另見