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プラットフォームとのより効率的で自然な統合が可能になります。