web-dev-qa-db-ja.com

luaコードをコンパイルし、バイトコードを保存してからロードして実行します

いくつかのエクスポートされた関数を呼び出すluaスクリプトをコンパイルし、結果のバイトコードをファイルに保存してから、このバイトコードをロードして実行しようとしていますが、これを行う方法の例はありません。これを行う方法について利用可能な例はありますか?これどうやってするの?

編集:私はLua + Luabind(C++)を使用しています

36
WoLfulus

これはすべて非常に簡単です。

まず、Luaスクリプトを実行せずに実行します。 Lua状態をエクスポートされた関数に接続しているかどうかは関係ありません。スクリプトファイルをコンパイルするだけです。

luaL_loadfileを使用できます。C標準ライブラリ関数を使用して、ファイルをディスクから読み取り、lua_Stateにロードします。または、ファイルを自分で文字列に読み込み、luaL_loadstringを使用してlua_Stateに読み込むこともできます。

これらの関数はどちらも lua_loadのドキュメント に従って、戻り値とコンパイラエラーを発行します。

コンパイルが成功した場合、lua_StateはコンパイルされたLuaチャンクをスタックの最上部にあるLua関数として持つようになります。コンパイルされたバイナリを取得するには、lua_dump関数を使用する必要があります。コールバックインターフェイスを使用してデータを渡すため、かなり複雑です。 詳細はドキュメント を参照してください。

そのプロセスが完了すると、コンパイルされたLuaバイトコードができます。それをお好みのファイルに押し込みます。ただ覚えておいてください:テキスト翻訳ではなく、binaryと書いてください。

バイトコードをロードするときになると、あなたがする必要があるのは... まさにあなたが以前にしたこと。よくほとんど。 Luaには、与えられた「文字列」がLuaのソース文字列またはバイトコードであることを検出するヒューリスティックがあります。つまり、以前と同じようにluaL_loadfileを使用してバイトコードをロードできます。

違いは、バイトコードではluaL_loadstringを使用できないことです。その関数は、NULLで終了する文字列を期待していますが、これは悪いことです。バイトコードにはNULL文字が埋め込まれている可能性があり、すべてが台無しになります。したがって、ファイルIOを自分で実行したい場合(特別なファイルシステムなどを使用しているため)、lua_loadを直接使用する必要があります。これも、次のようなコールバックインターフェイスを使用します。 lua_dump。それで、 それを使用する方法を読んでください .

58
Nicol Bolas