高速スクリプト言語「Lua」を始めよう!(1) - 高速スクリプト言語「Lua」を始めよう!(1)
本稿では動作速度が高速で、非常に移植性が高い組み込み向けのプログラミング言語「Lua」の使い方について紹介します。Lua は、JavaScript や Pascal に似ていることから、とても手に馴染みやすいのが特徴です。自作アプリケーションにちょっとしたスクリプト言語を組み込みたい場合に重宝します。そこで、Lua のインストールから、簡単な使い方を紹介し、簡単なアプリケーションに組み込んで使うまでの過程を解説します。
本稿の目標
本稿では、Lua がどんなプログラミング言語なのかを紹介し、実際に簡単なアプリケーションに組み込んで使ってみるところまでを紹介します。
第一回目の今回は、Luaについての基本的な事柄を説明します。Lua とは何か、そして、どんな風にプログラムを書くのかを紹介します。
恥ずかしながら Lua 初心者です
筆者(クジラ飛行机)は今回「Lua」初挑戦です。以前から、友人に「Lua」が面白いという話を聞いていたので、名前だけはよく聞いていたのですが、なかなか使う機会がありませんでした。
JavaScript に似たスクリプト言語ながら、速いと言われている Python(当然 PHPやPerl)よりも高速に動作することや、Pascal や Ruby のように、ブロックの記述に do .. end のような記述をすることなど、とても興味がありました。また、構文をシンプルにして動作速度にこだわっているということを聞いて、言語としての完成度の高さにも引き付けられました。調べてみると、高速な組み込み向けプログラミング言語「Lua 」は、すでに多くのアプリケーションやゲームなどでの動作実績もあるということなので、とても面白そうです。
また、「Lua」という名前は、ポルトガル語で「月」を意味する単語だそうです。なぜ、ポルトガル語なのかと言うと、Lua が、ブラジルにあるリオデジャネイロ・カトリカ大学の情報工学科コンピュータグラフィックステクノロジーグループ TeCGraf によって設計開発されたプログラミング言語だからのようです。
リオデジャネイロと言えば、あのカーニバルで有名な都市です。それでは、サンバ、ボサノヴァを生んだ音楽の都としても名高いこの都市から生まれた Lua について見ていきましょう。
Lua 5.1.4 のインストール
それでは、Windows で、Lua をインストールして使ってみようと思います。Lua のメインページは以下にあります。
- The Programming Language Lua
- http://www.lua.org/
そして、素直に、download のページからたどって、最新版をダウンロードしましょう。筆者がダウンロードした最新版は、5.1.4 (22 Aug 2008)でした。
- Lua のダウンロード (ソースコード)
- http://www.lua.org/ftp/
アーカイブを解凍してみると、ソースコードのみであることが分かります。これから、Cygwin を使ってコンパイルしようと思います。
しかし、ちょっと試してみたいだけという方は、バイナリ版を入手してください。Lua のバイナリは、以下のURLからダウンロードすることができます。Windows 32bit/64bit と MacOS X(Intel)、Linux 版がダウンロード可能です。
- LuaBinaries (実行ファイル)
- http://luabinaries.luaforge.net/download.html
コンパイル
バイナリ(実行ファイル)を入手した方は、次の項へ進んでください。ここでは、Windows 上で、Cygwin を使って Lua をコンパイルする方法を紹介します。Cygwin は、CygwinはGNUの開発ツールを含む、UNIXのさまざまなフリーソフトウェアをWindowsに移植したものです。
以下は、Cygwin のページです。Install or update now! のリンクから、setup.exe をダウンロードします。
- Cygwin
- http://cygwin.com/
setup.exe をダブルクリックして実行して、[次へ] を何度かクリックすると、どのパッケージをインストールするのか選択する画面(以下)が現れます。
ここで、Devel のツリー以下にある、gcc-mingw-core や make などをチェックして、[次へ]とクリックしていくと、Cygwin の開発環境が整えられます。Cygwinのインストールが終わって、Cygwin.bat をクリックすると、Cygwin のターミナルが起動します。
標準の状態でインストールすると、Cygwin のホームディレクトリは、c:\cygwin\home\<ユーザー名> に作成されます。ユーザー名は、Windows にログインしているユーザー名になります。
それでは、lua をコンパイルします。上記でダウンロードした、lua-5.1.4.tar.gz をホームディレクトリにコピーします。そして以下のコマンドを入力するとアーカイブを展開できます。
tar xzvf lua-5.1.4.tar.gz
次に、以下のコマンドを実行すると、コンパイルが行われます。
cd lua-5.1.4 make mingw
ここまでの作業で、~/lua-5.1.4/src ディレクトリに実行ファイルとDLLファイルが完成します。以下のコマンドを実行すると、実行ファイルが、Cygwin の /usr/local/bin にコピーされます。
make install
お決まりの Hello World を実行してみる
それでは、お決まりの、Hello World を作って実行してみましょう。Lua の Hello World は以下のように書くことができます。以下の1行を、テキストエディタで入力して、hello.lua という名前で保存します。
-- hello.lua
print("Hello, World!")
コマンドラインから実行する場合は、以下のように入力します。
lua hello.lua
もし、実行できない場合は、lua にパスが通ってない可能性があります。パスの通ったディレクトリに、lua.exe をコピーするか、Cygwin を利用しているなら、~/.bashrc などでパスを通します。
動作確認ができたなら、プログラムをもう一度眺めてみましょう。一般的なプログラミング言語とそれほど変わりませんね。ちなみに、Lua の test ディレクトリにあるサンプル hello.lua には、次のような、io.write() 関数を使った例が書かれていました。
-- hello2.lua
io.write("Hello, World!")
パッと見て気づいたかもしれませんが「–」が一行コメントとなっています。
入力された数値を元に計算を行うプログラム
はじめに、いくつか簡単なプログラムを作って、Lua に慣れていきましょう。たとえば、入力された数値を3倍にした値を出力するような簡単なプログラムは、次のようになります。
-- x3.lua v = io.read() io.write(v * 3)
これを実行するには、上のプログラムを x3.lua という名前で保存します。そして、コマンドラインから以下のように入力します。
lua x3.lua
たとえば、40 を入力すると、120 の値が表示されます。
プログラムを見てみますと、io.read() でコンソールからデータを読み込んで、io.write() で値を出力します。行末に「;」が要らないことから、雰囲気としては、Ruby や BASIC に近い感じがします。
偶数奇数の判別プログラム
入力の方法が分かったので、次に条件分岐 if を使うようなプログラムを作ってみます。そこで、偶数奇数の判別を行うプログラムを作ってみました。
-- odd.lua
print("input number:");
v = io.read()
if v % 2 == 0 then
print "even"
else
print "odd"
end
プログラムを実行して、適当な数値を入力してみましょう。odd(奇数)かeven(偶数)のどちらかが表示されるはずです。
$ lua odd.lua 4 ←今回入力してみた even
たとえば、4 を入力すると、even と表示され、3 を入力すると、odd と表示されました。正しく動作しているようです。念のため、もう1回試してみます。
$ lua odd.lua input number: 21 <-- 入力した odd
if 文は、if .. then .. else .. end の形式で記述します。
参考)Lua の if 文の書式
Lua の if 文は、以下のように記述します。
-- 単純な書き方 if (式) then (式が真の時) end -- 二分岐 if (式) then (式が真の時) else (式が偽の時) end -- 多分岐 if (式1) then (式1が真の時) elseif (式2) then (式2が真の時) elseif (式3) then (式3が真の時) else (上記の式が全て偽の時) end
素数を探すプログラム
次々と書いてみます。今度は、もう少し長めのプログラムで、3から100までの素数を求めるプログラムです。
-- prime.lua
function is_prime(n)
local i
for i = 2,(n-1) do
if n % i == 0 then return false end
end
return true
end
-- check prime
for i=2,100 do
if is_prime(i) then io.write("["..i.."]") end
end
正しい値が出力されるでしょうか。以下、prime.lua を実行してみましたが、正しく出力されているようです。
$ lua prime.lua [2][3][5][7][11][13][17][19][23][29][31][37][41][43][47][53][59][61][67][71][73][79][83][89][97]
割とすんなり書けたのですが、初心者の筆者が書きにくかった点は、一行の if 文(5行目,12行目)でした。Pascal では、一行 if を書いた時は、end を書かなくても良いのですが、Lua では、行末に end が必要になります。
さて、ここで出てきたのは、繰り返しの for 文です。for 文の書式は以下のようになっています。
for (変数)=(開始値),(終了値) do (繰り返す文) end
※他に、for .. in 構文もありますが、これは後で紹介します。
それから、ここでは、関数を定義してみました。関数を定義するには以下のように書きます。
function 関数名(引数1,引数2 .. ) 関数の内容 end
2つの引数 a と b を足した数を返すような tasizan を定義すると以下のように書くことができます。
function tasizan(a,b) return (a + b) end
ところが、関数の定義は、以下のように展開されるようです。そうです。関数として定義することは、つまり、変数 tasizan に関数オブジェクトを代入するという意味になるのです。
tasizan = function(a,b) return (a + b) end
そのため、上記の素数を探すプログラムで、素数判定する関数 is_prime をプログラムの最後に定義するならば、エラーになり、is_prime が nil(空) である旨のメッセージが表示されます。
つまり、関数定義は、その関数を使う箇所よりも、前に書かなくてはいけないということになります。関数なら、どこに書いても良いのかと思っていましたが違うようです。
無限ループを作るような場合
当然、while 文も使えます。ここでは、先ほど作った偶数奇数の判定プログラムを改良して、ユーザーが空文字を入力しない限り、偶数奇数を判定し続けるようなプログラムを作ってみます。
-- odd2.lua
while true do
print("Input number:")
v = io.read()
if (v == nil)or(v == "") then break end
if v % 2 == 0 then print("even") else print("odd") end
end
以下、実行してみました。
$ lua odd2.lua Input number: 3 odd Input number: 4 even Input number:
ここで使ったのは、while 文です。次の書式で記述します。
while (式) do (式が真の間実行される文) end
今回のまとめ
以上、今回は、Lua の紹介と、基本的なプログラムを作ってみるところまでを紹介しました。今回見た範囲の構文では、それほど他の言語との違いは感じられませんでした。次回、もう少し、Lua の言語的な特徴を紹介していきたいと思います。お楽しみに。
TrackBack URL :



Gygwinがsetupできないのですが?
Posted by manji | 2009年03月25日 16:41
Cygwin については、多くのWebサイトで解説があるので、そちらを参考にしてみてください。
http://musashi.sourceforge.jp/cygwin/cygwin.html
Posted by クジラ飛行机 | 2009年03月25日 18:26
ありがとうございます。なんとかできました。
早速、試しみました、、、
またもや、つまずきました。
cd lua-5.1.4
make mingw
実行すると、
$make mingw
MAKE Version 5.2 Copyright(c) 1987,2000 Borland
cd src MAKE0000.@@@src/lua test/hello.lua
** error -1 ** deleting bingw
と、いうように、失敗します。
Posted by manji | 2009年03月26日 10:01
エラーから見ると、make が GNU のものでなく、Borland のものになっていますね。Cygwin の setup.exe を実行したときに、make もインストールしてください。
Posted by クジラ飛行机 | 2009年03月26日 13:20
ありがとございます。
テキストに従いまして、動作させて勉強しております。
ちなみに、(3)の
my_foreachのところのサンプルプログラムは
実行してerrorになりませんか?
あと、C++ Builder Ver6.0 とのリンクをさせたいのですが、
この場合、Builder用のLuaのlibファイルは
lua51.dllをimplibするのでしょうか?
エラーになりますが…
すみません、アドバイスが頂けると助かります。
Posted by manji | 2009年03月31日 15:26
DLLをリンクする場合は、Cygwinのものでなく、以下より特定プラットフォームに属するDLLを利用すると良さそうです。
C++Builder用のものも用意されています。参考にどうぞ。
http://luabinaries.luaforge.net/packaging.html
Posted by クジラ飛行机 | 2009年03月31日 15:39
C++Builder6とluaとのリンクが上手くできません。
…トホホ。
Posted by manji | 2009年04月02日 15:30
答えが今更ですが、C++Builderで試してみました。
どうやら、C++ Builderの場合、Cランタイムが異なるので、うまくリンクできないことがあるみたいです。
普通に、Luaのソースを得てからビルドするのが良いみたいです。
Posted by クジラ飛行机 | 2009年05月24日 20:30
It’s great tech series for Lua, thank you!
Posted by Well Sun | 2009年08月07日 18:54