Luaスクリプトをバイトコードにコンパイル

このチュートリアルでは、Luaスクリプトをバイトコードにコンパイルする方法をご紹介いたします。バイトコードでコンパイルすることにより、FlashAir内に保存したLuaスクリプトを難読化することが出来ます。


はじめに

  1. FlashAirにFlashAirでLuaを実行するで使用したHelloWorld.luaを設置します。
  2. FlashAirでLuaを実行するを参考に、Luaスクリプト実行方法をCONFIGファイルに指定します。

コンパイル

LuaスクリプトをバイトコードにコンパイルするLuaスクリプトを作成します。Lua標準関数の string.dumpを使用します。

/CompileToByteCode.lua
function luac_func(filename)
  local targets = filename
  local chunk = assert(loadfile(filename))
  local out = assert(io.open(targets..".out", "wb"))
  out:write(string.dump(chunk))
  out:close()
end                
luac_func("HelloWorld.lua")

このスクリプトを実行した後カードを抜き差しすると、HelloWorld.lua.outファイルが作成されます。


バイトコード化したLuaファイルを実行する

ファイル名が異なるまま動作させると、requireなどが正しく動作しない場合があるため、元になったファイルHelloWorld.luaのファイル名を_HelloWorld.luaに変更し、HelloWorld.lua.outを元のファイル名のHelloWorld.luaに変更して実行します。

また、バイトコード化したファイルを呼び出すLuaスクリプトを作成します。Lua標準関数の dofileを使用することも可能です。

/ExecuteByteCode.lua
dofile("/HelloWorld.lua")

このスクリプトを保存しカードを抜き差しした後実行すると、バイトコード化した HelloWorld.luaの実行結果が表示されます。出力はFlashAirでLuaを実行すると同様になります。


バイトコード化したファイル内の関数やオブジェクトを使用する

バイトコード化したLuaファイルを異なるLuaファイルから呼び出してみます。 まずは、tableオブジェクトを返すLuaスクリプトを作成します。

/ReturnTable.lua
local function _foo()
  print("Hello World!")
end                 
return {
  foo=_foo
}

他ファイル内の関数やオブジェクトを使用する場合はLua標準関数の requireを使用し、ファイルを読み込みます。呼び出し側のLuaスクリプトも作成します。

/CallByteCode.lua
local script = require "ReturnTable"
script.foo()

ReturnTable.luaをコンパイルし、バイトコード化します。カードを抜き差しした後CallByteCode.luaを実行すると「Hello World!」が表示されます。


サンプルコード

リポジトリを見る(GitHub)

このサイトのサンプルコードは二条項BSDライセンスで提供されています。