皆さん、Luaというプログラミング言語を知っていますか。様々な環境に組み込んで使えるプログラミング言語です。Luaは単体でも使うことができますが、別のアプリに組み込んで使われることが多い少し特殊な言語です。決して、表に出る言語ではありませんが、長年に渡りTIOBEのランキングでも安定してベスト50位内に入る言語です。今回は、小粒で美味しいLua言語について紹介します。
Luaとは?
Luaは1993年にリオデジャネイロ・カトリカ大学のロベルト・イエルサリムスキー氏らによって開発されたスクリプト言語です。マルチプラットフォームに対応しており、Windows/macOS/各種Linuxで動作します。Luaの文法はPascalに似ており、JavaScriptと同じく動的型付けの言語であり、プロトタイプベースのオブジェクト指向をサポートしています。
そして、Luaがユニークなのは別のアプリに組込んで使われることが多い言語であるという点です。例えば、ゲームを作るときに、高速な処理が必要な部分はC/C++言語などで開発しておいて、柔軟に差し替えを行いたい部分、シナリオやイベントの記述などにLuaを使います。また、表計算などの実用アプリであれば、基本機能はかっちりした言語で作っておいて、そのアプリを拡張するためのマクロ言語としてLuaを採用するという具合です。とにかく、自分で作ったアプリに手軽に小粒なスクリプト言語を組み込んで使えるというのがLuaの良いところなのです。
鍬手、Luaの長所の一つに実行速度が早いことを挙げることができます。PythonやRubyなどの動的な型付けのスクリプト言語の中では、ずば抜けて速いと言えます。バイトコードを実行するタイプの公式Luaに加えて、実行時に機械語に変換する『LuaJIT』と呼ばれるJITコンパイラ(実行時コンパイラ)もあります。これを使うと非常に高速にプログラムを実行することができます。その実行速度は「Javaよりも少し遅い程度」と言われています。
どの程度速いのでしょうか。実際に筆者のマシン(MacBook Pro CPU:2.3GHz/メモリ:16GB)でフィボナッチのベンチマークを取ってみると、次のような結果になりました。
言語 | 1回目 | 2回目 | 3回目 | 平均 |
---|---|---|---|---|
LuaJIT 2.0.5 | 1.23 | 1.23 | 1.23 | 1.23 |
JavaScript(Node.js v10.18.0) | 1.30 | 1.25 | 1.26 | 1.27 |
Ruby 2.6.3p62 | 9.67 | 9.68 | 9.66 | 9.67 |
Lua 5.3.5 | 16.76 | 15.73 | 16.22 | 16.24 |
PHP 7.3.11 | 10.12 | 10.15 | 10.14 | 10.14 |
Python 3.7.1 | 34.92 | 36.92 | 35.71 | 35.85 |
Perl 5.30.0 | 62.64 | 61.77 | 60.41 | 61.61 |
※時間の単位は秒で、時間が短いほど高いパフォーマンスであることを示しています。
このように、LuaJITは主要な動的スクリプト言語よりも速く、同じくJITを搭載しているNode.jsよりも少し速いという結果になりました。
まとめると、Luaの人気は、柔軟な言語でありながら、実行速度が速く、自分のアプリに組み込み易いという点を挙げることができます。
ちなみに、Luaとはポルトガル語で「月」を意味する単語です。なぜ、ポルトガル語なのかと言うと、Luaを開発したのが、ブラジルのだからです。ブラジルではポルトガル語が話されています。
Luaを単体で使ってみよう
それでは、Luaを単体で使ってみましょう。WindowsでLuaを使うには、Lua for Windowsがあり、こちらからダウンロードできます。macOSでは、Homebrewを使って『brew install lua』でインストールできます。
一番簡単なプログラムを作ってみましょう。以下は、Hello, World!と表示するだけのプログラムです。
print [[Hello, World!]]
print命令で標準出力へ文字列を出力します。Luaでは、文字列記号に、JavaScriptでも使われる '...' や "..." の他に、上記のように、[[ ... ]] や [==[ ... ]==] などを利用することができます。これらは複数行に渡る文字列を記述するのにとても便利です。
プログラムを実行するには、コマンドラインから以下のように実行します。例えば、上記のプログラムを「hello.lua」という名前で保存した場合です。
lua hello.lua
LuaでFizzBuzz問題を解く
本連載でいつも作っている、FizzBuzz問題を解くプログラムを作ってみましょう。FizzBuzz問題とは以下のようなものです。
> 1から100までの数を出力するプログラムを書いてください。ただし、3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」と表示してください。3と5の倍数の時は「FizzBuzz」と表示してください。
以下を「fizzbuzz.lua」という名前で保存します。
-- Fizzを判定する関数を定義 --- (*1)
function is_fizz(n)
return (n % 3 == 0)
end
-- Buzzを判定する関数を定義
function is_buzz(n)
return (n % 5 == 0)
end
-- FizzBuzzを返す定義 --- (*2)
function fizzbuzz(n)
if is_fizz(n) and is_buzz(n) then
return [[FizzBuzz]]
end
if is_fizz(n) then return [[Fizz]] end
if is_buzz(n) then return [[Buzz]] end
return n
end
-- 1から100まで繰り返し出力 --- (*3)
for i = 1, 100 do
print(fizzbuzz(i))
end
そして、コマンドラインで『lua fizzbuzz.lua』と実行するとプログラムを実行できます。
プログラムを確認してみましょう。まず、Luaではコメントは「--」から改行までです。プログラムの(*1)の部分では、Fizz、Buzzを判定する関数を定義しています。関数の定義は『function 名前(引数) ... end』のようにします。
プログラムの(*2)の部分では、(*1)で定義した関数を利用して、FizzBuzz判定を行って文字列を返します。(*3)の部分では、for構文を利用して1から100まで繰り返しfizzbuzz関数を実行します。
まとめ
以上、簡単にLuaについて紹介しました。今回、簡単なプログラムを紹介しましたが、Luaは少し癖があるものの可読性の高いプログラムを記述できることが分かったのではないでしょうか。Luaだけで使うこともできますが、自作アプリに手軽に組み込んで使えるのがLuaの魅力です。小粒で高速なLuaはこれからも、アプリに組み込まれて使われていくことでしょう。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。