61

asm.jsでテストおよび開発する方法についての質問を読みました。、および受け入れられた回答は、http://kripken.github.com/mloc_emscripten_talk/#/へのリンクを提供します。

そのスライドショーの結論は、「静的に型付けされた言語、特にC / C ++はJavaScriptに効果的にコンパイルできる」ということです。したがって、「コンパイルされたC / C ++の速度は、ネイティブコードの2倍以上になると予想できます。 、今年後半に」。

しかし、通常のJavaScript自体など、静的に型付けされていない言語についてはどうでしょうか。asm.jsにコンパイルできますか?

4

7 に答える 7

34

JavaScript自体をasm.jsにコンパイルできますか?

その動的な性質のため、実際にはそうではありません。これは、 Cまたはネイティブコードにコンパイルしようとする場合と同じ問題です。実際には、これらの非静的な側面を処理するために、VMを同梱する必要があります。少なくとも、そのようなVMは可能です。

js.jsは、JavaScriptのJavaScriptインタープリターです。インタプリタを最初から作成しようとする代わりに、SpiderMonkeyはLLVMにコンパイルされ、emscriptenが出力をJavaScriptに変換します。

しかし、asmjsコードが通常のJSよりも高速に実行される場合は、JSをasmjsにコンパイルするのが理にかなっています。

いいえ。asm.jsはJSの非常に制限されたサブセットであり、バイトコードに簡単に変換できます。ただし、この利点を得るには、まずJSのすべての高度な機能をそのサブセットに分解する必要があります。これは非常に複雑なタスクです。しかし、JavaScriptエンジンは、これらすべての高度な機能を直接バイトコードに変換するように設計および最適化されています。それでは、なぜasm.jsのような中間ステップを気にする必要があるのでしょうか。Js.jsは、「ネイティブ」JSよりも約200倍遅いと主張しています。

そして、一般的に非静的に型付けされた言語はどうですか?

スライドショーはそれについて…C/C ++だけですか?以降。具体的には:

動的言語

C / C ++ランタイム全体をコンパイルして、元の言語を適切なセマンティクスで解釈できますが、これは軽量ではありません

そのような言語からJavaScriptへのソースツーソースコンパイラは、セマンティックの違い(たとえば、数値型)を無視します

実際、これらの言語は効率を上げるために特別なVMに依存しています

それらのソースツーソースコンパイラは、それらのVMで行われた最適化を失います

于 2013-03-26T08:31:43.603 に答える
12

「それは可能ですか?」という一般的な質問に答えて。答えは確かに、JavaScriptとasm.jsサブセットの両方がチューリング完全であるため、翻訳が存在するということです。

これを実行してパフォーマンス上の利点を期待する必要があるかどうかは、別の問題です。簡単な答えは「いいえ、すべきではありません」です。私はこれを圧縮ファイルを圧縮しようとすることに例えています。はい、圧縮アルゴリズムを実行することは可能ですが、一般に、結果のファイルが小さくなることを期待するべきではありません。

簡単な答え:動的に型付けされた言語のパフォーマンスコストは、コードの意味に由来します。同等の意味を持つ静的に型付けされたプログラムは、同じコストを伴います。

これを理解するには、 asm.jsがパフォーマンス上の利点を提供する理由を理解することが重要です。または、より一般的には、静的に型付けされた言語が動的に型付けされた言語よりも優れたパフォーマンスを発揮する理由。短い答えは「実行時型チェックには時間がかかる」であり、長い答えには静的に型付けされたコードを最適化する可能性の向上が含まれます。例えば:

function a(x) { return x + 1; }
function b(x) { return x - 1; }
function c(x, y) { return a(x) + b(y); }

xとが両方とも整数であることがわかっている場合yは、関数cをいくつかの機械語命令に最適化できます。それらが整数または文字列である可能性がある場合、最適化問題ははるかに困難になります。これらを文字列の加算として扱う必要がある場合もあれば、加算として扱う必要がある場合もあります。特に、c;で発生する加算演算には4つの解釈があります。それは、加算、文字列の追加、または強制から文字列への追加の2つの異なるバリアントである可能性があります。可能なタイプをさらに追加すると、可能な順列の数が増えます。動的に型付けされた言語の最悪の場合、それぞれが任意の数のkを持つ可能性のあるn個の項を含む式のk^n個の可能な解釈があります。タイプ。静的に型付けされた言語では、k = 1であるため、特定の式には常に1つの解釈があります。このため、オプティマイザーは、動的に型付けされたコードよりも静的に型付けされたコードを最適化するのに基本的に効率的です。最適化の機会を探すときに考慮する順列が少なくなります。

ここでのポイントは、動的型付けされたコードから静的型付けされたコードに変換するとき(JavaScriptからasm.jsに移行するときのように)、元のコードのセマンティクスを考慮する必要があるということです。つまり、型チェックは引き続き行われ(静的に型付けされたコードがスペルアウトされたばかりです)、コンパイラを抑制するためにこれらの順列がすべて存在します。

于 2015-05-11T00:12:15.757 に答える
11

asm.jsに関するいくつかの事実。これにより、概念が明確になることを願っています。

  1. はい、 asm.js方言を手作業で書くことができます。

    asm.jsの例を見てみると、ユーザーフレンドリーとはほど遠いものです。明らかに、Javascriptはこのコードを作成するためのフロントエンド言語ではありません。

  2. バニラJavascriptをasm.js方言に翻訳することはできません

    考えてみてください。標準のJavascriptを完全に静的に翻訳できるのであれば、なぜasm.jsが必要になるのでしょうか。asm.jsが唯一存在するということは、一部の人々のJavascript JITの人々は、開発者の努力なしにJavascriptがより速くなるという約束をあきらめたことを意味します。

    これにはいくつかの理由がありますが、JITが静的コンパイラと同じくらい優れた動的言語を理解するのは非常に難しいとだけ言っておきましょうそして、おそらく開発者がJITを完全に理解するために。

結局、それはタスクに適切なツールを使用することに要約されます。静的で非常にパフォーマンスの高いコードが必要な場合は、C / C ++(/ Java)を使用します。動的言語が必要な場合は、JavascriptPython、...を使用します。

于 2013-03-27T16:30:31.783 に答える
3

asm.jsは、簡単に最適化できるjavascriptの小さなサブセットが必要なために作成されました。javascriptをjavascript/asm.jsに変換する方法があれば、asm.jsはもう必要ありません。そのメソッドはjsインタープリターに直接挿入できます。

于 2014-05-09T22:37:06.907 に答える
2

通常のJavaScriptを最初にCまたはC++にコンパイルし、次にEmscriptenを使用して生成されたコードをasm.jsにコンパイルすることにより、通常のJavaScriptをasm.jsに変換できる場合があります。これが実用的かどうかはわかりませんが、それでも興味深い概念です。

JavaScriptをWebAssemblyとASM.jsにコンパイルするNectarJSと呼ばれるコンパイラもあります。

于 2016-10-30T15:44:40.183 に答える
2

理論的には、asm.jsに存在する言語の限られたサブセットで表現できる場合は、JavaScript操作をasm.jsに変換/コンパイル/トランスパイルすることができます。ただし、実際には、現時点では通常のJavaScriptをasm.jsに変換できるツールはありません(2017年6月)。

いずれにせよ、静的型付けを使用する言語をasm.jsに変換する方が理にかなっています。静的型付けは、asm.jsの要件であり、通常のJavaScriptの機能の1つであり、asmへのコンパイルが非常に困難であるためです。 .js。

asm.jsがホットだった2013年に、JavaScriptに似た静的に型付けされた言語をコンパイルする試みがありましたが、言語とコンパイラの両方が放棄されたようです。

今日、2017年には、JavaSciptサブセットのTypeScriptFlowがasm.jsへの変換に適した候補になりますが、どちらの言語のコア開発チームもそのような変換に関心がありません。LLJSにはasm.jsにコンパイルできるフォークがありましたが、そのプロジェクトはほとんど死んでいます。ThinScriptははるかに最近の試みであり、TypeScriptに基づいていますが、どちらもアクティブではないようです。

したがって、asm.jsコードを生成するための最良かつ最も簡単な方法は、C / C ++でコードを記述し、それを変換/コンパイル/トランスパイルすることです。しかし、近い将来、これを実行したいかどうかはまだわかりません。Web Assemblyはまもなくasm.jsに完全に置き換わる可能性があり、WebAssemblyに変換するTurboScriptAssemblyScriptなどのTypeScriptのような言語がすでにポップアップ表示されています。実際、TurboScriptは元々ThinScriptに基づいており、asm.jsにコンパイルするために使用されていましたが、この機能を放棄したようです。

于 2017-06-22T14:11:40.933 に答える
1

これを確認してくださいhttp://badassjs.com/post/43420901994/asm-js-a-low-level-highly-optimizable-subset-of

基本的に、コードがasm.jsと互換性があることを確認する必要があります(強制や型キャストがない、メモリを管理する必要があるなど)。この背後にある考え方は、JavaScriptでコードを記述し、ボトルネックを検出し、コードの変更を行って、jitと動的コンパイルの代わりにasm.jsとaotコンパイルを使用することです...少しPITAですが、JavaScriptまたはその他を使用できますc ++以上のような言語..近い将来、lljs....。

于 2013-03-25T23:48:21.220 に答える