web-dev-qa-db-ja.com

高速のLuaJITコンパイラを使用しながら、Luaスクリプトを単一の実行可能ファイルにコンパイルする方法は?

Luaスクリプトを単一の実行可能ファイルにコンパイルしながら、超高速のパフォーマンスを実現するにはどうすればよいですかLuaJITの利点?

バックグラウンド:

  • 私のLuaスクリプトは、私が作成したWebアプリケーション用です(例:ホスト http://example.com へ)
  • 私の現在の技術スタックは、NGINX(Webサーバー)、Lua/LuaJIT(動的コンテンツを取得するための言語)です。
  • 50以上あります.lua Webアプリケーションを構成するファイル(Models/Views/Controllersから)
  • FreeBSD 9オペレーティングシステム

配置を簡単にするために、Webアプリケーションを実行するすべての.luaスクリプトを1つの実行可能ファイルにコンパイルします。

  1. これは可能ですか?

    Luaの公式には SRLua というライブラリが付属しているようです

  2. .luaを単一の実行可能ファイルにコンパイルすることの欠点は何ですか(たとえば、パフォーマンスが低下するなど)?
40
nickb

すべてのLuaソースコードファイルをオブジェクトファイルに変換し、静的ライブラリに配置します。

_for f in *.lua; do
    luajit -b $f `basename $f .lua`.o
done
ar rcus libmyluafiles.a *.o
_

次に、_libmyluafiles.a_を使用して、_-Wl,--whole-archive -lmyluafiles -Wl,--no-whole-archive -Wl,-E_ライブラリをメインプログラムにリンクします。

この行により、リンカーはアーカイブからすべてのオブジェクトファイルを含め、すべてのシンボルをエクスポートします。

たとえば、foo.luaという名前のファイルをアプリケーション内からlocal foo = require("foo")でロードできるようになりました。

_-b_オプションの詳細については、 Running LuaJIT を参照してください。

87
Mike Pall

現在関連する.luaファイルのネストとしてデプロイしているWebアプリの場合、最も簡単な答えは、それらを単一のファイルに圧縮することです。これは、luacを使用した単純なケースでよく行われます。ただし、モジュールが混在する複雑なアプリケーションの場合は、よりスマートなものが必要です。

私は個人的にMathew Wildのユーティリティ squish を使用して同様のことをしています。

Squishを実行すると、すべてのLuaソースコードが便利にバンドルされた単一の.luaファイルができます。その単一のファイルをデプロイするだけで済みます。

バイナリモジュール、またはLuaまたはLuaJITインタープリターもバンドルする必要がある場合は、SRLuaを使用してLuaインタープリターにバンドルするか、LuaJITにバンドルする同様の手法を簡単に使用できます。

2
RBerteig