簡體   English   中英

為asm.js編寫優化的JS

[英]Writing optimised JS for asm.js

對於asm.js以及它如何能夠運行一些非常繁重的應用程序有一點興奮。 但是,它是從C ++代碼編譯的。 如果不了解C ++或其他低級語言,是否仍然可以獲得當前改進的好處?

以下是我的想法:我們是否可以在Js中編寫代碼,為asm.js重新編譯以進行優化?

如果你有一個非常耗費計算量的小函數(處理數字而不是操作DOM),你可以自己手動重寫asm.js樣式。 這是可能的( 我已經完成了 ),但很乏味。

還有其他asm.js編譯器,例如LLJS ,您可以使用它而不是C ++。

但是,asm.js並不神奇。 當您使用比JS更適合於提前優化的語言時,您將獲得性能優勢。 你不能使用功能齊全的JS並通過在JS VM上運行JS VM來加快速度,就像你不能通過壓縮它們來制作更小的ZIP文件一樣。

但是,它是從C ++代碼編譯的。

它不是。 這是一種語言。 任何程序都可以發出包含asm.js代碼的文本文件。 Emscripten將LLVM IR編譯為asm.js,並且有從C和C ++到LLVM IR的編譯器,但這只是獲取asm.js代碼的一種可能方式。 不可否認,它目前是最成熟,最實用和最受歡迎的方式,但如果其他語言的其他asm.js編譯器在未來的某個時間出現,我也不會感到驚訝。

如果不了解C ++或其他低級語言,是否仍然可以獲得當前改進的好處?

那么,從理論上講,任何能夠有效地編譯成機器代碼的語言都可以使用asm.js高效地實現,並且包括一些相當高級的語言(例如Haskell)。 但是目前,沒有人有工作實施,我不希望這種情況變得非常流行。 現在,如果你想要asm.js性能,你可能會編寫C或C ++代碼並將其編譯為asm.js,是的。

請注意,上面排除了(以及其他許多)Javascript。事實上asm.js是Javascript的一個子集很方便,因為asm.js代碼將在未修改的瀏覽器上運行,但對於任何編寫Javascript的人來說都沒有多大用處。 asm.js基本上只是機器代碼之上的一個薄層,對安全性和JS互操作性有一些修正。 將JS編譯為asm.js與將其編譯為機器代碼一樣困難:如果你不吝嗇性能(只是總是使用盒裝的動態類型值,如解釋器,並發出對運行時庫函數的調用),那就很容易了,非常你做的很難。

事實上,經過幾十年的研究,仍然沒有像Javascript,Ruby或Python這樣的高度動態語言提前編譯成機器代碼並且運行速度比聰明的解釋器快得多的例子。 另一方面,即時編譯非常實用 - 但主要的JS引擎已經這樣做了,比編譯為asm.js更簡單,然后再次解析並將其編譯為機器代碼。

Asm.js不是一種單獨的語言,而是Javascript的一個子集。 這只是Javascript,因為性能而被剝奪了很多。 這意味着您不需要學習另一種語言,但在這種情況下,了解C / C ++可能對理解它很有用。

Asm.js是JavaScript的一個非常嚴格的子集,在從C / C ++編譯到JavaScript時可以相對容易地生成。 Asm.js代碼比普通的JavaScript代碼更接近機器代碼,這使得瀏覽器可以對asm.js中編寫的任何代碼進行大量優化。 在實現這些優化的瀏覽器中,您的代碼通常會運行編譯為機器代碼的C / C ++程序速度的大約50%......這可能看起來很慢,但是比任何普通的JavaScript都要快得多!

然而,正是因為它針對機器而非人類進行了優化,asm.js幾乎不可能被任何人類開發人員手動編碼......即使它只是 JavaScript。 雖然技術上可以將 - 至少是普通JavaScript的一部分轉換為asm.js等價物,但這樣的轉換並不是一件容易的事,我還沒有遇到任何試圖實現這一目標的項目。

在有人完成這樣一項艱巨任務之前,生成asm.js代碼的最佳方法仍然是用C / C ++編寫代碼並將其轉換為JavaScript。

有關asm.js的更多信息,請參閱eg。 John Resig的文章來自2013年官方規格

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM