Programming  言語 Lua  の紹介 明日、さっそく仕事に役立たない 「日陰モノ勉強会シリーズ」 #1 はやまかおる @zetamatta
Programming 言語 Lua  とは <ul><li>一般には 組込み用言語 として知られている </li></ul><ul><ul><li>ライブラリとして、インタプリタを簡単にリンクできる。 </li></ul></ul><ul><...
す、素直な文法!? <ul><li>-- 階乗を計算してみる  -- </li></ul><ul><li>function fact(a) </li></ul><ul><li>if a > 1 then </li></ul><ul><li>re...
何でも入るテーブル ( 連想配列 ) <ul><li>function Foo(a,b) </li></ul><ul><li>local result= { </li></ul><ul><li>a , -- same as &quot;[1]=...
さっそくだが、 Lua  の暗黒文法面 <ul><li>本当に必要最小限しかない標準ライブラリ </li></ul><ul><ul><li>chdir  すらできない!絶望した! </li></ul></ul><ul><ul><li>だが、共有...
メタテーブル <ul><li>テーブルに対する加減乗除などの演算方法を定義したテーブル。 </li></ul><ul><li>local strict={     __newindex = function(tbl,idx,val)      ...
Lua  を組み込んでみる (chdir  付き lua インタープリタを作ってみた ) <ul><li>#include <stdio.h> </li></ul><ul><li>#include <stdlib.h> </li></ul><u...
逆に  Lua  用の  DLL(so) を作る時は <ul><li>int luaopen_ ライブラリ名 (lua_State *lua) {   /*  ここで Lua 向け関数を登録  */   return 0; } </li></u...
世間に広がる  Lua the world! <ul><li>mod_lua (Apache 2.4 module) </li></ul><ul><ul><li>mod_perl  みたいなインタプリタ常駐化ではなく… </li></ul></...
まとめ:弊社で、どう使うか考えてみた! <ul><li>サーバサイド大規模開発は無理かもね </li></ul><ul><ul><li>要員調達無理すぐる </li></ul></ul><ul><ul><li>静的チェックが弱すぎる (loca...
参考 URL <ul><li>The Programming Language Lua ( 本家 )  http:// www.lua.org/ </li></ul><ul><li>八角研究所  :  高速スクリプト言語「 Lua 」を始めよう...
Upcoming SlideShare
Loading in...5
×

Programming言語Lua紹介(Internet版)

11,876

Published on

社内でやったLua言語勉強会の資料です。ガツガツ勉強したい人向けというよりは、どんな感じなんかなーとちょっとのぞいてみたい人向けですね。

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
11,876
On Slideshare
0
From Embeds
0
Number of Embeds
9
Actions
Shares
0
Downloads
6
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Programming言語Lua紹介(Internet版)

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

    Clipping is a handy way to collect important slides you want to go back to later.

×