Javascript を Lua にコンパイルするメリットは、最初に想像するほど大きくはありません。Javascript のセマンティクスは Lua のものとは大きく異なります (LuaJIT の作成者は、LuaJIT が Javascript JIT コンパイラーと非常に有利に競争できる主な理由の 1 つとして Lua の設計を挙げています)。
次のコードを使用します。
if("1" == 1)
{
print("Yes");
}
これにより、Javascript で「はい」が出力されます。Lua では文字列が数値と等しくなることはないため、Lua の同等のコードはそうではありません。これは些細なことのように思えるかもしれませんが、根本的な結果があります。Lua の組み込みの等価性テストを使用できなくなりました。
私たちが取れる解決策は2つあります。に書き換えることができ1 == "1"
ますjavascript_equals(1, "1")
。または、すべての Javascript 値を Lua でラップし、Lua のメタテーブルを使用して == 演算子の動作をオーバーライドすることもできます。
そのため、Javascript を Lua にマッピングすることで、すでに Lua の効率をいくらか失っています。これは単純な例ですが、ずっとこのように続いています。たとえば、すべての演算子の規則は Javascript と Lua の間で異なります。
Lua テーブルと同じではないため、Javascript オブジェクトをラップする必要さえあります。たとえば、Javascript オブジェクトは文字列キーのみをサポートし、任意のインデックスを文字列に強制します。
> a = {}
{}
> a[1] = "Hello"
'Hello'
> a["1"]
'Hello'
また、Javascript のスコープ規則、vararg 関数などにも注意する必要があります。
現在、誰かが完全なコンパイラに力を入れれば、これらすべてを克服できます。ただし、効率の向上はすぐにかき消されます。最終的には、Lua で Javascript インタープリターを構築することになります。ほとんどの Javascript インタープリターは C で記述されており、Javascript のセマンティクスに合わせて既に最適化されています。
したがって、効率のためにそれを行うことは、失われた原因です。Lua のみの環境で Javascript をサポートするなど、他の理由があるかもしれませんが、可能であれば、既存の Javascript インタープリターに Lua バインディングを記述するだけで作業が減る可能性があります。
Javascript->Lua のソースからソースへのトランスレータを試してみたい場合は、js2luaを見てください。これは、私が以前に作成したおもちゃのプロジェクトです。それはどこにも完全ではありませんが、それで遊ぶことは確かにいくつかの考えの材料を与えるでしょう. すでに Javascript lexer が含まれているため、大変な作業は既に完了しています。