Skip to content
Published on

モダン Lua & Luau 2026 — Lua 5.4 / LuaJIT / Roblox Luau / Neovim Lua / OpenResty / Defold / Love2D 徹底ガイド

Authors

プロローグ — 「Lua は終わった」と言うのは誰か

2026年5月、「Lua はもう終わった」と言う人がいるなら、その人は過去5年間、ゲーム業界・エディタ界隈・高性能 Web サーバーの領域を一度も見ていない人だ。

数字を見よう。

  • Roblox: MAU 4億超え。ゲームロジックは全部 Luau(Roblox がフォークした型付き Lua)。毎日数十万行の Luau が新たに書かれている。
  • Neovim: 2024年の 0.10、2025年の 0.11、2026年の 0.12 — その間に VimScript から Lua への移行はほぼ完了した。 LazyVim・AstroNvim・NvChad・LunarVim の4大ディストロの GitHub スター合計は10万を超えている。
  • OpenResty / NGINX Lua: Cloudflare は今もエッジの一部で LuaJIT を動かしている。1ノードで秒間数百万リクエストを処理するワークロードの大半が Lua で書かれている。
  • World of Warcraft アドオン: 20年経った今でも Lua。2026年のパッチごとに人気アドオンが数百本更新される。
  • Defold: King(Candy Crush の開発元)が公開している Lua ゲームエンジン。モバイル市場で Unity・Godot と並ぶ3大選択肢の一角。

そしてこれらすべてが、1行で説明できる言語の上で動いている。リファレンス実装のインタプリタは25,000行未満、ANSI C 89 で書かれていて、ほとんどどこにでも組み込める。

本稿では、2026年の Lua/Luau エコシステムを一気に整理する。Lua 5.4 の新機能、LuaJIT のパフォーマンス、Roblox Luau の型システム、LazyVim の設定爆発、OpenResty の NGINX 組み込み、Defold・Love2D のインディエンジン、そして Hammerspoon・Wireshark のようなデスクトップ組み込みまで。


1章 · 2026年 Lua エコシステムの地図 — 4つの軸

まず一枚の絵から。

                          [ Lua コア本体 ]
                                 |
        +------------------------+------------------------+
        |                |                |               |
   Lua 5.4         LuaJIT 2.1       Luau (Roblox)    変種言語
   (PUC-Rio)      (Mike Pall)       (typed fork)     (4 + α)
   integer 型     Lua 5.1 ABI       gradual types   MoonScript
   to-be-closed   インタプリタ最強   native codegen  Yuescript
   bitwise        FFI                                Teal (typed)
   世代別 GC      最速の動的         parallel Luau   Pluto
                  言語の一角                         Fennel (Lisp)
        |                |                |               |
        +-------+--------+--------+-------+-------+-------+
                |                 |               |
        [ Neovim 0.12 ]   [ OpenResty ]    [ ゲーム / エンジン ]
         LazyVim           NGINX + Lua      Roblox
         AstroNvim         Kong API GW      WoW アドオン
         NvChad            Apache APISIX    Defold (King)
         LunarVim          Tarantool DB     Love2D
                                            Solar2D
                                            Garry's Mod
                                            Tabletop Sim
                                            Source 2 (CS2)
                                            |
                                       [ デスクトップ組み込み ]
                                        Hammerspoon (Mac)
                                        Adobe Lightroom プラグイン
                                        Wireshark ディセクタ

ポイント整理。

  • Lua 5.4 — PUC-Rio(ブラジル・リオデジャネイロ・カトリック大学)発の最新安定版。いまだに 5.5 のコミットメントはない。 Roberto Ierusalimschy がペースを決める。
  • LuaJIT 2.1 — Mike Pall によるトレース JIT。5.3 以降の統合サポート後継はまだない。 Lua 5.1 ABI 互換に固定。それでも動的言語ランタイムの中では依然として最速級。
  • Luau — Roblox がフォークした型付き Lua。グラデュアル型付け、ネイティブコード生成、parallel Luau(マルチスレッド)。2025年末にオープンソース・ロードマップを発表。
  • 変種言語 — MoonScript(CoffeeScript ライク)、Yuescript(MoonScript フォーク)、Teal(typed Lua)、Pluto(Lua 5.4 + モダン機能のスーパーセット)、Fennel(Lua VM の Lisp)。

2章 · Lua 5.4 — 最新の安定版、しかし保守的

PUC-Rio Lua 5.4 は2020年6月に初期リリース、2024年までに 5.4.7 までパッチされている。2025–2026年現在も新しいメジャー(5.5)はまだ存在しない。Roberto Ierusalimschy はインタビューのたびに「言語にとっては安定性が最重要」と繰り返している。

5.4 で入った変更点。

整数 vs 浮動小数 — 別の型

5.3 から導入され、5.4 で洗練された変更。以前はすべての数値が double だった。

-- Lua 5.4
print(math.type(1))     -- integer
print(math.type(1.0))   -- float
print(math.type(1/2))   -- float (除算は常に float)
print(math.type(1//2))  -- integer (床除算)

-- ビット演算は整数限定
print(0xFF & 0x0F)      -- 15
print(1 << 4)           -- 16

LuaJIT は Lua 5.1 ABI ベースのままなので、この整数型を標準ではサポートしていない。これが両陣営の最大の分岐点。

to-be-closed 変数 — Lua の RAII

C++ の RAII や Python の with に近いリソース管理機能。

-- Lua 5.4
do
  local file <close> = io.open("data.txt", "r")
  -- ブロックを抜ける瞬間、メタテーブルの __close が自動で呼ばれる
  -- 例外が発生しても呼ばれる(try/finally なしで安全)
  for line in file:lines() do
    print(line)
  end
end
-- ここでは file はもう閉じている

<close> 注釈が付いた変数はスコープを抜けるときにメタテーブルの __close が呼ばれる。リソースリーク対策に非常に有効。

世代別 GC

5.4 の GC は世代別(generational)モードを第一級の選択肢として追加した。従来の incremental と切り替え可能。

-- generational GC に切り替え
collectgarbage("generational")

-- 短命オブジェクトの多いワークロード(パース・描画ループ)で 30–60% 高速化

新文法 — goto ラベル / const / close

local PI <const> = 3.14159  -- 再代入を試みるとコンパイルエラー

for i = 1, 10 do
  for j = 1, 10 do
    if i * j > 50 then goto done end
  end
end
::done::
print("抜けた")

<const> は小さいが大きな安全性向上。意図しない再代入をコンパイル時に弾ける。


3章 · LuaJIT — Mike Pall、パフォーマンスの王、後継者は不在

LuaJIT を抜きにして Lua は語れない。Mike Pall がほぼ一人で築き上げ維持してきたこのプロジェクトは、2026年でも動的言語ランタイムのゴールドスタンダードの一つだ。

なぜ速いのか

  • トレースコンパイラ: ホットループを検出してマシンコードへコンパイルする。PyPy と同じ発想、より堅牢な実装。
  • NaN タギング: すべての Lua 値(数値・文字列・テーブル・関数)を 64bit double 内にパック。ボクシングなしの直接メモリアクセス。
  • FFI(Foreign Function Interface): C の関数や構造体を Lua から直接呼ぶ。C 拡張なしで。
-- LuaJIT FFI の例
local ffi = require("ffi")

ffi.cdef[[
typedef struct { double x, y, z; } Vec3;
double sqrt(double);
]]

local v = ffi.new("Vec3", 1, 2, 3)
local len = ffi.C.sqrt(v.x*v.x + v.y*v.y + v.z*v.z)
print(len)  -- 3.7416...

このコードは C で書いたものとほぼ同じ速度で走る。ゲームエンジンやミドルウェアが LuaJIT を愛する理由。

5.3 以降の統合サポートがない理由

LuaJIT は Lua 5.1 ABI に固定されている。Mike Pall は2020年ごろ LuaJIT 2.1 beta の作業を中断し、2.1 はいまだに「beta」のタグを付けたまま世界中の本番で使われている。整数型・to-be-closed・64bit ビット演算は部分サポートか未サポート。

このため2026年現在、Lua エコシステムは2つに分かれている。

  • LuaJIT 陣営: OpenResty、World of Warcraft(Wrath 以降)、Defold、Love2D(0.11 以降は LuaJIT デフォルト)、Wireshark。
  • 純粋 Lua 5.4 陣営: 組み込み環境(メモリ制約)、Roberto Ierusalimschy の PUC-Rio 本家、一部の新規プロジェクト。

LuaJIT の今後

  • OpenResty フォーク: openresty/luajit2 — LuaJIT 2.1 を積極的に PR で取り込むフォーク。事実上の本番標準。
  • Cloudflare 由来のパッチ: 重要なパッチの一部は Cloudflare のエンジニアが投じている。
  • Mike Pall 本人は? 2025年に新たな maintainer 募集の記事を再掲。後継体制の確立が2026年の課題。

4章 · Luau — Roblox の型付き Lua フォーク

Luau(発音は「ルーアウ」)は Roblox が2019年ごろにフォークした Lua 5.1 ベースの言語。2021年にオープンソース化、2026年現在 Lua エコシステムで最も速く進化している変種である。

何が違うのか

-- Luau の型システム
local function add(a: number, b: number): number
  return a + b
end

type Vec3 = { x: number, y: number, z: number }

local function length(v: Vec3): number
  return math.sqrt(v.x^2 + v.y^2 + v.z^2)
end

-- strict / nonstrict / nocheck をファイルごとに選択
--!strict
  • グラデュアル型付け(gradual typing) — 型注釈なしでも動く。徐々に追加すれば徐々に安全になる。TypeScript と同じ思想。
  • strict / nonstrict — ファイルの1行目に --!strict を書けば完全型チェック。
  • ネイティブコード生成(NCG) — 2023年導入。ホット関数をマシンコードへコンパイル。LuaJIT のトレースコンパイルとは別アプローチで、メソッド単位。
  • parallel Luau — Roblox 導入のアクターモデル・マルチスレッド。メインスレッド以外のワーカースレッドで Luau が走る。
  • Lua 5.1 互換ベース — そのため LuaJIT のコードを比較的移植しやすい。ただし Roblox API に縛られるため丸ごとの移植はできない。

Roblox の外で使えるか

2025年末ごろから、Luau はスタンドアロンランタイムを真剣に整備してきた。luau コマンドラインツールが npm・Homebrew に上がり、Lune のような Luau ランタイムプロジェクトが Discord ボットや CLI ツールを Luau で書く道を開いた。

# macOS でスタンドアロン Luau をインストール
brew install luau

# 実行
echo 'print(string.format("hello %s", "luau"))' | luau -

2026年ロードマップ

Roblox は四半期ごとに Luau RFC(正式提案)を公開する。2026年 Q1 の見どころ:

  • type function — 型レベルの関数。TypeScript の conditional type に近いメタプログラミング。
  • buffer 標準 API 拡張 — バイナリデータ処理。
  • エラーハンドリング改善 — try/catch ライクな構造の RFC が進行中。

5章 · Roblox 開発 — 巨大な Luau 市場

Lua/Luau を無視できない理由の半分は Roblox だ。

  • MAU 4億超、1日平均使用時間 2.5 時間。
  • ゲーム内ロジックはすべて Luau。 クライアントもサーバーも。Studio(エディタ)拡張も Luau。
  • Roblox 開発者フォーラム: 投稿数は数百万。Stack Overflow に次ぐ Luau Q&A の最大プール。

始め方

1. Roblox Studio をダウンロード(Windows / Mac)
2. New Place → Baseplate テンプレート
3. Explorer で ServerScriptService を右クリック → Insert Object → Script
4. Luau を書く

-- 例:タッチされたら色が変わるパート
local part = workspace.Part
part.Touched:Connect(function(hit)
  local character = hit.Parent
  if character:FindFirstChild("Humanoid") then
    part.Color = Color3.fromRGB(
      math.random(0, 255),
      math.random(0, 255),
      math.random(0, 255)
    )
  end
end)

Roblox 開発者の経済圏

  • Robux 換金 — 一定額を超えると USD に換金可能。人気ゲームは月数十万ドルを稼ぐ。
  • 2025年の新展開 — UGC(User Generated Content)マーケットプレイス拡大。衣装やアクセサリも Luau ベースのスクリプトで作る。
  • DataStore / OpenCloud API — Luau だけでは足りないゲームは、外部バックエンド(Python / Go)と OpenCloud API でやり取りする。

日本・韓国の Roblox 開発

  • 日本: Roblox JP が2025年に本格始動。Cygames や Bandai Namco 出身のインディが Luau でデビュー作を出す事例多数。
  • 韓国: 2024–2026年に Roblox の韓国進出が加速。青少年向けプログラミング教育が Scratch から Roblox Studio へシフトする流れ。

6章 · Neovim Lua 設定の爆発 — LazyVim / AstroNvim / NvChad / LunarVim

Vim から Neovim への最大の変化は VimScript から Lua への移行である。0.5(2021)で Lua API が安定化し、0.10・0.11・0.12 と進むうちに VimScript は事実上レガシー化した。

2026年の Neovim 設定エコシステムは、4つのディストリビューションが 9割以上を占める。

LazyVim — Folke 製の一強ディストロ

folke/lazy.nvim という lazy-loading 系プラグインマネージャの上に作られたディストロ。2024年登場以降、事実上の標準。

-- ~/.config/nvim/lua/plugins/example.lua
return {
  {
    "nvim-treesitter/nvim-treesitter",
    build = ":TSUpdate",
    config = function()
      require("nvim-treesitter.configs").setup({
        ensure_installed = { "lua", "python", "typescript", "rust" },
        highlight = { enable = true },
      })
    end,
  },
  {
    "neovim/nvim-lspconfig",
    dependencies = { "williamboman/mason.nvim" },
    config = function()
      require("lspconfig").lua_ls.setup({})
    end,
  },
}

長所

  • 起動が速い。:Lazy で GUI プラグインマネージャ。
  • モジュール式。lua/plugins/ にファイルを置けば自動ロード。
  • Folke 本人による一貫したコードスタイル。

短所

  • 抽象化レイヤが厚い。素の Neovim Lua を学びたい人には少し遠回り。

AstroNvim — 華やかな UI

ダッシュボード・ステータスライン・アイコンが最初から整っている。「そのまま使える IDE のような Neovim」を志向。

-- AstroNvim v4 の構造
return {
  colorscheme = "catppuccin",
  features = {
    large_buf = { size = 1024 * 256, lines = 10000 },
    autopairs = true,
    cmp = true,
    diagnostics_mode = 3,
  },
  diagnostics = { virtual_text = true, underline = true },
}

好む層 — Vim を初めて触る開発者、IDE 出身者。

NvChad — 軽量・洗練 UI

インドの開発者 siduck によるディストロ。起動時間 30ms 以下を目標。日本・韓国でもユーザーが多い。

-- NvChad v2.5+
require("nvchad.configs.lspconfig").defaults()
local servers = { "html", "cssls", "tsserver", "lua_ls", "rust_analyzer" }
vim.lsp.enable(servers)

LunarVim — 総合 IDE 志向

伝統的な「Vim を本物の IDE のように使おう」系ディストロ。2022–2023年がピーク、今も安定したユーザー層。

どれを選ぶか

状況おすすめ
Neovim 初めてLazyVim または AstroNvim
高速起動・軽量 UINvChad
一定の学習曲線・フル IDE 体験LunarVim
ディストロなしで一から作るkickstart.nvim → DIY

from-scratch リバイバル — 2025–2026年に nvim-lspconfig・blink.cmp・snacks.nvim といったモジュール式プラグインが成熟したことで、「ディストロなしで自作する方がスッキリする」という流れも再び強まっている。出発点は kickstart.nvim。


7章 · OpenResty (NGINX + Lua) — 高性能 Web の影の主役

NGINX のコアに LuaJIT を組み込み、リクエスト処理を Lua で書くプラットフォーム。2011年に Yichun Zhang(agentzh)が作り、現在は OpenResty Inc. が維持している。

なぜ速いのか

# nginx.conf
location /api/users {
    content_by_lua_block {
        local user_id = ngx.var.arg_id
        local redis = require "resty.redis"
        local red = redis:new()
        red:connect("127.0.0.1", 6379)
        local user_json = red:get("user:" .. user_id)
        ngx.header.content_type = "application/json"
        ngx.say(user_json)
    }
}
  • リクエストハンドラは LuaJIT のマシンコードへコンパイルされる。
  • NGINX イベントループ内で non-blocking I/O により Redis・Postgres・MySQL を呼べる。
  • 同じハードウェアで Node.js の 2–5 倍の RPS。

誰が使っているか(2026年現在)

  • Cloudflare — エッジ各所で LuaJIT ベースのモジュール。WAF・ルーティング・レート制限の一部。
  • Kong — API ゲートウェイ。OpenResty ベース。2025年の Kong 4.0 では一部モジュールが Rust に置き換わったが、コアは依然 Lua。
  • Apache APISIX — Kong の競合 OSS API ゲートウェイ。中国・浙江大学発、現在は Apache プロジェクト。
  • WeChat / Tencent — 社内ゲートウェイの一部。

モジュール・エコシステム

opm(OpenResty Package Manager)または LuaRocks でインストール。

# よく使うライブラリ
opm install openresty/lua-resty-redis
opm install openresty/lua-resty-mysql
opm install openresty/lua-resty-http
opm install bungle/lua-resty-prometheus

日本での OpenResty

  • 通信キャリア・大手 SIer の社内ゲートウェイで採用事例。
  • ゲーム会社(特にモバイル)が認証・マッチメイキングサーバで導入する例が多い。同時接続処理に強みがある。

8章 · Tarantool — インメモリ DB + Lua アプリケーションサーバ

ロシアの Mail.Ru で生まれ、今は独立したプロジェクトになった Tarantool は、インメモリ DB + Lua アプリサーバという特異な組み合わせ。

-- Tarantool 内で実行
box.cfg{ listen = 3301 }
box.schema.space.create('users', { if_not_exists = true })
box.space.users:format({
  { name = 'id', type = 'unsigned' },
  { name = 'name', type = 'string' },
  { name = 'email', type = 'string' },
})
box.space.users:create_index('primary', { parts = { 'id' } })

-- ビジネスロジックも同じプロセス内に書ける
function add_user(id, name, email)
  return box.space.users:insert{ id, name, email }
end

function find_user(id)
  return box.space.users:get(id)
end
  • インメモリ + WAL — Redis より強い整合性保証。SQL もサポート。
  • Lua アプリサーバ — DB と同じプロセス内でビジネスロジックを実行。ネットワークホップを1段節約。
  • シャーディングvshard モジュールで自動シャーディング。

採用先:ロシアの大手インターネット企業、東欧のゲーム企業、そして増えつつある fintech 各社。


9章 · ゲーム — WoW アドオンから Source 2 まで

World of Warcraft アドオン

WoW は2004年のリリース直後から Lua ベースのアドオンシステムを提供してきた。22年経った今も変わらず。

-- 最もシンプルな WoW アドオン (MyAddon.toc + MyAddon.lua)
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
frame:SetScript("OnEvent", function(self, event, ...)
  print("|cFFFF0000Hello|r from MyAddon!")
end)
  • 2024–2026年も人気アドオン(ElvUI・WeakAuras・Details!・Plater)はパッチごとに更新。
  • WeakAuras はユーザー Lua スニペットを受け取って実行するメタツールへ進化。事実上 WoW 用 Lua IDE。

Tabletop Simulator

2014年リリース、今も健在。すべての MOD(ゲームルール)が Lua。 Steam Workshop に数万件の MOD。

Garry's Mod / Source 2 (CS2)

Garry's Mod の MOD はすべて Lua。Source 2 エンジン(2023年以降の CS2 等)も部分的に Lua スクリプティングを採用 — マップメーカーやサーバプラグインは Lua で書かれている。

Defold — King の Lua エンジン

King(Candy Crush の開発元)が買収して OSS 化した 2D/3D エンジン。ロジックは Lua、エンジン本体は C++。

-- script.script
function init(self)
  self.speed = 100
end

function update(self, dt)
  local pos = go.get_position()
  pos.x = pos.x + self.speed * dt
  go.set_position(pos)
end

function on_input(self, action_id, action)
  if action_id == hash("touch") and action.pressed then
    self.speed = self.speed * -1
  end
end
  • シングルバイナリのビルド — Defold エディタから iOS・Android・HTML5・Switch まで一発でビルド可能。
  • ゲームサイズが小さい — 空のプロジェクトが数 MB レベル。モバイルで人気。
  • 2026年現在、King がメインスポンサー、コミュニティが活発に貢献。

Solar2D(旧 Corona SDK)

Corona Labs が消滅後、コミュニティが引き継いで Solar2D にリブランド。モバイル 2D ゲームエンジン。メイン言語は Lua。 日本・韓国の学校・インディ開発者が今も使用。

Love2D — 小さな 2D ゲームの定番

100KB クラスの小さな SDK。love.load / love.update / love.draw の 3コールバックさえあればゲームが動く。

function love.load()
  player = { x = 100, y = 100, speed = 200 }
end

function love.update(dt)
  if love.keyboard.isDown("right") then
    player.x = player.x + player.speed * dt
  end
  if love.keyboard.isDown("left") then
    player.x = player.x - player.speed * dt
  end
end

function love.draw()
  love.graphics.rectangle("fill", player.x, player.y, 50, 50)
end
  • ゲームジャム(Ludum Dare・GMTK Jam)で最も頻繁に見るエンジンの一つ。
  • LuaJIT を標準搭載しているのでパフォーマンスも十分。

10章 · 変種言語 — MoonScript / Yuescript / Teal / Pluto / Fennel

Lua は小さくシンプルだが、「これじゃちょっと足りない」と感じた人々が作った変種言語がある。

MoonScript — Lua 版 CoffeeScript

インデント文法、クラス、リスト内包表記。

-- MoonScript
class Animal
  new: (@name) =>
  speak: => print "#{@name} makes a sound"

class Dog extends Animal
  speak: => print "#{@name} barks"

d = Dog "Rex"
d\speak!

2010年代前半に人気、今はメンテナンスモード。しかし OpenResty 界隈の一部ライブラリは今でも MoonScript で書かれている。

Yuescript — 活発に開発される MoonScript フォーク

台湾の開発者 Li Jin による MoonScript フォーク。Lua 5.4 互換、活発に開発中。

Teal — typed Lua、最も真面目な候補

-- Teal (.tl ファイル)
local record Point
  x: number
  y: number
end

local function distance(a: Point, b: Point): number
  return math.sqrt((a.x - b.x)^2 + (a.y - b.y)^2)
end
  • Hisham Muhammad(LuaRocks メンテナ)が作成。
  • Lua 5.3・5.4 互換コードへトランスパイル。
  • Luau の姉妹プロジェクトという雰囲気 — Luau は Roblox 同梱、Teal はスタンドアロン。

Pluto — Lua 5.4 + モダン機能

continueswitch??(null 合体)、クラス、async/await などを Lua 5.4 に乗せたスーパーセット。

-- Pluto
class Player
  function __construct(self, name)
    self.name = name
    self.hp = 100
  end
  
  function takeDamage(self, amount)
    self.hp -= amount  -- 複合代入
    if self.hp <= 0 then
      print(self.name .. " died")
    end
  end
end

local p = new Player("Alice")
p:takeDamage(50)

local config = json.decode(http.get("https://example.com/cfg")) ?? {}

活発に開発中で、ゲーム MOD コミュニティ(Stand 等)で人気。

Fennel — Lua VM 上の Lisp

Clojure 風 S 式文法、Lua VM 上で実行。

;; Fennel
(fn greet [name]
  (print (.. "Hello, " name "!")))

(greet "World")

(local people [{:name "Alice" :age 30}
               {:name "Bob" :age 25}])

(each [_ person (ipairs people)]
  (print (.. person.name " is " person.age " years old")))
  • Lisp のマクロや関数型スタイルを Lua の組み込み環境で使いたい時に。
  • Love2D・TIC-80(ファンタジーコンソール)で人気。
  • Neovim を Fennel で設定する人もいる(antifennel・hotpot.nvim)。

11章 · Hammerspoon (Mac) / Wireshark Lua ディセクタ

Hammerspoon — macOS 自動化

-- ~/.hammerspoon/init.lua
-- Cmd-Alt-R で右半分にウィンドウをスナップ
hs.hotkey.bind({"cmd", "alt"}, "R", function()
  local win = hs.window.focusedWindow()
  local f = win:frame()
  local screen = win:screen():frame()
  f.x = screen.x + screen.w / 2
  f.y = screen.y
  f.w = screen.w / 2
  f.h = screen.h
  win:setFrame(f)
end)

-- クリップボード履歴
local clipboardHistory = {}
hs.pasteboard.watcher.new(function()
  local item = hs.pasteboard.readString()
  if item then table.insert(clipboardHistory, 1, item) end
end):start()
  • macOS のシステム API(hs.windowhs.hotkeyhs.audiodevice ほか)を Lua から直接呼べる。
  • Karabiner・BetterTouchTool と並ぶ、Mac パワーユーザーの 3 大ツール。

Wireshark Lua ディセクタ

Wireshark でネットワークパケットを解析する際、独自プロトコルを Lua で定義できる。

-- Wireshark plugins/my_proto.lua
local my_proto = Proto("MyProto", "My Custom Protocol")

local fields = my_proto.fields
fields.id = ProtoField.uint16("myproto.id", "ID", base.DEC)
fields.payload = ProtoField.bytes("myproto.payload", "Payload")

function my_proto.dissector(buffer, pinfo, tree)
  pinfo.cols.protocol = my_proto.name
  local subtree = tree:add(my_proto, buffer())
  subtree:add(fields.id, buffer(0, 2))
  subtree:add(fields.payload, buffer(2))
end

DissectorTable.get("tcp.port"):add(8080, my_proto)

ゲーム会社や IoT 企業で自社プロトコルのデバッグに大活躍。C のディセクタを書く代わりに Lua 100行で済む。


12章 · Adobe Lightroom Lua プラグイン

あまり知られていない事実:Adobe Lightroom のプラグインシステムは Lua ベース。 2007年導入以来、変わらず。

-- Lightroom SDK プラグインの例 (Info.lua + Main.lua)
return {
  LrSdkVersion = 12.0,
  LrToolkitIdentifier = "com.example.exporter",
  LrPluginName = "My Exporter",
  LrExportServiceProvider = {
    title = "My Cloud",
    file = "ExportServiceProvider.lua",
  },
}
  • 一部の写真家が Photo Mechanic や Capture One へ移行しても、写真家のワークフロー自動化は依然として Lightroom + Lua プラグインが圧倒的多数。
  • LR/Mogrify・Photo Mechanic Bridge・Photolemur 連携といった有名プラグインが Lua で書かれている。

13章 · 日本 / 韓国 の Lua

日本

  • Square Enix — Final Fantasy シリーズの一部、社内ツール。東京本社で Lua を使う職種の募集が四半期ごとに出ている。
  • Bandai Namco — グラフィックスミドルウェア・ゲームロジックスクリプトに Lua。日本製ゲームエンジン(Yebis ほか)が Lua プラグインをサポート。
  • Cygames — Granblue Fantasy・Uma Musume などで社内ツールに Lua。モバイルゲームの hot-fix チャンネルに Lua を使うパターン。
  • その他インディ — 東京・京都のインディシーンで Defold・Love2D を使うクリエイターが多数。Tokyo Indies などのミートアップで毎回発表がある。

韓国

  • Smilegate — CrossFire・Lost Ark など自社エンジンゲームで MOD API の一部に Lua を活用。社内ツール・QA 自動化にも Lua。
  • NCSoft — Lineage W・Blade & Soul などで一部のゲームロジックスクリプトに Lua。社内エンジンのツール群。
  • Krafton・Nexon — ゲーム会社の多くがクライアント側 MOD・サーバ側 hot-reload に Lua を部分的に導入。
  • Naver・Kakao — 一部サービスのゲートウェイ・CDN レイヤで OpenResty を採用。大規模トラフィック処理に適している。

14章 · 誰が Lua/Luau を学ぶべきか

Roblox ゲーム開発者

Luau は明白に必須。Roblox の外でもスタンドアロン Luau ランタイム(Lune)が育ちつつあり、活躍範囲が広がっている。

Neovim ユーザー

設定するだけでも Lua を最低限読めることが求められる。VimScript から Lua への移行はほぼ完了した。 init.lua、lazy.nvim 設定、プラグイン開発はすべて Lua。

組み込み開発者

小メモリフットプリントのインタプリタ=Lua。ESP32 に Lua を載せて IoT を書く NodeMCU プロジェクトは健在で、ゲームエンジン・ミドルウェア組み込みでも Lua は標準。

NGINX・Web インフラエンジニア

OpenResty・Kong・APISIX を触る人にとって Lua はほぼ必須。Cloudflare Workers や Envoy(Lua extension)で出会うこともある。

ゲーム MOD 作者

WoW・Tabletop Simulator・Garry's Mod・CS2(マップメーカー)で MOD・プラグイン・拡張を作りたいなら、Lua が入口になる。

macOS パワーユーザー

Hammerspoon で自動化を書きたければ Lua 100行は知っておきたい。AppleScript の不便さから抜け出す道。

写真家・Lightroom ユーザー

自分のワークフローに合わせたエクスポータ・ファイル命名自動化を作りたいなら、Lua + Lightroom SDK が最も効率的。


15章 · 学習パス — 0 からモダン Lua まで

0週目 — 本体1時間

Programming in Lua (Roberto Ierusalimschy) 第4版 1–5章。基本文法・テーブル・関数・メタテーブルだけ。

1週目 — 実践環境を一つ選ぶ

  • Roblox: Roblox Studio をインストール、Code Academy の Roblox コース。
  • Neovim: kickstart.nvim をクローンして自分で改造。
  • Love2D: 簡単なピンポンゲームを作る。

2週目 — メタテーブルと OOP パターン

OOP は Lua にビルトインではない。setmetatable でクラスを真似る練習を一度は自分で書くべき。

local Animal = {}
Animal.__index = Animal

function Animal.new(name)
  local self = setmetatable({}, Animal)
  self.name = name
  return self
end

function Animal:speak()
  print(self.name .. " makes a sound")
end

local Dog = setmetatable({}, { __index = Animal })
Dog.__index = Dog

function Dog.new(name)
  local self = Animal.new(name)
  return setmetatable(self, Dog)
end

function Dog:speak()
  print(self.name .. " barks")
end

local d = Dog.new("Rex")
d:speak()  -- Rex barks

3週目 — コルーチン・LPeg・リクエスト処理

  • coroutine.create / coroutine.resume / coroutine.yield — Lua の強力な協調的マルチタスク。
  • LPeg(Lua PEG) — PEG パーサライブラリ。JSON・CSV・DSL パーサを少量のコードで作れる。
  • OpenResty をインストールしてシンプルな API サーバを書いてみる。

4週目以降 — 一つの領域を深掘り

  • Roblox ゲームのライブ運用まで — DataStore・OpenCloud・MessagingService。
  • Neovim プラグイン開発 — nvim-treesitter・blink.cmp のソースを読んで自作プラグイン。
  • OpenResty 本番運用 — Kong・APISIX のソースコードを読む。
  • Defold・Love2D でゲームジャム参加 — Ludum Dare・GMTK Jam。

エピローグ — 小さな言語の大きな影

Lua は1993年の誕生からずっと変わらない。シンプルな文法、8 つのデータ型、小さなインタプリタ、強力なメタテーブル。 Roberto Ierusalimschy は「Lua は組み込まれるための言語」と繰り返し言ってきたし、32年経った2026年でもその言葉は正確に正しい。

2026年の Lua/Luau エコシステムは、これまで以上に多彩だ。Roblox では4億人が毎日 Luau で作られたゲームをプレイし、何十万人もの Neovim ユーザーが LazyVim を通じて毎日 Lua を目にし、Cloudflare のエッジで LuaJIT が地球上のトラフィックの一部を捌き、WoW アドオンは22年生き残り、Lightroom の写真家が Lua プラグインでワークフローを自動化している。

Lua は決して死なない。ただ静かに、どこにでもある。

次の流行は Rust かもしれないし、Zig かもしれないし、別の何かかもしれない。それでも、ゲームエンジンがスクリプト言語を選ぶとき、エディタが設定言語を選ぶとき、Web サーバが組み込みハンドラ言語を選ぶとき、Lua という選択肢は32年間ずっと最初の候補に挙がってきた。 そしてこれからもしばらく、同じだろう。


参考 / References