Lua(ルア)はスクリプト言語およびその処理系の実装で、主にリオデジャネイロ・カトリカ大学のコンピュータ科学科 (Department of Computer Science) および/または同大学附属研究所のTecgraf/PUC-Rioに所属するロベルト・イエルサリムスキー Roberto Ierusalimschy、Waldemar Celes、Luiz Henrique de Figueiredoらによって設計開発された。

手続き型言語として、またプロトタイプベースのオブジェクト指向言語としても利用することができ、関数型言語としての要素も併せ持っている。

## 名称の由来

Luaという名前は、ポルトガル語の「月」に由来する。もともとLuaはブラジルの石油会社であるペトロブラス内部でデータ入力用に開発された言語DEL (data entry language) と、レポート生成用に開発されたSOL (simple object language) の2つの簡易言語に由来する。SOLがポルトガル語で太陽を意味することから、新しい言語の名称はLua(月)になった。

## 概要

Luaは、C言語のホストプログラムに組み込まれることを目的に設計されており、高速な動作と、高い移植性、組み込みの容易さが特徴である。いったんバイトコードにコンパイルされ、Lua VMで実行される。LuaJITは The Computer Language Benchmarks Game によると、動的型付けのスクリプト言語では最速の言語・処理系である。

TIOBE Programming Community Indexでは2007年に人気が急上昇し、2011年6月には10番目に人気なプログラミング言語になったが、その後は人気が下がっている。2009年2月の調査で、ゲーム開発者がイベントスクリプト等の内部処理に利用する言語として、最も利用例が多いと報告されるなど、近年はゲーム産業での利用が広がっている。2013年3月以来、ウィキメディア財団のサイトではLuaをサポートしている。

MITライセンスのもと配布されている。

## 特徴

Luaの特徴としては、汎用性が高いが比較的容易に実装が可能である、というものである。実際のところLuaは、オブジェクト指向などといった他の要素としての働きを明白にはサポートしていないが、サポートしていない範囲においても容易に拡張が可能である。また前述のような、動作の高速性や優れた移植性なども大きな特徴である。

文法的な特徴としては、Pascalによく似た構文を採用していること、コルーチン(協調的マルチタスク)のサポート、数値型は整数と浮動小数点数の区別がないこと(ただしLua 5.3では整数型が導入された)、関数を変数として扱えることなどが挙げられる。

Luaはいわゆる汎用スクリプト言語であり、特定の用途に限定されない性質を持つが、同じく汎用スクリプト言語であるPerl、Python、Rubyと比較して高速に動作する。これはLuaの理念である、簡素、高効率、高移植性を目指した実装の産物である。また、Luaにおけるテーブル(連想配列)の実装はかなり最適化されており、特にキーに数値のみを使用した場合は、単純な配列としてさらに高速に動作するようになる。

Lua 5.0以前はメモリ管理にマーク & スイープ方式のガベージコレクションが使用されていたが、Lua 5.1ではメモリ管理にインクリメンタル・ガベージコレクションが採用され、リアルタイム用途における性能の改善が図られている。ガベージコレクションの実装形態も Lua の高速動作および高リアルタイム性能に一役買っている。

## LuaJIT

LuaのJITコンパイラである LuaJITがMike Pallにより開発されている。動的型付けであるにもかかわらず、Javaよりも少し遅くなる程度の速度で動いている。静的単一代入などをつかった高度な最適化が行われており、バイトコードを実行する場合と比べて、数倍から数100倍の高速化が期待できる。

## Luaの歴史

### Lua

- 1993年07月28日 - Lua 1.0 リリース。
- 1995年02月07日 - Lua 2.1 リリース。
- 1997年07月01日 - Lua 3.0 リリース。
- 2000年11月06日 - Lua 4.0 リリース。
- 2003年04月11日 - Lua 5.0 リリース。MITライセンスの採用。
- 2006年02月21日 - Lua 5.1 リリース。インクリメンタルGCの採用。
- 2008年08月22日 - Lua 5.1.4 リリース。
- 2010年05月14日 - Lua 5.1.4-2 リリース。
- 2011年12月16日 - Lua 5.2.0 リリース。ビット演算ライブラリをサポート。
- 2012年06月14日 - Lua 5.2.1 リリース。
- 2013年03月27日 - Lua 5.2.2 リリース。
- 2013年12月07日 - Lua 5.2.3 リリース。
- 2015年01月06日 - Lua 5.3.0 リリース。整数型およびビット演算子のサポートなど。
- 2020年06月29日 - Lua 5.4.0 リリース。

### LuaJIT

- 2005年09月08日 - LuaJIT 1.0.3 リリース。最初の公開版。
- 2006年03月13日 - LuaJIT 1.1.0 リリース。Lua 5.1対応。
- 2006年06月24日 - LuaJIT 1.1.2 リリース。
- 2007年05月24日 - LuaJIT 1.1.3 リリース。
- 2008年02月05日 - LuaJIT 1.1.4 リリース。
- 2008年10月25日 - LuaJIT 1.1.5 リリース。
- 2010年03月28日 - LuaJIT 1.1.6 リリース。
- 2011年05月05日 - LuaJIT 1.1.7 リリース。
- 2012年04月16日 - LuaJIT 1.1.8 リリース。
- 2012年11月08日 - LuaJIT 2.0.0 リリース。
- 2013年02月19日 - LuaJIT 2.0.1 リリース。
- 2013年06月03日 - LuaJIT 2.0.2 リリース。
- 2014年03月12日 - LuaJIT 2.0.3 リリース。
- 2015年05月14日 - LuaJIT 2.0.4 リリース。
- 2017年05月01日 - LuaJIT 2.0.5 リリース。

## コード例

### コルーチン

コルーチンは状態遷移を記述するのに便利である。

### 正規表現

LuaはPOSIXやECMAScript標準の正規表現とは異なる独自のカスタムパターンマッチングをサポートする。

## LuaとC/C++の相互運用

LuaにはC言語向けの相互運用APIが用意されている。LuaからC/C++の関数を呼び出すためには以下の方法を用いる。下記のコードはC/C++の関数をLua VMに登録し、Luaスクリプト側から呼び出している。

逆に、C/C++からLuaの関数を呼び出す際にもスタック操作が必要となる。

## 言語バインディングの例

Luaの他言語用バインディングは公式には提供されていないが、有志によるサードパーティ製ライブラリやツールがいくつか存在する。バインディングを使うと、前述のような煩雑なスタック操作を明示的に記述することなく、簡潔に相互運用できるようになる。

### C++

LuaをC++言語で記述されたホストプログラムへ組み込むための省力化ツール(コードジェネレーター)および言語バインディングとして、toLua、
tolua++(Lua 5.2非対応)、Luabind(Lua 5.2非対応)、Selene、Sol、Sol2などが開発されている。

以下にSol2を使った例を示す(C++11およびC++14の機能を利用するため、対応コンパイラが必要)。

- LuaからC/C++の関数を呼び出す例:

C/C++の関数を呼び出すLuaスクリプト (test.lua):

- C++からLuaの関数を呼び出す例:

C++から呼び出される関数を定義するLuaスクリプト (test.lua):

### Java

LuajというJava仮想マシン向けの実装がある。Luaj 3.0は、Lua 5.2相当の仕様をJavaで実装しなおしたものであり、Javaのクラスからバインダ無しでインスタンスを生成したりメソッドを呼び出したりすることが可能である。そのほか、LuaのC APIをJNI経由でJavaから利用可能にするJNLuaが存在する。

### .NET

C#やVB.NETといった.NET Framework言語向けのバインディングとして、LunaRoadが存在する。C#で書かれたLuaインタプリタとしてMoonSharpが存在する。また、DLR上に実装されたNeoLuaが存在する。

## Luaを採用している製品

### ゲーム

- Blue Mars
- CRYSIS
- Far Cry
- Factorio
- From the depths
- Garry's MOD
- Lost Wind
- RagnarokOnline
- Roblox
- Stomworks
- Xenepic Online Revo
- ソニック・ザ・ヘッジホッグ (2006年のゲーム)
- ソニック ワールドアドベンチャー(北米版のタイトルはSonic Unleashed)
- ティアーズ・トゥ・ティアラ 花冠の大地
- THE IDOLM@STER 2
- Warhammer Online:Age of Reckoning
- World of Warcraft
- カンパニー・オブ・ヒーローズ
- GRAVITY DAZE
- ニンテンドークラシックミニ ファミリーコンピュータ (エミュレータシステム kachikachi のゲーム選択画面で使用)
- PHANTASY STAR ONLINE 2
- ファイナルファンタジーXIV
- ドラゴンクエストX

### ゲーム以外

- 3DMLWプラグイン
- Adobe Photoshop Lightroom
- Aegisub
- Anime Studio
- Apache mod\_lua
- Asterisk extensions.lua
- AutoTouch
- AviUtl
- Computercraft - MinecraftのMOD
- FlashAir - 無線LAN機能を搭載した東芝製SDHCメモリーカード
- FLOW - 設定に使われている
- FreeBSD - ブートローダのUI等を実装
- LuaTeX
- MediaWiki(Scribunto拡張により)
- MySQL Proxy
- Nginx
- nmap
- OpenResty
- OpenWrt
- osm2pgsql - OpenStreetMapのデータをPostGISに読み込むユーティリティ
- Premake
- Redis
- RigidChips
- Renoise
- Strata 3D
- Tachyon
- TileMan
- ヤマハのルータ製品 - RTXシリーズ(5000/3500/1300/1220/1210/1200/830/810) NVRシリーズ、FWX120、SRT100
- Vim - ビルド時に有効化することで拡張スクリプト内でLuaを使用できる、派生のNeovimではLuaJITが内部的に利用されており組み込まれている
- VLC Media Player
- VOCALOID3 - ユーザー側で歌唱合成用データを加工するエフェクタを自作できる
- Wireshark