BT

Lua: 組込みスクリプトエンジン、新しい高性能VMを搭載したLuaJIT 2.0

| 作者: Abel Avram フォローする 8 人のフォロワー , 翻訳者 徳武 聡 フォローする 0 人のフォロワー 投稿日 2010年1月26日. 推定読書時間: 4 分 |

原文(投稿日:2010/01/22)へのリンク

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から借りてきている。また、SNOBOLAWK、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で書かれたウェブフレームワークも最低ふたつは存在する。KeplerOrbitだ。

この記事に星をつける

おすすめ度
スタイル

こんにちは

コメントするには InfoQアカウントの登録 または が必要です。InfoQ に登録するとさまざまなことができます。

アカウント登録をしてInfoQをお楽しみください。

あなたの意見をお聞かせください。

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする
コミュニティコメント

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

HTML: a,b,br,blockquote,i,li,pre,u,ul,p

このスレッドのメッセージについてEmailでリプライする

ディスカッション

特集コンテンツ一覧

.NETの派生を理解する

Wayne Citrin 2018年7月18日 午前3時44分

ASP.NET Core - シンプルの力

Chris Klug 2018年6月4日 午前3時26分

InfoQにログインし新機能を利用する


パスワードを忘れた方はこちらへ

Follow

お気に入りのトピックや著者をフォローする

業界やサイト内で一番重要な見出しを閲覧する

Like

より多いシグナル、より少ないノイズ

お気に入りのトピックと著者を選択して自分のフィードを作る

Notifications

最新情報をすぐ手に入れるようにしよう

通知設定をして、お気に入りコンテンツを見逃さないようにしよう!

BT