「それは可能ですか?」という一般的な質問に答えて。答えは確かに、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に移行するときのように)、元のコードのセマンティクスを考慮する必要があるということです。つまり、型チェックは引き続き行われ(静的に型付けされたコードがスペルアウトされたばかりです)、コンパイラを抑制するためにこれらの順列がすべて存在します。