指令集架構(ISA)
/ I-S-A /
指令集架構(instruction set architecture,簡稱 ISA)是設計晶片的人與替它撰寫程式的人之間的契約。可以把它想成餐廳的菜單:菜單明確告訴你能點哪些菜、每道菜是什麼,卻完全不提廚房的事——用哪種爐子、有幾位廚師、有沒有事先切好食材。只要菜單不變,餐廳就能把廚房整個重蓋一遍,而你這位顧客完全不必重新學怎麼點菜。ISA 就是處理器的這份菜單,也是整台機器中最重要的一個介面。
具體來說,ISA 定義了四樣軟體看得到、可以依賴的東西:指令(處理器能執行的運算,例如加法、載入、儲存、分支)、暫存器(指令所操作的少數具名儲存槽)、資料型別與其格式(整數與浮點數在位元中如何排列),以及記憶體模型(記憶體如何定址、一個位元組多大、什麼樣的存取才合法)。其餘的一切——跑多快、一次做幾件事、內部用了什麼花招——都被刻意隱藏起來。對某個 ISA 編譯出來的程式,能在任何遵守該 ISA 的晶片上執行。
千萬別把 ISA 與微架構(也稱為組織)混為一談;微架構是某顆特定晶片實際如何實作這個 ISA。兩顆晶片可以共用同一個 ISA,內部卻天差地別:一顆可能一次只執行一條指令,另一顆可能一次亂序執行六條。它們仍跑相同的程式,因為對外可見的契約完全一致。RISC-V、x86、ARM 都是 ISA;而像 Core i7 或 Apple M 系列這樣的特定處理器,則是某個 ISA 的一種實作。ISA 是比任何單一晶片都更長壽的標準——數十年前的 x86 程式,今天依然能跑。
RISC-V 指令「add x5, x6, x7」的意思是:取出暫存器 x6 與 x7 的內容,相加,把結果放進暫存器 x5。ISA 精確定義了這一行的意義;它並不規定晶片是要花一個時脈週期還是三個來完成它。
ISA 固定的是一條指令的「意義」,而不是執行它的速度或方法。
ISA 是「架構」(可見的契約);晶片如何實作它則是「微架構」(組織)。把兩者搞混是初學者最常犯的錯——更快的晶片通常是「同一個 ISA 的更好實作」,而不是換了一個 ISA。