Luaは、Lua用のC言語のAPIフックを提供するアプリケーションならどんなアプリケーションにも組み込むことができるスクリプトエンジンだ。最近、LuaのJITコンパイラのバージョン2がベータになった。これには、トレースコンパイラとアセンブラで書かれたインタプリンタに基づいて完全に書き直されたVMが含まれている。
Luaはポルトガル語で月を意味する。この言語は1993年以来、3人の教授の内輪でリリースが繰り返されてきた。3人とはRoberto Ierusalimschy氏、Waldemar Celes氏、そしてLuiz Henrique de Figueiredo氏だ。それから、幾度となくバージョンアップを繰り返し、最新のバージョンはLua 5.1.4で、2008年にリリースされた。
Luaは汎用スクリプト言語で、構文はModulaから借りてきている。また、SNOBOLやAWK、C++、そしてLispからも影響を受けている。また、Schemeからも大きく影響を受けた言語だ。データ定義言語の構文はIerusalimschy氏が作ったSOL(ポルトガル語で'太陽')という言語から継承しているが、このSOLはLuaによって置き換えられた。その他の特徴としては、関数型で、拡張すればオブジェクト指向言語として使え、プロトタイプベースでもあり、ガベージコレクションもサポートしている。
LuaはCのAPIを持っているので、様々な言語で書かれたアプリケーションに簡単に埋め込むことができる。このAPIはコア部分のAPIと拡張ライブラリに分かれている。バイナリパッケージの大きさはプラットフォームによって違うが、200から700KBくらいでとても小さく、ANSIまたはISO Cコンパイラを搭載するプラットフォームであれば、どのようなプラットフォームでも動作する。実際、すべてのUnix/LinuxやWindowsで動作するだけでなく、ARMを搭載した携帯端末やRabbitマイクロプロセッサ/コントローラでも動作する。
最も重要な特徴のひとつとして挙げられるのは、テーブル型だ。このデータ型は唯一の複合型であるが拡張することができる。テーブルは
キーとデータのペアのコレクション(ハッシュ異種性連想配列としても知られている)で、キーによってデータを参照する。nil以外ならどんな型でもキー(インデックス)として利用できる。数値型のキー
1
は文字列型のキー"1"
とは区別される。
Luaにはクラスという概念はないが、ファンクションとテーブルを使って作ることもできる。
テーブルの中にファンクションと関連するデータを配置することでオブジェクトを形成できる。継承(単一であれ多重であれ)も"メタテーブル"を使えば実現できる。ブジェクトが自身には存在しないメソッドやフィールドを親オブジェクトにあるかどうか探索するように仕組めばいい。
下記がLuaの単純なサンプルコードだ。
function factorial(n) if n == 0 then return 1 else return n * factorial(n - 1) end end
他のスクリプト言語とは違って、Luaは直接解釈されるのではなくバイトコードにコンパイルされてから独自のレジスタベースのバーチャルマシン上で実行される。ドイツのオープンソース開発者であるMichael Pall氏はLua用のJITコンパイラを実装し、現在バージョン2.0がベータ2になっている。氏はまずx86アーキテクチャ用のJITを作成し、現在64ビットアーキテクチャへの移植を試みている。作者のLuaJITに対するコメントは、
柔軟性と高性能を併せ持ちながら、それに似つかわしくないほど少ないメモリしか使いません。VMに使うのがせいぜい120Kくらいで、JITコンパイラに必要なのは80Kくらいです。…
2009年は長い間待たれていたLuaJIT 2.0の最初のリリースが行われた年になりました。このバージョンではVMは徹底的に性能を追求するため完全に書き直され、その結果、アセンブラで書かれた高速インタプリンタと最新技術を用いたJITコンパイラが出来上がりました。
また、革新的なトレースコンパイラも統合されていて、先進的なSSAベースの最適化とバックエンド処理での高度に調整されたコード生成を実現しています。これによって動的言語に特徴的なオーバーヘッドが大幅に削減されました。その結果、性能は、従来はオフラインの静的言語コンパイラの性能と考えられている水準に近づきつつあります。
Luaは様々なアプリケーションに組み込めるが、一方でゲーム開発者にも受け入れられている。高性能に加えて、一度ゲームを中断して様々なパラメータをいじったあと、ゲームを再開するときにリビルドするための停止がほとんどなくて済むのがLuaが受け入れられている大きな理由だ。World of WarcraftやLeague of Legends、Star Warシリーズやその他の様々なゲームが開発時にLuaを使っている。その他にも様々なタイプのアプリケーションがLuaを利用したり、Luaを使うための実装がされている。例えば、Adobe Photoshop LightroomやApache HTTP Server(mod_luaモジュール)、MySQL Proxy、nmap、そして他にもたくさんある。Luaで書かれたウェブフレームワークも最低ふたつは存在する。KeplerとOrbitだ。