2015-07-19 28 views
57

我一直在閱讀有關asm.js和網絡組件,最近:asm.js和web程序集有什麼不同?

http://ejohn.org/blog/asmjs-javascript-compile-target/

https://brendaneich.com/2015/06/from-asm-js-to-webassembly/

我仍然感到困惑的幾件事情:

  1. 編譯asm.js代碼在時間和運行?編譯成什麼?
  2. 除了asm.js是二進制文本和wasm(web程序集)之外,2之間的區別是什麼?
  3. 這對在瀏覽器中運行的其他腳本語言有什麼意義?以python爲例,它會是
    • python代碼編譯爲wasm嗎?或
    • python解釋器(Cpython)編譯成wasm和解釋python?

回答

25

是asm.js代碼在編譯時間和運行?編譯成什麼?

asm.js是常規的javascript代碼,並一直由JS解釋器編譯成字節碼。但是,具有asm支持的解釋器應該提前編譯,並且可能由於靜態類型而生成更高效的代碼表示。詳情請參閱http://asmjs.org/

asm和wasm(除了text和binary之外)有什麼區別?

沒有,現在。 wasm應該是向後兼容的,compilable to asm(它也可以像普通的JS那樣執行)。但是,隨着對它的支持增長,它可能會在未來擴展到more features

這對在瀏覽器中運行的其他腳本語言有什麼意義?

後者,而是Python仍然需要解釋。腳本語言不需要解釋器,當然可以直接編譯爲(w)asm,因爲有一個編譯器(鏈)支持它作爲目標。

+0

夫婦筆記。你的答案的第一部分似乎有點模糊;聽起來好像你在說asm.js會將AOT編譯成「更高效的字節碼」。事實上,實現沒有目標字節碼,而事實上許多針對本地[ISA](https://en.wikipedia.org/wiki/Instruction_set)直接和AOT(這是一種點的,真的) 。你也可以說「可編譯爲asm和js」。你可能想澄清,你打算說「本地組裝」或什麼的。或者,也許你的意思是「asm.js和js」,但這不是太有用,因爲一個是另一個的子集。 – tne

+0

@tne:感謝您的反饋,我希望我能解決問題 - 隨意(建議一)自行編輯,我將不勝感激。是的,我是在「更高效的字節碼」有點鬆懈,因爲我不熟悉的確切編譯架構,畢竟ISA只不過是另一種「字節代碼」由處理器解釋。請原諒不準確的術語:-) – Bergi

17

asm.js代碼是否及時編譯並運行?編譯成什麼?

不同的瀏覽器以不同的方式編譯asm.js代碼。正如2015年8月的:

  • 火狐編譯asm.js爲機器代碼(和緩存對於相同asm.js的將來負載機器代碼)[1]。
  • 在Windows 10中,作爲一個實驗性標誌,Edge還會對asm.js進行一些前期驗證和編譯[2]。
  • Chrome特別認識到asm.js開頭的「使用asm」指令可以更加熱切地解析和分析代碼,並調整編譯啓發式。
  • Safari沒有對asm.js進行特殊處理。

除了asm.js是文本和WASM(網絡組件)是二進制,什麼是2之間的區別是什麼?

asm.js只是JavaScript,因此必須根據JavaScript規範來運行。作爲一個新標準,WebAssembly能夠修復JavaScript行爲不理想的一些案例(從性能或編譯角度來看)[3]。在未來,WebAssembly將能夠添加否則難以在JavaScript中表達的功能。

對於在 瀏覽器中運行的其他腳本語言,這意味着什麼?以python爲例,它會是

  • python代碼編譯爲wasm嗎?或
  • python解釋器(Cpython)編譯成wasm和解釋python?

在第1節,在瀏覽器中運行Python將編譯Python解釋器WASM,就像你說的最簡單的方法。這意味着,例如,Python GC以wasm代碼運行並手動管理wasm線性內存。已經有一個實驗項目將一個asm.js後端添加到PyPy [5](它可以爲wasm工作)。它目前遇到了asm.js的限制,可以通過wasm的dynamic linking future feature來解決。進一步說,wasm試圖提供GC integrationJIT compilation support這兩者都將允許更高效和自然地與Web平臺集成。

33

asm.js是具有「高度優化」指令的JS的子集。基本上你可以聲明類型(int,float)和js引擎(在瀏覽器中,但也可以是node.js)將更快地執行指令。如果您的應用程序與WebGL一起使用時執行大量計算或圖形,它會帶來好處。

web程序集是JS的所有JS的二進制格式,不僅是asm.js.它不是一個字節碼,它是解析器計算的AST的二進制編碼。它有2個大好處:

  • JS引擎可以跳過解析步
  • 它比JS原始來源更加緊湊

我們已經可以編寫代碼的瀏覽器是不是JS :EMSCripten可以在JS代碼中編譯C++代碼。其他的編譯器已經可以將你的代碼編譯成JS了。 使用asm.js代碼在數學運算時可以運行得更快。 使用Web程序集,代碼將更加緊湊,瀏覽器將能夠更快地處理它(因爲它可以跳過解析)。 您將不會有像DirectX,JavaApplets,Flash或Silverlight一樣加載的新插件,因爲所有內容都將在JS沙箱中運行。

+1

跳過解析?慢下來,在那裏。在可預見的將來,硬件支持不在地圖上。你的意思是解析成爲asm.js的瓶頸,而且wasm修復了高效的二進制格式。 asm.js/wasm的基本原理似乎有點簡約,但沒關係。指出字節碼!= AST的道具。 – tne

相關問題