最近は Raspberry Pi で LuaJIT を少し触りましたが、 以前 Apache2.4.1 に mod_lua が追加されたときにも 少しだけ Lua を触っていました。
Lua が結構速いということで、 その時に 他の言語と 超簡単な速度比較をしていたのですが、 今回は LuaJIT も含めて Raspberry Pi 上で比較してみたいと思います。
$ time bash -c 'for ((i=0;i<1000000;i++)) do j=i; done' real 2m51.676s user 2m46.940s sys 0m3.620s $ time perl -e 'for($i=0;$i<1000000;$i++){$j=$i;}' real 0m2.782s user 0m2.740s sys 0m0.020s $ time lua -e 'for i=1,1000000 do j=i end' real 0m0.337s user 0m0.330s sys 0m0.010s $ time luajit -e 'for i=1,1000000 do j=i end' real 0m0.041s user 0m0.010s sys 0m0.000s
luajit は 速いですね。
変数を局所化した方が早くなるそうなので そちらもお試し。
$ time lua -e 'local i, j; for i=1,1000000 do j=i end' real 0m0.171s user 0m0.160s sys 0m0.010s $ time luajit -e 'local i, j; for i=1,1000000 do j=i end' real 0m0.022s user 0m0.010s sys 0m0.000s
かなり速くなりました。
以前試した LjES が ver.2.00 になったということで さっそく試してみたいと思います。
[参考]
Raspberry Pi メモ (29) - LuaJITでお手軽3D (5)
今回のバージョンでは Blender で作成し Collada 形式でエクスポートした 3D モデルを読み込む機能が追加されていて お手軽に 3D アニメーション ができるそうです。
上記サイトにも書いてありますが、 以下のコマンドを実行するだけで デモを動かすことができます。
$ cd /tmp $ curl -O http://www.mztn.org/rpi/ljes-2.00.tar.gz $ tar zxf ljes-2.00.tar.gz $ cd ljes-2.00 $ cd examples $ luajit hand.lua
2014-01-07-wheezy-raspbian 上で試しましたが 簡単に動きました。
[1] 〜 [6] を押すと、指が動きます。 終了したいときは [q] を押します。 その他、操作は [h] で表示されます。
3D モデルとアニメーションの定義が 取り込めて Lua のプログラムで利用できるようになっているのはすごいですね。
jun さんが Raspberry Pi 上で動く LuaJIT の 3D ライブラリを作られたので 3D で 遊んでみたいと思います。
[参考サイト]
Raspberry Pi メモ (20) LuaJITでお手軽3D (2) LjESリリース - Jun's homepage
LuaJIT や OpenGL ES2 についても書かれてますので 詳しくは次のページなんかを参照してください。
[参考サイト]
Raspberry Pi メモ (19) LuaJITでお手軽3D (1) - Jun's homepage
Raspberry Pi メモ (7) OpenGL ES2 (1) 概要 - Jun's homepage
とりあえず動かしてみます。
まず Raspberry Pi を起動して HDMI からの出力を TV などに出しておきます。
次に LuaJIT の 3D ライブラリをダウンロードして 解凍します。
$ cd /tmp $ wget http://www.mztn.org/rpi/ljes-1.00.tar.gz $ tar zxf ljes-1.00.tar.gz
$ cd ljes-1.00 $ ls -F COPYRIGHT examples/ LjES/ README test/
examples の中にサンプルがあります。
$ cd examples $ ls *.lua axis.lua donut.lua term.lua demo_shape.lua double_cone.lua truncated_cone.lua demo_spheres.lua sphere.lua
demo_shape.lua を実行してみます。
$ luajit demo_shape.lua
HDMI の出力先に次のような 3D が表示されます。
[Q]キーで終了します。 [Ctrl]+[C]で終了した場合、コンソールの設定が変更されたままになります。 そのときは、エコーされませんが、次のように term.lua を実行すると元に戻ります。
$ ./term.lua
今回はここまで。
lua は変数に型を定義しませんが 型は存在します。 他の型のない言語と同じように 変数に色々な型を入れることができます。
適当に試してみます。
$ lua >
対話モードに入りました。
> = type(a)
nil
type は引数の型を返す関数です。
変数 a が定義されていない状態では nil を返します。
> a = "test" > = type(a) return > a = 2.2 > = type(a) number > a = true > = type(a) boolean > a = {1,2,3} > = type(a) table
変数には関数も入れることができます。
> a = type > = type(a) function
当然、次のようなこともできます。
> a = type > = a(a) function
lua は変数に型がない言語としては かなり速いそうです。
適当に試してみます。
$ time lua -e 'for i=1,1000000 do j=i end' real 0m0.029s user 0m0.030s sys 0m0.000s
$ time perl -e 'for($i=0;$i<1000000;$i++){$j=$i;}' real 0m0.143s user 0m0.150s sys 0m0.000s
$ time php -r 'for($i=0;$i<1000000;$i++)$j=$i;' real 0m0.160s user 0m0.140s sys 0m0.020s
$ time bash -c 'for ((i=0;i<1000000;i++)) do j=i; done' real 0m6.276s user 0m5.910s sys 0m0.180s
厳密な比較ではないですが なんとなく速そうですね。
前回に続き lua を触ってみます。
lua はスクリプトファイルやコンパイルしたファイルを引数にする以外にも 実行する方法があります。
まずは perl などでもお馴染みのコマンドラインの引数に スクリプトを直接書く方法です。
$ lua -e "print(3)"
3
オプションは "-e" を指定します。
このような処理も書けます。
$ lua -e "for i=1,3 do print(i) end"
1
2
3
次は、対話型です。
引数を指定せずに lua コマンドを実行すると プロンプトが表示されて 対話モードになります。
$ lua >
対話モードを終了するには [Ctrl]+[c] します。
出力するには print() 関数以外にも = を使うことができます。
> print(3) 3 > = 4 4
"=" は return と同じです。 ([↑]キーでコマンド履歴を表示すると "=" は return になっています)
なので return でも出力できます。
> return 1 + 2
3
カンマで区切るとタブ区切りで出力します。
> print(1,2,3) 1 2 3 > = "a", "b", "c" a b c > return 3, 5, 7 3 5 7
[参考]
Apache HTTP Server 2.4.1 がリリースされました - Apache JP (2012/02/21)
ということなのですが、内容に「スクリプト言語 Lua を組み込むモジュール (mod_lua)」というのがあり、 巷で話題?の lua に触れてみました。
まずインストール。
Ubuntu 10.04 には lua50 というパッケージがあります。
$ sudo apt-get install lua50
これで lua 5.0.x が入ります。
コマンドは次のような感じです。
$ lua
lua lua50 luac luac50
lua コマンドが lua の実行で、luac がコンパイラのようです。
Java と似てますね。
対話形式もできるようですが、それはまた別の機会に。
とりあえず適当なソースを書いてみます。
$ vi test.lua
print(3)
実行してみます。
$ lua test.lua
3
コンパイルしてみます。
$ luac test.lua $ ls luac.out test.lua
"luac.out" というファイルができました。
実行してみます。
$ lua luac.out
3
コンパイルしたファイルの実行も "luac.out" 単体ではなく lua コマンドに食べさせるようです。
実行可能なスクリプトファイルにしてみます。
$ vi test2.lua $ chmod 755 test2.lua
#!/usr/bin/lua print(3)
実行してみます。
$ ./test2.lua
3
簡単ですね。
ちなみにコンパイルしたファイルを file すると コンパイルしたバージョンが表示されるようです。
$ file luac.out
luac.out: Lua bytecode, version 5.0