JavascriptをLuaにコンパイルするのは、あなたが最初に想像するほど大きくはありません。 JavascriptのセマンティクスはLuaとは非常に異なっています(LuaJITの作者は、Luaの設計を、Javascript JITコンパイラと非常によく競合する主な理由の1つとして挙げています)。
は、このコードを取る:
if("1" == 1)
{
print("Yes");
}
このプリントを "はい" JavaScriptで。 Luaの同等のコードは、文字列がLuaの数値と決して等しくないので、そうではありません。これは小さな点のように見えるかもしれませんが、根本的な結果があります.Luaの組み込み同値テストはもう使用できません。
解決策は2つあります。 1 == "1"
をjavascript_equals(1, "1")
に書き換えることができました。あるいは、LuaのすべてのJavascript値をラップし、Luaのメタテーブルを使用して==演算子の動作をオーバーライドすることもできます。
私たちは既にJavascriptをマッピングすることによってLuaから効率を失っています。これは簡単な例ですが、このように続けています。たとえば、JavascriptとLuaではすべての演算子のルールが異なります。
Javascriptオブジェクトは、Luaテーブルと同じではないため、ラップする必要があります。例えばJavascriptが唯一のサポート文字列キーオブジェクト、および文字列に任意のインデックスを強制:
> a = {}
{}
> a[1] = "Hello"
'Hello'
> a["1"]
'Hello'
あなたはまた、そうでJavaScriptのスコープ規則、可変引数関数に注意する必要があり、そして。
誰かが完全なコンパイラに力を入れていたら、これらのことはすべて克服できます。しかし、どんな効率性の向上もまもなく溺死するだろう。基本的には、LuaでJavascriptインタプリタを構築することになります。ほとんどのJavascriptインタプリタはC言語で書かれており、すでにJavascriptのセマンティクスのために最適化されています。
したがって、効率を上げることは失われた原因です。 Lua専用の環境でJavascriptをサポートするなど、他の理由があるかもしれませんが、可能であれば既存のJavascriptインタプリタにLuaバインディングを書くだけではあまり効果がありません。
Javascript-> Luaのソースからソースへのトランスレータを使用したい場合は、js2luaを見てください。これは私がしばらく前に作成したおもちゃプロジェクトです。それは完全なものではありませんが、それを使って遊ぶことは、確かに思考のための食糧を与えるでしょう。すでにJavascriptレクサーが含まれているので、すでに苦労しています。
確かに、V8はCライブラリとして使用できます(Node.jsによる)。 – Pointy
私は自分の質問を更新しました - あなたは正しいですV8はライブラリとして使用することができます。しかし、その複雑さのために、開発者が単一のアプリプロジェクトのために行うものではない。 iOSのネイティブコード生成に関する制約もあります。 Luaを埋め込むことは、ゲーム間ではるかに簡単であり、かなり一般的です。 – mirkokiefer
Node.js - 'luvit'に関するコメントだけではなく、Node.jsをLuaに移植する最初のプロジェクトではなく、[LuaNode](https://github.com/ignacio/LuaNode)もあります。 'libuv'の代わりに' boost.asio'を使います。 –