V8 開發人員為 WebAssembly 引入了反編譯器

V8 JavaScript 引擎開發人員 已提交 公用事業 wasm反編譯,它允許反編譯中間二進製表示 WebAssembly 變成一種可讀的偽語言,讓人想起 JavaScript 和 C。 所提出的偽語言比“.wat”格式的 WebAssembly 文本表示更容易理解並且更適合手動解析,後者更接近彙編程序而不是高級語言。 同時,在可能的情況下,反編譯完全反映了 Wasm 的表示。

反編譯器 包括 在工具包中 WABT,它提供 WebAssembly 的二進制和文本表示之間的轉換,以及解析、處理、修改和檢查 wasm 文件。 作為 WABT 的一部分,還開發了一個實用程序 瓦斯姆2c,它允許 wasm 文件被反編譯成等效的 C 代碼,可以由 C 編譯器編譯,但在可讀性方面與“wat”的文本表示沒有太大區別。

比如把原來的C函數編譯成wasm

typedef struct { 浮動 x, y, z; }vec3;

浮點(const vec3 *a,const vec3 *b){
返回 a->x * b->x +
a->y * b->y +
a->z * b->z;
}

將被 wasm-decompile 實用程序反編譯為偽語言

函數點(a:{ a:float, b:float, c:float },
b:{ a:float, b:float, c:float }):float {
返回 aa*ba+ab*bb+ac*bc
}

轉換為“.wat”文本格式時看起來像這樣

(func $dot (類型 0) (參數 i32 i32) (結果 f32)
(f32.添加
(f32.添加
(f32.mul
(f32.負載
(本地.get 0))
(f32.負載
(本地.獲取1)))
(f32.mul
(f32.負載偏移=4
(本地.get 0))
(f32.負載偏移=4
(本地.獲取1))))
(f32.mul
(f32.負載偏移=8
(本地.get 0))
(f32.負載偏移=8
(本地.get 1)))))

來源: opennet.ru

添加評論