2012-03-06 8 views
14

私はluaをバイトコードチャンクと一緒にC言語で書かれたプロジェクトに埋め込んでいます。 私はluaコードベースに.luaファイルを追加すると、このコードを1つのバイトコードチャンクに保持する方法はありますか?すべてを1つのluaバイトコードチャンクに保存しますか?

(私は複数のバイトコードのチャンクをロードする方法を知っている。しかし、それは単一のチャンクをロードすること、その後、グルーコードを忘れことがちょうど快適と思われる。)

私はテキストを含めることを使用しようとしましたが、ありませんがありますようですこれはLuaのキーワードです。 "require"と "dofile"は実行時にファイルを参照するため、 "lua -b ..."を実行した結果のバイトコードにはこれらのファイルのコードは含まれません。

バイトコードファイルを結合する方法はありませんか?つまり、バイトコードファイルを作成するときには、 "require"コマンドを使用すると、これらのファイルのコードがすべて1つのバイトコードファイルに追加されます。

PS:Michal Kottmanの答えが、私が求めていたLuaのために働いています。私は、LuaとLuaJITが同じように動作すると考えました。彼らはしません。 1つのLuaJITバイトコードファイルに複数の.luaファイルを結合するには、必要がある1

  • は使用 "LuaJIT -b"(動作しないようです)
  • のLuaのLuaJIT源とluac.c
  • エミュレートluac.cをコンパイルluaコマンドで(C APIなし)?
+0

ここでは、トピックと参考になる回答があります。 http://stackoverflow.com/questions/8936369/compile-lua-code-store-bytecode-then-load-and-execute-it –

答えて

11

luacを使用して複数のファイルを1つのファイルにまとめることができます。あなたはluaL_loadfileを使用してCからLuaのにこのファイルを読み込むことができ

$ echo "x=1"   > l1.lua 
$ echo "y=2"   > l2.lua 
$ echo "print(x, y)" > l3.lua 
$ luac -o run.luac l1.lua l2.lua l3.lua 
$ lua run.luac 
1 2 

、上部の機能を置く:実行すると、ソースファイルからすべてのチャンクは、彼らがコンパイルされたファイルに追加された順序で実行されていますスタックが正常にロードされた場合はスタックコンパイルされたファイルをすべて実行するには、lua_callを使用してこの関数を実行します。

コンパイルしたファイルの内容を文字列としてプロジェクトに埋め込むことができます。外部ファイルに保存する必要はありません。あなたが見つけてきたように、あなたは以前に述べたようにロードすることができる結合ファイルを取得するためにLua Compiler in Luaを使用することができますLuaJIT 2

ため

を更新。

$ luajit combine.lua l1.lua l2.lua l3.lua > out.ljc 
$ luajit out.ljc 
1 2 
+0

多くの感謝!元のLuaではうまくいくでしょう。私は "luajit -b"といくつかのファイルを使ってluaJITで同じことを達成しようとしていますが、そこではできませんでした。 luaJITにluac.cはありません。バイトコードの形式が違うので、この方法でluaJITでも使えるかどうかは疑問です。多分、ここのようなluacをエミュレートすることによってhttp://lua-users.org/wiki/LuaCompilerInLua。 – John

+0

このhttp://lua-users.org/lists/lua-l/2005-12/msg00209.htmlによると、luac.cはluaJITでも動作します。 – John

+0

標準のLuaバイトコードを読み取ることができたのはLuaJIT 1です。新しいLuaJIT 2には、互換性のないバイトコードがあります。 –

0

loadstringあなたの探しているものです。文字列を受け取り、if(必要に応じてバイトコードにコンパイルした後)をロードします。それは、その後に含まれるコードを実行するために実行できる関数になります。

あなたはまだ、より一般的なものが必要な場合は、あなたがチャンクを養うための関数を指定することができますloadを見てみましょう。

どちらの関数はLuaのソースコードとコンパイルされたバイトコードの両方を処理することができます。

+0

私はそれを試しました、私はそれがどのように動作するかを見ていますが、ロードチャンクとロードチャンクの両方を含むチャンク。あなたは例を挙げることができますか?私はオブジェクトファイルから単一のライブラリファイルを作成するようなものを探しています(Cで作業するとき)ので、すべてのオブジェクトファイルにリンクする必要はありません。これと同じですが、Luaのために、実行可能ファイルに1つのリソースだけを埋め込む必要があります。 – John

+0

私は参照してください。おそらくこのリンクはあなたをさらに助けることができます:[LuaでのLuaコンパイラ] – jpjacobs

+0

ありがとう、これはluacがないので、おそらくluaJITの唯一の方法です。 – John

4

別の方法としては、収集するために、マシュー・ワイルドのsquishのようなツールを使用することです。これは、標準出力に出力し簡略化し、次のとおりです。次のように前のサンプルについて

-- http://lua-users.org/wiki/LuaCompilerInLua 
-- compile the input file(s) passed as arguments and output them combined to stdout 
local chunk = {} 
for _, file in ipairs(arg) do 
    chunk[#chunk + 1] = assert(loadfile(file)) 
end 
if #chunk == 1 then 
    chunk = chunk[1] 
else 
    -- combine multiple input files into a single chunk 
    for i, func in ipairs(chunk) do 
    chunk[i] = ("loadstring%q(...);"):format(string.dump(func)) 
    end 
    chunk = assert(loadstring(table.concat(chunk))) 
end 
io.write(string.dump(chunk)) 

、あなたはそれを使用することができますあなたのすべてのLuaソースは単一の.luaファイルになります。 squishの優れた機能の1つは、squakedパッケージをソースファイルの合計よりも小さくするためのさまざまなフィルタをサポートしていることです。

squishを適用した後、結果をluacまで実行してバイトコードを取得できます。しかし、バイトコードはしばしばソースコードより大きく、より積極的なフィルタ(例えばgzip)がスキームで使用されるならば、確かに大きくなります。

バイトコードファイルが実行可能ファイルとは別に保存されている(または悪いことにネットワーク経由で送信された)場合、私はLuaソースコードには当てはまらないバイトコードに関するセキュリティ上の懸念も提起します。しかし、有害なバイトコードは決してluacの実行の結果ではないので、アプリケーションにリンクされたバイトコードは崩壊するのがずっと難しくなります。

2

luac、luajit、squishを試した後、私はそれらのすべてがあなたが結合するファイルリストを維持することが必要であることを発見しました。プロジェクトで作業するときには、多くのluaファイルが含まれているのは面倒です。

だから私はここにそれがあるrequire

を分析することによって、LUAファイルをマージするための小さなツールを書いた:https://github.com/yi/node-lua-distiller

はそれが役に立つことを願っています。

関連する問題