SlideShare a Scribd company logo
Programming  言語 Lua  の紹介 明日、さっそく仕事に役立たない 「日陰モノ勉強会シリーズ」 #1 はやまかおる @zetamatta
Programming 言語 Lua  とは 一般には 組込み用言語 として知られている ライブラリとして、インタプリタを簡単にリンクできる。 最新動向を取り入れながらも 癖のない文法 AWK ・ Python ・ JavaScript  に近いかも クロージャとか、イタレータも使える 既にバージョン  5.1 。脱皮のごとく進化する たいていの環境で ビルドできる autoconf  不要。すごいねぇ。 ANSI 準拠の C コンパイラなら、 make ansi  だけ ( そうすると、拡張ライブラリ使えんけど ) かなり高速らしい はかったことねーけど
す、素直な文法!? -- 階乗を計算してみる  -- function fact(a) if a > 1 then return a*fact(a-1) else return 1 end end for i=1,10 do print( i .. "! =" .. fact(i) ) end fact=function(a) ; end というのも  ok 何の変哲もない if  文 普通の カウンタループ 文字列連結はツードット ぱっと見、特徴が 無いのが特徴!? ⇒  誤解・ PitFall  が 少ない文法
何でも入るテーブル ( 連想配列 ) function Foo(a,b) local result= { a , -- same as "[1]=a" b , -- same as "[2]=b" ["a"] = a , b = b, putA = function(self) print(self["a"]) end , putB = function(self) print(self.b) end } return result end foo = Foo(100,200) foo.putA(foo) foo:putA() テーブルに 無名関数をぶちこめば、 そのままメソッド メソッド付きのテーブルを返せば、即ちコンストラクタなのさ ( この辺流儀は様々 ) コロンがメソッド コール演算子 さりげなく  local 宣言 デフォルトはグローバル 中括弧 ( テーブル ) だけで、 ・配列 ・連想配列 ・オブジェクト ・モジュール用名前空間 を全て兼ねる ⇒  文法少ない ⇒  覚えやすい
さっそくだが、 Lua  の暗黒文法面 本当に必要最小限しかない標準ライブラリ chdir  すらできない!絶望した! だが、共有ライブラリで拡張できる (-> LuaForge) ファイルシステム操作 (lfs) 、 DB ライブラリ (luasql) 組み込んだ本体側からもガシガシ拡張できる 国際化対応?何それ? 漢は黙って、バイト列 (-> iconv.dll ) うっかり「 : 」 ( コロン ) ではなく「 . 」 ( ドット ) を使ってしまう エラーが実行時にしか出ない 変数はデフォルト グローバル Perl  のように  use strict;  が欲しかった。 でも、一応、動的回避の方法はなきにしもあらず
メタテーブル テーブルに対する加減乗除などの演算方法を定義したテーブル。 local strict={     __newindex = function(tbl,idx,val)         error(“Error!”)     end } setmetatable(_G,strict) 「 _G[idx] = val 」といったことがされると、 __newindex  に紐付けられた関数が 代理で呼ばれる ( フックする ) _G って、実は グローバルシンボルテーブルなのさ
Lua  を組み込んでみる (chdir  付き lua インタープリタを作ってみた ) #include <stdio.h> #include <stdlib.h> #include &quot;lua.h&quot; #include &quot;lualib.h&quot; #include &quot;lauxlib.h&quot; int my_chdir(lua_State *lua) { const char *newdir = lua_tostring(lua,1); if( newdir != NULL ){ chdir( newdir ); return 0; }else{ char cwd[ FILENAME_MAX ]; getcwd( cwd , sizeof(cwd) ); lua_pushstring( lua , cwd ); return 1; } } int main(int argc, char **argv) { lua_State *lua; if( argc < 2 ){ fputs(&quot;usage: testlua PROGRAM-NAME.
&quot;,stderr); return 1; } lua = luaL_newstate(); luaL_openlibs(lua); lua_pushcfunction(lua , my_chdir ); lua_setglobal(lua,&quot;chdir&quot;); luaL_dofile( lua , argv[1] ); return 0; } 自前の chdir 関数 引数はスタック操作関数で出し入れ インタプリタ &  ライブラリ 初期化 自前の  chdir 関数を 登録 ファイルを読め! インタプリタよッ! #  ちなみに  Makefile  は、こんな感じ testlua : testlua.c $(CC) -o $@ $< -llua
逆に  Lua  用の  DLL(so) を作る時は int luaopen_ ライブラリ名 (lua_State *lua) {   /*  ここで Lua 向け関数を登録  */   return 0; } という初期化関数を定義しておけば、 「 require “ ライブラリ名” 」できるよ! require  も関数なので、本来は「 require(“ ライブラリ名” ) 」なんだが、「 引数が文字列 1 個  or  テーブル 1 個の時は丸括弧が省略できる 」。 テーブル 1 個の時省略できるということは、名前付き引数による関数呼び出しも出来ないことはないってことだね。   func{  param1=“hogehoge” , param2=“uhaua” }
世間に広がる  Lua the world! mod_lua (Apache 2.4 module) mod_perl  みたいなインタプリタ常駐化ではなく… いろんな設定を  Lua  で書いたりフックできるらしい http://d.hatena.ne.jp/hiboma/20090705/1246804923 Lua on Tyrant KeyValue 型 DB 「 TokyoCabinet 」のリモート I/F TokyouTyrant  版  PL/SQL  みたいなー http://alpha.mixi.co.jp/blog /?p=236 八角研究所  : Lua となでしこのラブラブ仲良し生活( 1 )  -  なでしこ v1.522 で Lua をサポート  http://www.hakkaku.net/articles/20090608-458 LUA ファイル = 「 test001.lua 」 LUA ファイルを開いて、 LUA する。 というソース なのさ
まとめ:弊社で、どう使うか考えてみた! サーバサイド大規模開発は無理かもね 要員調達無理すぐる 静的チェックが弱すぎる (local 問題 ) そっちは  Java  なり、 Ruby  に任せた! C 言語ベースだから、 Windows? static  リンクして、インストールレスな  1- ファイルツールとしてばらまくとかね (PL/SQL 対抗馬「 oluacle.exe 」 ) 「設定ファイルのふり」して組み込む 条件が入り組むような設定だと便利 ミドルウェアを作る人には、とてもよいツールだ 弊社としては、ミドルウェア開発に活用するのがよいんじゃねーだろうか  ( でも、そんなことしてたっけ? )
参考 URL The Programming Language Lua ( 本家 )  http:// www.lua.org/ 八角研究所  :  高速スクリプト言語「 Lua 」を始めよう! http://www.hakkaku.net/articles/20081023-283 Lua 5.1  リファレンスマニュアル  http://sugarpot.sakura.ne.jp/yuno/html/lua51_manual_ja.html LuaForge: Welcome http://luaforge.net/ 404 Blog Not Found: なんてめんこい言語  -  書評  -  入門 Lua プログラミング  http://blog.livedoor.jp/dankogai/archives/51227421.html

More Related Content

Programming言語Lua紹介(Internet版)

  • 1. Programming 言語 Lua の紹介 明日、さっそく仕事に役立たない 「日陰モノ勉強会シリーズ」 #1 はやまかおる @zetamatta
  • 2. Programming 言語 Lua とは 一般には 組込み用言語 として知られている ライブラリとして、インタプリタを簡単にリンクできる。 最新動向を取り入れながらも 癖のない文法 AWK ・ Python ・ JavaScript に近いかも クロージャとか、イタレータも使える 既にバージョン 5.1 。脱皮のごとく進化する たいていの環境で ビルドできる autoconf 不要。すごいねぇ。 ANSI 準拠の C コンパイラなら、 make ansi だけ ( そうすると、拡張ライブラリ使えんけど ) かなり高速らしい はかったことねーけど
  • 3. す、素直な文法!? -- 階乗を計算してみる -- function fact(a) if a > 1 then return a*fact(a-1) else return 1 end end for i=1,10 do print( i .. &quot;! =&quot; .. fact(i) ) end fact=function(a) ; end というのも ok 何の変哲もない if 文 普通の カウンタループ 文字列連結はツードット ぱっと見、特徴が 無いのが特徴!? ⇒ 誤解・ PitFall が 少ない文法
  • 4. 何でも入るテーブル ( 連想配列 ) function Foo(a,b) local result= { a , -- same as &quot;[1]=a&quot; b , -- same as &quot;[2]=b&quot; [&quot;a&quot;] = a , b = b, putA = function(self) print(self[&quot;a&quot;]) end , putB = function(self) print(self.b) end } return result end foo = Foo(100,200) foo.putA(foo) foo:putA() テーブルに 無名関数をぶちこめば、 そのままメソッド メソッド付きのテーブルを返せば、即ちコンストラクタなのさ ( この辺流儀は様々 ) コロンがメソッド コール演算子 さりげなく local 宣言 デフォルトはグローバル 中括弧 ( テーブル ) だけで、 ・配列 ・連想配列 ・オブジェクト ・モジュール用名前空間 を全て兼ねる ⇒ 文法少ない ⇒ 覚えやすい
  • 5. さっそくだが、 Lua の暗黒文法面 本当に必要最小限しかない標準ライブラリ chdir すらできない!絶望した! だが、共有ライブラリで拡張できる (-> LuaForge) ファイルシステム操作 (lfs) 、 DB ライブラリ (luasql) 組み込んだ本体側からもガシガシ拡張できる 国際化対応?何それ? 漢は黙って、バイト列 (-> iconv.dll ) うっかり「 : 」 ( コロン ) ではなく「 . 」 ( ドット ) を使ってしまう エラーが実行時にしか出ない 変数はデフォルト グローバル Perl のように use strict; が欲しかった。 でも、一応、動的回避の方法はなきにしもあらず
  • 6. メタテーブル テーブルに対する加減乗除などの演算方法を定義したテーブル。 local strict={     __newindex = function(tbl,idx,val)         error(“Error!”)     end } setmetatable(_G,strict) 「 _G[idx] = val 」といったことがされると、 __newindex に紐付けられた関数が 代理で呼ばれる ( フックする ) _G って、実は グローバルシンボルテーブルなのさ
  • 7. Lua を組み込んでみる (chdir 付き lua インタープリタを作ってみた ) #include <stdio.h> #include <stdlib.h> #include &quot;lua.h&quot; #include &quot;lualib.h&quot; #include &quot;lauxlib.h&quot; int my_chdir(lua_State *lua) { const char *newdir = lua_tostring(lua,1); if( newdir != NULL ){ chdir( newdir ); return 0; }else{ char cwd[ FILENAME_MAX ]; getcwd( cwd , sizeof(cwd) ); lua_pushstring( lua , cwd ); return 1; } } int main(int argc, char **argv) { lua_State *lua; if( argc < 2 ){ fputs(&quot;usage: testlua PROGRAM-NAME. &quot;,stderr); return 1; } lua = luaL_newstate(); luaL_openlibs(lua); lua_pushcfunction(lua , my_chdir ); lua_setglobal(lua,&quot;chdir&quot;); luaL_dofile( lua , argv[1] ); return 0; } 自前の chdir 関数 引数はスタック操作関数で出し入れ インタプリタ & ライブラリ 初期化 自前の chdir 関数を 登録 ファイルを読め! インタプリタよッ! # ちなみに Makefile は、こんな感じ testlua : testlua.c $(CC) -o $@ $< -llua
  • 8. 逆に Lua 用の DLL(so) を作る時は int luaopen_ ライブラリ名 (lua_State *lua) { /* ここで Lua 向け関数を登録 */ return 0; } という初期化関数を定義しておけば、 「 require “ ライブラリ名” 」できるよ! require も関数なので、本来は「 require(“ ライブラリ名” ) 」なんだが、「 引数が文字列 1 個 or テーブル 1 個の時は丸括弧が省略できる 」。 テーブル 1 個の時省略できるということは、名前付き引数による関数呼び出しも出来ないことはないってことだね。 func{ param1=“hogehoge” , param2=“uhaua” }
  • 9. 世間に広がる Lua the world! mod_lua (Apache 2.4 module) mod_perl みたいなインタプリタ常駐化ではなく… いろんな設定を Lua で書いたりフックできるらしい http://d.hatena.ne.jp/hiboma/20090705/1246804923 Lua on Tyrant KeyValue 型 DB 「 TokyoCabinet 」のリモート I/F TokyouTyrant 版 PL/SQL みたいなー http://alpha.mixi.co.jp/blog /?p=236 八角研究所 : Lua となでしこのラブラブ仲良し生活( 1 ) - なでしこ v1.522 で Lua をサポート http://www.hakkaku.net/articles/20090608-458 LUA ファイル = 「 test001.lua 」 LUA ファイルを開いて、 LUA する。 というソース なのさ
  • 10. まとめ:弊社で、どう使うか考えてみた! サーバサイド大規模開発は無理かもね 要員調達無理すぐる 静的チェックが弱すぎる (local 問題 ) そっちは Java なり、 Ruby に任せた! C 言語ベースだから、 Windows? static リンクして、インストールレスな 1- ファイルツールとしてばらまくとかね (PL/SQL 対抗馬「 oluacle.exe 」 ) 「設定ファイルのふり」して組み込む 条件が入り組むような設定だと便利 ミドルウェアを作る人には、とてもよいツールだ 弊社としては、ミドルウェア開発に活用するのがよいんじゃねーだろうか ( でも、そんなことしてたっけ? )
  • 11. 参考 URL The Programming Language Lua ( 本家 ) http:// www.lua.org/ 八角研究所 : 高速スクリプト言語「 Lua 」を始めよう! http://www.hakkaku.net/articles/20081023-283 Lua 5.1 リファレンスマニュアル http://sugarpot.sakura.ne.jp/yuno/html/lua51_manual_ja.html LuaForge: Welcome http://luaforge.net/ 404 Blog Not Found: なんてめんこい言語 - 書評 - 入門 Lua プログラミング http://blog.livedoor.jp/dankogai/archives/51227421.html