
引言2026 年 7 月 26 日的文章探討了在非 RISC - V 機器上RISC - V 程序性能接近裸機性能的方法關鍵是使用提前編譯器通過尾調用連接基本塊采用 Clang 的 preserve_none 調用約定保留熱點來賓狀態。作者參與 [OpenVM](https://github.com/openvm - org/openvm) 開發這是在 [Axiom](https://axiom.xyz) 構建的 RISC - V 虛擬機能運行程序并生成加密證明。在 Axiom 工作時證明生成從單 CPU 擴展到 [GPU 集群](https://ethproofs.org/provers)但執行速度成瓶頸。在 M3 MacBook 上原生 arm64 程序約 100 毫秒完成通過解釋器運行相同程序需三到四秒。解釋器基準運行 RISC - V 代碼的直接方法是用解釋器執行取指 - 解碼 - 執行周期。但來賓指令短小解釋器管理指令時間可能超執行時間。提前預解碼可對指令預解碼存儲操作、操作數和處理程序指針解碼不再是熱點循環部分執行時通過間接調用處理程序指針分發。通過計算跳轉進行分發預解碼后間接分發成瓶頸可用“計算跳轉”每個處理程序查找下一個操作碼標簽并跳轉執行過程通過間接跳轉轉移控制權。尾調用線程化尾調用可連接處理程序處理程序尾調用下一個處理程序。編譯器可將調用轉換為普通跳轉Clang 的 musttail 屬性強制轉換。將狀態保留在寄存器中處理程序通過 State * 訪問 pc可將其作為函數參數傳遞讓編譯器將頻繁使用的值保留在宿主機寄存器中。實現原生執行手動編寫的匯編后端簡單的提前AOT翻譯器逐指令翻譯 RISC - V 指令生成匯編代碼代價是可移植性差。寄存器映射翻譯器可將頻繁使用的來賓寄存器映射到宿主機寄存器減少內存和寄存器間的移動。讓 Clang 作為后端一個巨型函數可將整個程序作為一個函數轉換為 C 代碼讓編譯器優化。但程序規模大時此方法失效。逐基本塊重新編譯基本塊是順序指令序列重新編譯器將每個基本塊作為單獨 C 函數生成讓 Clang 優化。識別基本塊重新編譯器通過識別基本塊和連接成控制流圖確定生成函數的起始和結束位置。示例展示了如何應用規則處理對數組求和的函數。