二進位相容
二進位相容是一種承諾:一個已經編譯成機器碼的程式——是真正的那串 1 與 0,不是原始碼——能在共用其 ISA 的其他晶片上(包括未來的晶片)原封不動地繼續跑。這正是為什麼多年前的一款遊戲或辦公軟體,不必任何人重新編譯,就還能在一台全新的電腦上啟動。編譯好的二進位檔說的是 ISA 的語言,任何遵守那種語言的晶片都能跑它。
它之所以行得通,正是因為 ISA 是一份穩定的契約。只要一顆新晶片實作相同的指令、暫存器與記憶體模型,一個舊二進位檔的位元就仍代表同樣的意思,即使新晶片快上一倍、內部又截然不同。向後相容具體指:新晶片仍能跑舊二進位檔;這正是為什麼 x86 背負著數十年累積、永遠丟不掉的指令——移除它們會弄壞至今仍依賴它們的軟體。反面的向前相容則較弱:舊晶片通常無法跑一個使用了它製造之後才加入之指令的新二進位檔。
二進位相容是運算界最強大也最被低估的力量之一,因為它保護了鎖在既有軟體中的龐大投資。它是 ISA 之所以如此長壽、如此難以取代的主要原因之一:改用一個根本上全新的 ISA,意味著要嘛重新編譯一切(在你有原始碼時),要嘛跑一層較慢的轉譯層去模擬舊指令。一個誠實的提醒:相容性並非免費——它逼迫設計者永遠繼續支援老舊、有時很彆扭的指令,這也是為什麼一個從零開始、乾淨的開放 ISA(如 RISC-V)會這麼有吸引力。
一個 1990 年代為 x86 編譯的程式,不必重新編譯就還能在一台現代 x86 筆電上跑,因為今天的晶片仍實作那些舊指令。這就是向後二進位相容跨越三十年發揮的效用。
舊的機器碼在同 ISA 的新晶片上持續運作——這就是一份穩定契約的回報。
相容主要是向後的,不是向前的。一個使用了新加入指令的新二進位檔,無法在那些指令出現之前製造的舊晶片上跑——這正是用最新擴展編譯所冒的風險。