web-dev-qa-db-ja.com

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

私は最近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 Assembly)がバイナリである以外に、2つの違いは何ですか?
  3. これは、ブラウザで実行されている他のスクリプト言語にとって何を意味しますか? pythonを例にとると、それはになりますか
    • wasmにコンパイルされたpythonコード?または
    • pythonインタープリター(Cpython)をwasmにコンパイルしてPythonを解釈しますか?
89
NeoWang

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

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

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

なし、今のところ。 wasmは後方互換性があると想定されています asmにコンパイル可能 (これも通常のJSとして実行可能です)。ただし、サポートが拡大するにつれて、将来的に その他の機能 で拡張される可能性があります。

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

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

43
Bergi

asm.jsは、「高度に最適化可能な」命令を持つJSのサブセットです。基本的には、タイプ(int、float)を宣言でき、jsエンジン(ブラウザーだけでなく、node.jsも)が命令をより速く実行します。 WebGLと組み合わせて使用​​する場合、アプリで多くの計算またはグラフィックスを実行するとメリットがあります。

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

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

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

48
cristian v

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 Assembly)がバイナリである以外に、2つの違いは何ですか?

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

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

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

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

19
Luke