RISC 與 CISC
/ risk versus sisk /
RISC 與 CISC 是關於「處理器的指令集該有多豐富」的那場偉大設計哲學辯論。RISC(精簡指令集電腦)主張:讓指令簡單、一致、種類少——每條只做一件小而固定的工作,最好一步完成。CISC(複雜指令集電腦)主張:讓單一指令做更多——在一條指令裡讀記憶體、計算、再寫回,配上繁複的定址模式與變動的長度——好讓一條指令完成 RISC 需要好幾條才能做的事。RISC-V 與 ARM 是 RISC;x86 是著名的 CISC。
RISC 的賭注是:簡單、定長、載入-儲存式的指令容易解碼與管線化,所以即使程式需要更多條,機器把每一條跑得夠快,使總時間勝出。CISC 的賭注是:每條指令做更多,能得到更密的程式碼與更少的指令提取,這在記憶體又小又慢的年代曾極為重要。兩方各自最佳化效能鐵律的不同部分:RISC 傾向拉高指令數但降低每條指令的工作量;CISC 則相反。
以下是誠實的現代真相,它比那句老口號「RISC 贏了」有意思得多。高效能 x86 晶片並不直接執行它們的複雜指令;它們的前端把每條 CISC 指令解碼成一串簡單、類 RISC 的內部運算,稱為微運算(micro-op),再由一個 RISC 風格的引擎去跑這些。所以在內部,一顆現代 x86 核心看起來很像一台穿著 CISC 外衣的 RISC 機器。實際的界線確實模糊了:可見的 ISA 可以是 CISC,而實作卻是 RISC 風味。RISC 的想法顯然形塑了所有高速核心的建構方式,但「RISC 就這麼打敗了 CISC」太過輕率——x86 在許多市場仍占主導,而這場較量如今比的是整個生態系,不只是指令數。
把一個記憶體值加到暫存器上,在 x86 是一條 CISC 指令(「add eax, [mem]」)。在 RISC-V 上同樣的工作是先載入再相加。然而在一顆現代 x86 晶片內部,那一條 CISC 指令本身又被拆成類 RISC 的微運算——大致是一個載入微運算和一個加法微運算。
可見的 CISC 指令與隱藏的類 RISC 微運算——這就是界線模糊的原因。
別把「RISC 贏了」當成定論。RISC 的想法遍布每一顆高速核心,但 x86(在 ISA 層級是 CISC)靠在內部解碼成微運算而蓬勃。今日真正的區別是「可見的 ISA」對「內部的實作」,而非贏家對輸家。