asm.jsとWebAssemblyの違いは何ですか?


101

私は最近asm.jsとWebAssemblyについて読んでいます:

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を例にとると、それは
    • wasmにコンパイルされたpythonコード?または
    • wasmにコンパイルされてpythonを解釈するpythonインタープリター(Cpython)?

回答:


47

asm.jsコードは時間内にコンパイルされて実行されますか?何にコンパイル?

asm.jsは通常のJavaScriptコードであり、いつものようにJSインタープリターによってバイトコードにコンパイルされます。ただし、asmをサポートするインタープリターは、事前コンパイルを実行し、静的型付けのために、より効率的なコード表現を生成することが想定されています。詳細については、http://asmjs.org/を参照してください。

asmとwasmの違いは何ですか(テキストとバイナリを除く)?

現時点ではありません。wasmは下位互換性があり、asmコンパイル可能であると想定されています(これも通常のJSとして実行可能です)。ただし、サポートの拡大に応じて、将来にはより多くの機能で拡張される可能性があります。

これは、ブラウザで実行されている他のスクリプト言語にとって何を意味しますか?

後者はむしろ、Pythonがまだ解釈される必要があるためです。インタプリタを必要としないスクリプト言語は、それをターゲットとしてサポートするコンパイラ(チェーン)があれば、もちろん(w)asmに直接コンパイルできます。


カップルノート。回答の最初の部分は少しあいまいに見えます。asm.jsはAOTを「より効率的なバイトコード」にコンパイルすると言っているようです。実際、実装はバイトコードをターゲットにする必要はありません。実際、多くの場合、ネイティブISAとAOTをターゲットにします(これはまさにポイントの1つです)。「asmとjsにコンパイル可能」とも言います。「ネイティブアセンブリ」または何かを言うつもりだったことを明確にしたい場合があります。あるいは、「asm.jsとjs」を意味するかもしれませんが、一方が他方のサブセットであるため、あまり役に立ちません。
2015

1
@tne:フィードバックをありがとう、問題を解決できるといいのですが、自由に(提案して)​​自分で編集してください。確かに、正確なコンパイルアーキテクチャに精通していないので、ISAはプロセッサによって解釈されるもう1つの「バイトコード」にすぎないので、「より効率的なバイトコード」には少し余裕がありませんでした。不正確な用語はご容赦ください:-)
Bergi

53

asm.jsは「高度に最適化可能な」命令を備えたJSのサブセットです。基本的に、型(int、float)を宣言でき、jsエンジン(ブラウザーだけでなく、node.jsも)が命令をより速く実行します。アプリがWebGLと一緒に使用された場合に多くの計算またはグラフィックを実行する場合に利点があります。

Webアセンブリは、asm.jsだけでなく、JSのすべてのJSのバイナリ形式です。これはバイトコードではなく、パーサーが計算するASTのバイナリエンコーディングです。2つの大きなメリットがあります。

  • JSエンジンは解析ステップをスキップできます
  • JSオリジナルのソースよりもはるかにコンパクトです

JS以外のブラウザ用のコードはすでに作成できます。EMSCriptenは、JSコードでc ++コードをコンパイルできます。他のトランスコンパイラーは、コードをJSにコンパイルするためにすでに利用可能です。asm.jsを使用すると、そのコードは計算を行うときにより高速に実行できます。Webアセンブリを使用すると、コードがよりコンパクトになり、ブラウザーはそれをより速く処理できます(解析をスキップできるため)。すべてがJSサンドボックスで実行されるため、DirectX、JavaApplets、Flash、Silverlightなどの新しいプラグインをロードする必要はありません。


5
解析をスキップしますか?遅くなります。近い将来、ハードウェアサポートは予定外です。つまり、解析はasm.jsのボトルネックになり、wasmは効率的なバイナリ形式でそれを修正します。asm.js / wasmの根拠は少しミニマリストのようですが、それで問題ありません。バイトコードを指摘するための小道具!= AST。
2015

4
@ Cristian、WASMはJSのバイナリ形式ではありません。JSと同じWeb APIを使用しますが、JSよりも移植性が高く、一般化されています。:JS、またはバイトコードのための唯一のバイナリ形式は、これらのFirefoxのここでのように、ブラウザに実装されているdeveloper.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/...
LearningFast

20

asm.jsコードは時間内にコンパイルされて実行されますか?何にコンパイル?

異なるブラウザーはasm.jsコードを異なる方法でコンパイルします。2015年8月現在:

  • Firefoxはasm.jsをマシンコードにコンパイルします(そして、同じasm.jsの将来のロードのためにマシンコードをキャッシュします)[ 1 ]。
  • Windows 10では、実験的なフラグとして、Edgeは事前検証とasm.jsのコンパイルも行います[ 2 ]。
  • Chromeはasm.jsの先頭にある「use asm」ディレクティブを特別に認識して、コードをより熱心に解析および分析し、コンパイルヒューリスティックを調整します。
  • Safariはasm.jsの特別な処理を行いません。

asm.jsがテキストでwasm(Webアセンブリ)がバイナリである以外に、2つの違いは何ですか?

asm.jsは単なるJavaScriptであるため、JavaScript仕様に従って正確に動作する必要があります。新しい標準として、WebAssemblyはJavaScriptの動作が理想的ではないいくつかのコーナーケースを修正できます(パフォーマンスまたはコンパイルの観点から)[ 3 ]。将来[ 4 ]、WebAssemblyはJavaScriptで表現するのが難しい機能を追加できるようになります。

これは、ブラウザで実行されている他のスクリプト言語にとって何を意味しますか?Pythonを例にとると、それは

  • wasmにコンパイルされたpythonコード?または
  • wasmにコンパイルされてpythonを解釈するpythonインタープリター(Cpython)?

v.1では、ブラウザーでPythonを実行する最も簡単な方法は、Pythonインタープリターをwasmにコンパイルすることです。これは、たとえば、Python GCがwasmコードで実行され、wasmリニアメモリを手動で管理していることを意味します。asm.jsバックエンドをPyPy [ 5 ] に追加するための実験的なプロジェクトがすでにあります(wasmでも同様に機能します)。現在、asm.jsの制限に直面しています。asm.jsは、wasmの動的リンクの将来の機能で対処できます。さらに、wasmは、GC統合JITコンパイルサポートの両方を提供することを目指しています。これらのサポートにより、Webプラットフォームとのより効率的で自然な統合が可能になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.