トップ » 技術記事 » 高速スクリプト言語「Lua」を始めよう!(1) - 高速スクリプト言語「Lua」を始めよう!(1)

高速スクリプト言語「Lua」を始めよう!(1) - 高速スクリプト言語「Lua」を始めよう!(1)

タグ: Lua

本稿では動作速度が高速で、非常に移植性が高い組み込み向けのプログラミング言語「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 のメインページは以下にあります。



そして、素直に、download のページからたどって、最新版をダウンロードしましょう。筆者がダウンロードした最新版は、5.1.4 (22 Aug 2008)でした。

アーカイブを解凍してみると、ソースコードのみであることが分かります。これから、Cygwin を使ってコンパイルしようと思います。

しかし、ちょっと試してみたいだけという方は、バイナリ版を入手してください。Lua のバイナリは、以下のURLからダウンロードすることができます。Windows 32bit/64bit と MacOS X(Intel)、Linux 版がダウンロード可能です。

コンパイル

バイナリ(実行ファイル)を入手した方は、次の項へ進んでください。ここでは、Windows 上で、Cygwin を使って Lua をコンパイルする方法を紹介します。Cygwin は、CygwinはGNUの開発ツールを含む、UNIXのさまざまなフリーソフトウェアをWindowsに移植したものです。

以下は、Cygwin のページです。Install or update now! のリンクから、setup.exe をダウンロードします。

setup.exe をダブルクリックして実行して、[次へ] を何度かクリックすると、どのパッケージをインストールするのか選択する画面(以下)が現れます。

http://aoikujira.com/demo/hakkaku/rc/20081019_cygwin.png

ここで、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 の値が表示されます。

http://aoikujira.com/demo/hakkaku/rc/20081019_x3_lua.png

プログラムを見てみますと、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 の言語的な特徴を紹介していきたいと思います。お楽しみに。

Series Navigation高速スクリプト言語「Lua」を始めよう!(2)»

執筆者紹介

クジラ飛行机

クジラ飛行机

くじらはんど(http://kujirahand/)にて、日本語プログラミング言語「なでしこ」(IPA未踏ユース採択)、テキスト音楽「サクラ」(OSPオンラインソフト大賞入賞)など多くのオンラインソフトを開発。著書に「Flexプロフェッショナルガイド」「なでしこ公式バイブル」、「一週間でマスターするActionScript3.0」など。

TrackBack URL :