asm.jsについてこれさえ知っておけば超絶ライフハックで明日から収入が三倍になって身長が伸びて血圧が下がって寿命が10年伸びて彼女が出来て合コンでモテて子供が神童と呼ばれ東大首席入学で末は博士か大臣かコースまっしぐらで老後も安泰で人類も平和になるだいたい10個くらいの何か

色んなニュースで取り上げられているけど、結局肝心のところが捨て置かれたままに数字とかアプローチの是非が巷で語られてるので補足します。

asm.js の js とは何か

JavaScript の言語コア部分、ECMAScript のこと。DOM は入ってない。MozillaJavaScript という単語を使う場合、

  1. SpiderMonkey 上に実装された ECMAScriptMozilla 方言
  2. ECMAScript
  3. ECMAScript + DOM

の3パターンが存在している。1と2の区別がつかないのは仕方が無いけど、2と3の区別がついてない人が多すぎるので敢えて書いた。

OdinMonkey

SpiderMonkey の asm.js 実装のこと。IonMonkeyで構築された使ってAOTコンパイルする。非asm.jsなコードが OdinMonkey で速くなるわけではない

asm.js と DOM

早合点して中途半端に解説してる記事を鵜呑みにしてる人が多いけど、asm.js で従来のコードの殆ど(DOMが絡む処理)は速くならない。asm.jsで速くなるのは、ターゲットがEmscriptenとされているように、Deflate とか JPEG2000 のデコーダとか、ECMAScriptの言語仕様の範囲内で完結させる事が可能な「低レイヤーな」計算領域。

並列、SIMD、マルチスレッドetc...

現状の spec に存在しない。必要になったら追加されるんじゃない? 並列処理については、ECMAScript.next の proposal にも出てきているのでそっちを上手く使うかもしれない

デバッグ

普通に Firefox の JS デバッガでアタッチできました(現時点の実装では、デバッガがアタッチした事で asm.js のAOTコンパイルが無効になった = 通常のJS同様に実行される旨がエラーメッセージで出る)

「2倍程度高速」

”2X slower than native” という英語をテキトーに訳した結果だと思われます。日本語の推敲くらいしろよ……

「結局、ネイティブ言語より遅いとか……」

世の中のあらゆる処理を JS で置き換えなければならないのであれば、可読性も悪いし人間が書くにも面倒くさいしCよりも遅いasm.jsは銀の弾丸として役に立たないクソ言語ですが、常識的に考えて本当に速度が必要な箇所はC/C++で書きますし、それでも遅い場合はアセンブラで書けば良いと思います。「なぜJSで書かなければならないのか?(なぜWebベースで開発しなければならないのか?)」ということを考えるべし


一部表現を推敲

@kazuhoさんからこんなツッコミが。

現状のspecではその通りですが、あくまでも「DOMありきで語られる"JS"との対比軸として、従来からECMAScriptに限定した領域で完結させられる処理が、asm.jsを用いる事で高速化できる余地がある」ということを示すという意味での上述の文章ということで宜しくお願いします。

個人的には、ES6 structured binary data API を用いた struct の、早期の導入を応援しています*1