asm.js
警告: asm.js 規範被認為是已棄用。開發者可以考慮 WebAssembly 作為 asm.js 的替代方案,用於在瀏覽器中執行高效能程式碼。
Asm.js 是一種定義了一個可高度最佳化的 JavaScript 子集的規範。本文將探討 asm.js 子集允許的內容、它帶來的改進、在哪裡以及如何使用它,以及其他資源和示例。
asm.js 究竟是什麼?
它是一個非常小、非常嚴格的 JavaScript 子集,只允許諸如 while、if、數字、頂層命名函式和其他簡單結構。它不允許物件、字串、閉包,以及任何需要堆分配的東西。Asm.js 程式碼在許多方面都類似於 C,但它仍然是完全有效的 JavaScript,可以在所有當前引擎中執行。它促使 JS 引擎最佳化此類程式碼,併為像 Emscripten 這樣的編譯器提供了一個清晰的程式碼生成定義。我們將展示 asm.js 程式碼的樣子,並解釋它如何提供幫助以及如何使用它。
這個 JavaScript 子集在許多 JavaScript 引擎中已經透過巧妙的即時(JIT)編譯技術得到了高度最佳化。然而,透過定義一個明確的標準,我們可以進一步最佳化此類程式碼,並從中獲得儘可能多的效能。由於它易於討論和基準測試,因此更容易在多個 JS 引擎之間進行協作。其理念是,此類程式碼應該在每個引擎中都執行得非常快,如果不是,那就是一個 bug,並且有一個清晰的規範供引擎最佳化。
它還使得編寫生成高效能 Web 程式碼的編譯器的人員更容易。他們可以查閱 asm.js 規範,並知道如果遵循 asm.js 模式,程式碼將會執行得很快。作為 C/C++ 到 JavaScript 的編譯器,Emscripten 會發出 asm.js 程式碼,使其在多個瀏覽器上以接近原生效能的速度執行。
此外,如果引擎選擇特別識別 asm.js 程式碼,還可以進行更多最佳化。目前 Firefox 是唯一這樣做的瀏覽器。
asm.js 語言摘要
asm.js 是一種中間程式語言。asm.js 具有非常可預測的效能,因為它僅限於一個極其受限的 JavaScript 子集,該子集僅提供嚴格型別的整數、浮點數、算術運算、函式呼叫和堆訪問。其效能特徵比標準 JavaScript 更接近原生程式碼。asm.js 作為 JavaScript 的一個子集,已經被主流 Web 瀏覽器支援。由於 asm.js 在瀏覽器中執行,因此它在很大程度上依賴於瀏覽器和硬體。