M.Hiroi's Home Page

Lightweight Language

Lua Programming

[ Home | Light ]

WHAT'S NEW


お気楽 Lua プログラミング超入門

CONTENTS

初版 2011 年 4, 5, 6 月
改訂 2019 年 12 月 28 日

はじめに

Lua (ルア) は、アプリケーションに組み込むことを目的とした軽量のスクリプト言語です。Lua - Wikipedia によると、『Lua(ルア)は、リオデジャネイロ・カトリカ大学(英語版)の、主としてDepartment of Computer Science(コンピュータ科学科)and・or Computer Graphics Technology Group (Tecgraf) に属する、Roberto Ierusalimschy, Waldemar Celes, Luiz Henrique de Figueiredo らによって設計開発されたスクリプト言語およびその処理系の実装である。』 とのことです。

Lua は JavaScript とよく似ています。見た目は JavaScript と異なりますが、クロージャなどの関数型言語の機能を取り込んでいるところや、プロトタイプベースのオブジェクト指向が可能なところは JavaScript にそっくりです。このほかにも、コルーチン (coroutine) といった便利な機能が備わっていて、これらを組み合わせることで高度で柔軟なプログラミングが可能になっています。

『お気楽 Lua プログラミング超入門』は、M.Hiroi が関心を持った Lua の機能 (クロージャ、コルーチン、オブジェクト指向など) をまとめたものです。Lua 本来の使い方であるアプリケーションへの組み込みについて解説したものではありません。ご注意ください。このページは M.Hiroi の Lua に関する「覚え書」にすぎませんが、よろしければお付き合いくださいませ。

●ダウンロード

lua は次のサイトからダウンロードできます。

Windows の場合、適当な zip ファイルをダウンロードして、それを展開するだけです。version 5.3.5 であれば lua53.exe が Lua の本体 (インタプリタ) です。必要であればパスを手動で設定してください。Windows 10 の場合、コントロールパネル -> システムとセキュリティ -> システム の左端にある「システムの詳細設定」をクリックしてください。「システムのプロパティ」が表示されるので、その下側にある「環境変数」をクリックすると環境変数を設定することができます。

コントロールパネルは スタートボタン -> Windows システムツール -> コントロールパネル で起動することができますが、シェルや「ファイル名を指定して実行」から control と打ち込んでも OK です。実はもう一つ簡単な方法があって、[Windows] キーと [Pause] キーを同時に押すと、コントロールパネルのシステム画面を表示することができます。

Linux 系 OS の場合、パッケージ管理システムを使ったほうが簡単でしょう。Ubuntu であれば、次のコマンドで Lua をインストールすることができます。

sudo apt install lua5.3

Ubunts 18.04 (Windows Subsystem for Linux) の場合、コマンド名は lua5.3 (version 5.3.3) になります。

●Lua の対話モード

ところで、Lua の基本を学ぶのであれば、Lisp / Scheme の REPL (read eval print loop) のような対話モードがあると便利です。Python にも対話モードがありますし、Ruby には irb (interactive ruby) というツールがあります。Lua の場合、プログラムを実行するコマンド lua53.exe (Ubuntu は lua5.3) をシェル上で起動すると、次のようなプロンプトが表示されて入力待ちになります。

C>lua53
Lua 5.3.5  Copyright (C) 1994-2018 Lua.org, PUC-Rio
>

$ lua5.3
Lua 5.3.3  Copyright (C) 1994-2016 Lua.org, PUC-Rio
>

これで REPL のようにプログラムを入力して実行することができます。終了する場合は、Windows であれば CTRL-Z, UNIX 系の OS であれば CTRL-D を入力してください。

一般に、プログラムを作るときは、エディタを使ってソースファイルを作成します。スクリプト言語の場合はスクリプトファイルと呼ぶこともあります。Lua の場合、ファイルの拡張子は .lua になります。たとえば、ファイル名を script.lua とすると、次のコマンドでプログラムを実行することができます。

lua53 script.lua

プログラムを実行したあと、Lua を終了しないで対話モードに入ることもできます。その場合は -i オプションを指定してください。

lua53 -i script.lua

対話モードでプログラムを読み込むには関数 require または dofile を使います。たとえば、カレントディレクトリにファイル script.lua がある場合、次のコマンドでファイルを読み込むことができます。

require("script")
    or
dofile("script.lua")

require はモジュールをロードするための関数ですが、カレントディレクトリにあるソースファイルもロードすることができるようです。これらの関数の詳細は lua のリファレンスマニュアルをお読みください。

●簡単なベンチマーク

さて、肝心な Lua の実行速度ですが、拙作のページ Algorithms with Python 再帰定義 の「たらいまわし関数」を使って調べてみました。

リスト : たらいまわし関数 (Lua)

function tak(x, y, z)
  if x <= y then
    return z
  else
    return tak(tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y))
  end
end

それでは実行結果を示します。tak(22, 11, 0) を計算しました。

表 : tak(22, 11, 0) の結果
処理系
Python (ver 3.6.9)69.6
Lua (ver 5.3.3)37.2
Ruby (ver 2.5.1p57)25.4
Gauche (ver 0.9.9)25.3
ocamlc (ver 4.05.0)10.8
SBCL (ver 1.4.5)6.38
LuaJIT (var 2.1.0-β)4.02
Julia (ver 1.3.0)2.02
SBCL (最適化)1.57
GCC -O2 (ver 7.4.0)1.23
ocamlopt (ver 4.05.0)0.97

Lua はプログラムをバイトコードにコンパイルする方式です。ネイティブコードにコンパイルする処理系にはかないませんが、バイトコードにコンパイルする方式では速いほうだと思います。もっとも、他のプログラミング言語も改良されて速くなっているので、Lua は Python より速くて Ruby や Gauche よりも遅いという結果になりました。

Lua には JIT (Just in Time) コンパイラを搭載した LuaJIT の開発が行われていて、LuaJIT を使うと実行速度は劇的に速くなります。Ubuntu では次のコマンドでインストールすることができます。

sudo apt install luajit

SBCL (Common Lisp) はネイティブコードにコンパイルする処理系ですが、LuaJIT はそれを上回る速度を叩き出しています。同様に JIT を使用している Julia はもっと高速です。JIT の効果はとても大きいですね。なお、SBCL も最適化を施せば Julia より速くなります。興味のある方は、ほかのプログラムでも試してみてください。

●FizzBuzz 問題

それでは簡単な例題として FizzBuzz 問題を Lua で解いてみましょう。FizzBuzz 問題は 1 から 100 までの値を表示するとき、3 の倍数のときは Fizz を、5 の倍数ときは Buzz を表示するというものです。FizzBuzz 問題の詳細については Fizz Buzz - Wikipedia をお読みください。

プログラムは次のようになります。

リスト : FizzBuzz 問題 (fizzbuzz.lua)

function fizzbuzz()
  for i = 1, 100 do
    if i % 15 == 0 then
      io.write("FizzBuzz")
    elseif i % 3 == 0 then
      io.write("Fizz")
    elseif i % 5 == 0 then
      io.write("Buzz")
    else
      io.write(i)
    end
    if i % 20 == 0 then
      io.write("\n")
    else
      io.write(" ")
    end
  end
end

fizzbuzz()

Lua の場合、関数を定義するときは function を使います。そのあとに関数名と引数を指定します。C言語と違って Lua の変数に型はありません。どんなデータ型でも格納することができます。

実行結果は次のようになります。

$ lua5.3 fizzbuzz.lua
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz
Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz
41 Fizz 43 44 FizzBuzz 46 47 Fizz 49 Buzz Fizz 52 53 Fizz Buzz 56 Fizz 58 59 FizzBuzz
61 62 Fizz 64 Buzz Fizz 67 68 Fizz Buzz 71 Fizz 73 74 FizzBuzz 76 77 Fizz 79 Buzz
Fizz 82 83 Fizz Buzz 86 Fizz 88 89 FizzBuzz 91 92 Fizz 94 Buzz Fizz 97 98 Fizz Buzz

初版 2011 年 4 月 16 日
改訂 2019 年 12 月 28 日

参考文献, URL

  1. The Programming Language Lua, (本家)
  2. Lua 5.3 Reference Manual, (本家)
  3. Lua 5.3 リファレンスマニュアル, (日本語訳)
  4. Lua 入門, (ドットインストール)
  5. Lua - Wikipedia

『お気楽 Lua プログラミング超入門』の著作権は筆者「広井誠 (Makoto Hiroi) 」が保持します。無断使用や無断転載は禁止いたします。『お気楽 Lua プログラミング超入門』で作成したプログラムはフリーソフトウェアとします。ご自由にお使いください。プログラムの改造や配布もご自由にどうぞ。その際は、出典を明記してくださるようお願いいたします。

ただし、これらのプログラムは無保証であり、使用したことにより生じた損害について、作者「広井誠 (Makoto Hiroi) 」は一切の責任を負いません。また、これらのプログラムを販売することで利益を得るといった商行為は禁止いたします。

Copyright (C) 2011-2019 Makoto Hiroi
All rights reserved.

[ Home | Light ]