2009年06月24日 18:30 [Edit]
なんてめんこい言語 - 書評 - 入門Luaプログラミング
ソフトバンククリエイティブ品田様より、打ち合わせのついでに献本いただいた。
LuaめんこいよLua。
こんな小さいのに、こんなに出来る子だなんて。
ブラジル生まれのこの言語は、もっともっと知られて、もっともっと使われてるべきだ。
本書「入門Luaプログラミング」は、タイトルどおりLuaプログラミングの入門書なのだが、Perlでこれに相当するのはリャマ本ではなくラクダ本>。Pythonならネズミ本ではなくヘビ本だ。そう。本書にはLua 5.1に搭載されている機能がすべて紹介されているのだ。250ページしかないのに。
目次 - ソフトバンク クリエイティブの本:入門Luaプログラミングより- ■第1部 Luaを使ってみよう
- 第1章 はじめの一歩
- 第2章 処理の流れ
- 第3章 部品を作ろう
- 第4章 何ができるの
- ■第2部 Luaならこうなる
- 第5章 Luaでデータを整理
- 第6章 リーグ戦の集計
- 第7章 Luaの仕組み
- 第8章 カーナビに挑戦
- ■第3部 Luaをカスタマイズ
- 第9章 Luaを拡張してみる
- 第10章 Luaのモダンな機能
- 第11章 C言語との連携
- 第12章 Luaの組込み
なんでそんな芸当が可能なのか?
Luaが、あまりにコンパクトだからだ。
そのソースコードは、Perl/Ruby/Pythonより二桁小さい。二桁だ。一桁ではない。現代のプログラミング言語のソースコードは、tarballで10MBのオーダーだが、Luaのそれは、最新の5.1.4でもわずか211.6KB。本blogのトップページのHTML程度なのである。
それでいて、現代的なスクリプト言語が備えているべき機能は、ほぼ全て揃っている。tableによる配列と連想配列、クロージャー。そしてmetatableによるOO。逆に、Luaを見ることで、現代的なプログラミング言語に何が必要なのかもよくわかる。
論より証拠。実際に動かしてみてもらおう。まずはFizzBuzzを少し大げさに書いてみた。
#!/usr/bin/lua
fizzbuzz = (function()
local fizzbuzz = { -- table は JavaScript の object 相当
fizz = { [0] = "Fizz" }, -- [0]がないとfizz[1] = "Fizz"
buzz = { [0] = "Buzz" }, -- luaの配列は1から始まるので
}
return function(n) -- クロージャーも使える
local fizz = n % 3
local buzz = n % 5
if fizzbuzz.fizz[fizz] then
if fizzbuzz.buzz[buzz] then
-- .. で文字列連結
return fizzbuzz.fizz[fizz] .. fizzbuzz.buzz[buzz]
else
return fizzbuzz.fizz[fizz]
end
else
if fizzbuzz["buzz"][buzz] then
return fizzbuzz["buzz"][buzz]
else
return n
end
end
end
end)()
for i=1,30 do
-- evalはloadstringで string を function にしてから
local f = loadstring("print(fizzbuzz(" .. i .. "))")
f() -- 実行する。JSの new Funcion()とほぼ同じ
end
「とんがった」ところは、配列が0からではなく1から始まるぐらいのものではないか。それですら、JavaScriptと同じく「配列も連想配列もどちらもtable」なので、上のようにすればarray[0]を使うことができる。
ざっとやってみた私の感想は、「LuaはJavaScriptの文法をPascal的にして、プロトタイプを省いた代わりにメタテーブルを持つ言語」というものである。そうそう。メタテーブルの紹介がまだだった。これはテーブルに「隠し属性」を持たせることによって、テーブルの機能を拡張するというものである。JavaScriptの__noSuchMethod__みたいな感じだ。
論より証拠。これも実際に見てみよう。
#!/usr/bin/lua
fibs = { 1, 1 }
setmetatable(fibs, {
__index = function(name, n)
name[n] = name[n - 1] + name[n - 2]
return name[n]
end
})
for i=1,69 do print("fibs[" .. i .. "] = " ..fibs[i]) end
ちょっとすごくないだろうか。配布物が200KBしかない言語にこれだけのことが出来るなんて。
もちろん、Luaがコンパクトなのにはわけがある。一つは、言語の機能は豊富でも語彙はそうではないこと。ライブラリーは基本的なもののみで、それだけでWebプログラミングがいきなり出来たりすることはない。利発だがまだ知識も経験もない子どものような感じだ。
それもそのはず。Luaは組み込み言語として開発されてきた。他のスクリプト言語のように、言語に機能を追加するのではなく、機能=アプリケーションに言語を追加するのがLuaなのだ。World of Warcraft のメインの機能は"fun"であって"code"ではない。Adobe Photoshop Lightroomもしかり。他の言語に組み込むことすら容易で、例えばPerlにはInline::Luaがすでに存在する。
Luaはポルトガル語で「月」。 月のように控えめで衛星的な言語なのである。
率直に言って、Luaで大規模プロジェクトを作りたいとは思わないし、それはLua的ではないと思う。そういう使い方をするには、Luaはあまりにめんこい。しかしその大規模プロジェクトの中にDSLが必要になったとき、わざわざDSLを作るぐらいならLuaを組み込んでしまった方がよいのではないか。
それでも、メタテーブルは素敵すぎる。これを使った「フルボディ」のLuaが欲しくなるほど。そのようなものがあるとしたら、名前はやはりTerraになるのだろうか。
こんなめんこい子も、日本語であまり紹介されていなかったためそれほど知られていなかったが、本書でそれも変わるだろう。プログラマーなら一度は付き合ってみるべきです end
Dan the Polyglot
この記事へのトラックバックURL
再帰がうんちゃらかんちゃら、とかいらなくて、数列の表現をそのまま書けちゃうのが、いい感じ。
実はmixi Engineers' Blogが結構貴重な日本語での情報源だったり。
私は最初ここで知りました。
http://alpha.mixi.co.jp/blog/?s=Lua
