看板 CompilerDev 關於我們 聯絡資訊
shecc [1] 不僅是一個從無到有開發、可編譯自身 (self-hosting) 的 C 語言編譯器, 更是理解編譯器最佳化策略的教學範例。其最佳化設計已形成層次分明的架構:前端產生 SSA 形式的中間表示,中端透過全域與區域的分析進行轉換,後端再以 peephole 最佳化 和指令序列重寫完成修飾,展現出具體而微的最佳化流程。連同 Arm 和 RISC-V 處理器 後端的程式碼,全部僅 1 萬行出頭的 C 專案,且不依賴任何組譯器或連結器,直接輸出 ELF 執行檔。 在 SSA 層級,shecc 能進行常數折疊 (constant folding) 與條件化簡,將運算式在編譯 階段就化約為常數,並且配合代數化簡策略,移除多餘的加零、乘一、位元運算恆等式, 使產生的程式更加緊湊。它同時支援公共子表示式消除 (Common Subexpression Elimination, CSE),避免重複計算相同的表達式,並透過死碼刪除移除 (Dead Code Elimination, DCE) 不影響結果的運算與基本區塊,以縮短執行路徑。phi 節點的最佳化 則專注於 SSA 合流點的裁剪與簡化,減少不必要的數值傳遞 (value propagation),使 後續暫存器配置 (register allocation) 更有效率。 當進入後端產生目標碼時,shecc 會套用多階段的窺孔最佳化。這些規則涵蓋位元運算、 比較運算的模式化簡,並包含強度削弱 (strength reduction),例如將乘除以二的冪轉換 為位移操作以降低成本。它還能進行多指令分析,允許在更大的指令視窗 (instruction window) 內進行最佳化,例如連續搬移或計算指令的合併。針對冗餘的搬移指令,亦可 檢測並刪除,減少暫存器壓力並縮短指令序列。即使是除法與餘數運算,編譯器也會加入 安全防護與條件化簡,確保不會產生除以零的錯誤,並針對常值情況進行簡化。 這些最佳化策略和改進並非僅限於前端或後端,而是跨越整個編譯流程,例如近期 GitHub 提交紀錄中還可以看到暫存器配置的強化,進一步降低記憶體存取次數並提升執行效率。 由於 shecc 的設計是教學導向,它同時保留可觀察的中間表示輸出功能,方便學生比較 最佳化前後的差異,並驗證其效果。 [1] https://github.com/sysprog21/shecc -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.116.245.217 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/CompilerDev/M.1757665982.A.956.html
mshockwave: 推推 09/18 11:48
SmallHanley: 推 09/18 15:38
cseslowpoke: 推 09/21 21:41
ChampYen: 推 10/14 15:11