18. 下列哪一個編譯程式(Compiler)的最佳化過程與機器有關?
(A)布林表示式的最佳化(Boolean Expression Optimization)
(B)刪除共同的副式子(Elimination Of Common Subexpression)
(C)窺孔最佳化(Peephole Optimization)
(D)不變計算移至迴圈外面(Loop Optimization)
答案:登入後查看
統計: A(285), B(74), C(896), D(107), E(0) #1914580
統計: A(285), B(74), C(896), D(107), E(0) #1914580
詳解 (共 6 筆)
#3129023
(C)一種產生執行碼最佳化的方法,其只考慮相鄰的指令以查找一些特定的組合並以較有效的指令取代之。如:連續加一常數到一暫存器,可改以一次加二倍的常數到一暫存器。
ADD R15, 2
ADD R15, 2
改為
ADD R15, 4 。
19
0
#5895151
參考:https://zh.wikipedia.org/zh-tw/%E4%BC%98%E5%8C%96%E7%BC%96%E8%AF%91%E5%99%A8
0
0
#7478776
這題的正確答案是 (C) 窺孔最佳化(Peephole Optimization)。
? 觀念解析:編譯器最佳化的兩大分類
編譯器(Compiler)在將高階語言轉譯為機器碼的過程中,最佳化技術主要分為以下兩大階段:
| 分類 | 運作階段與對象 | 特點與常見技術 |
|
機器無關最佳化
(Machine-Independent)
|
在產生**「中間表示碼 (Intermediate Representation, IR)」**或語法樹階段進行。 |
不管底層 CPU 是哪一種架構都能做,主要優化程式的高階邏輯與演算法結構。
• 刪除共同副式子 (Common Subexpression Elimination)
• 迴圈不變量外提 (Loop Invariant Code Motion)
• 無效程式碼刪除 (Dead Code Elimination)
• 常數摺疊與傳播 (Constant Folding / Propagation)
• 布林表示式最佳化 (Boolean Expression Optimization)
|
|
機器相關最佳化
(Machine-Dependent)
|
在**「目標碼生成 (Target Code Generation)」**或組合語言階段進行。 |
必須針對特定的硬體架構(如 x86, ARM, RISC-V)量身打造,考慮暫存器數量、特定指令集、管線(Pipeline)結構等。
• 窺孔最佳化 (Peephole Optimization)
• 暫存器配置 (Register Allocation)
• 指令排程 (Instruction Scheduling)
|
? 為什麼 (C) 窺孔最佳化與機器有關?
-
什麼是「窺孔 (Peephole)」?就像拿一個小窺孔(滑動視窗 Sliding Window),一次只看連續 2 到 4 行已經產生的目標機器指令(Assembly / Machine Code)。
-
它做什麼事?針對目標硬體的指令特性,把冗餘或昂貴的指令替換成更短、更快的專屬機器指令。例如:
-
冗餘 Load/Store 消除:剛將數值寫入記憶體,下一行又從該記憶體讀入同一暫存器(針對暫存器結構最佳化)。
-
機器專屬指令替換:將通用乘法指令替換為移位指令(例如:MUL 2 改為 SHL 1),或利用特定 CPU 提供的自增指令(如 INC)。
-
跳躍指令簡化:消除 Jump 到另一個 Jump 的無效跳躍。
-
因為這些操作直接作用在目標 CPU 的指令集與暫存器上,所以屬於標準的機器相關最佳化。
? 其他選項逐一解析(皆為機器無關)
-
(A) 布林表示式的最佳化:針對邏輯運算(如利用笛摩根定律簡化、短路求值),在抽象語法層面即可完成。
-
(B) 刪除共同的副式子:發現多次計算同一算式(如重複出現 x = a + b),將其暫存起來共用,處理的是 IR 中間碼。
-
(D) 不變計算移至迴圈外面:將迴圈內每次算出來都一樣的常數計算提到迴圈前執行,處理的是高階控制流程。
0
0