Slide 1

Slide 1 text

goluaをさわってみる 2019/02/12 Fukuoka.go LT @take-cheeze

Slide 2

Slide 2 text

goluaとは? - GitHubのAzure下に突如公 開される - GolangによるLua実装 - 対応Luaのバージョンは5.3

Slide 3

Slide 3 text

Luaとは? - ゲームで高い実績を持つス クリプト言語 - 単体で使う運用よりもその 小ささで埋め込んで使われ ることが多い - mrubyに多大な影響 - Goやってる人だと OpenRestyの lua-nginx-moduleが有名?

Slide 4

Slide 4 text

Luaの バージョンに ついて - Luaそんな詳しくない - 5.0: レジスタマシン導入 - スクリプト言語実装界隈でそこ そこ話題に - 5.1 / 5.2 : LuaJIT - ライブラリの追加はあったり - 微妙に非互換があったはず - 5.3: 数値の内部表現に整 数が追加 - 最新安定系

Slide 5

Slide 5 text

テストを 走らせてみる - ./test/test.shを使う - Lua 5.3がデフォルトのLua として入っていないと動かな い - 自前でビルドするようにして みた

Slide 6

Slide 6 text

自前で やった方法 - Lua 5.3をビルドする - PATHを上書きする - シェルスクリプト便利 - あとは通常通り

Slide 7

Slide 7 text

gluaコマンド - luaコマンドに相当 - /cmd/glua/main.goがエン トリポイント - *lua.Stateを作る - std.Openで標準ライブラリ を読み込む - フラグはそんなに対応して ない(デバッグ系だけ)

Slide 8

Slide 8 text

基本的なところ - Goのランタイムに薄くLuaっ ぽいものを生やしてる - APIは完全に別物 - っぽさだけはある - 関数の取扱が楽だったり - Cを今更書くとつらいので

Slide 9

Slide 9 text

メモリ管理 - 基本的にGoのランタイムに 乗っかる - 詳しくは/lua/value.go - 例: `type String string` - Luaの文字列はimmutable - RubyのStringだと難しい

Slide 10

Slide 10 text

VMの実装 - Goのtype便利 - 命令型のint32に低コストでメ ソッドを生やせる - Cの汚いマクロとおさらば - VMは関数テーブルでディ スパッチする - fetchで対応する関数を取得 - executeで終端まで実行 - Direct Threaded Codeみたいな ことはさすがにできないらしい

Slide 11

Slide 11 text

コンパイラの 実体 - golua自体にLuaのコンパリ ラはない - 実体はluac - luacが生成するVMの実行 表現をgoluaは解釈 - インストールされてるLuaの バージョンが5.3系じゃない と...

Slide 12

Slide 12 text

luaのC APIを goluaで 実装できるか? - 完全にはできない - 詳しくはcgoのPassing Pointers - 一度Goを通せばいい? - Go References to C - 関数ポインタを呼べなくもない?

Slide 13

Slide 13 text

CのAPIが 必要なところ? - 過去のCで実装された部分 を利用するため - GCを考えると難しい

Slide 14

Slide 14 text

APIが 難しいって? - This api is too difficult to use. This is Golang not c! - Cより一応マシ? - interface{}による振り分け がstate.Pushではある

Slide 15

Slide 15 text

テスト結果を 見るのが難しい - 整数の割り算のバグを見つ けた - テストログを短くする必要っ てあんまりないと思う... - パイプでgrepとかやめて...

Slide 16

Slide 16 text

os.executeを 実装してみた - os/execで実装してみた - テスト結果がうまく見れなく てくじけた... - UNIXではたぶんちゃんと動 くかな...? - Luaでおなじみのスタックを いじるAPI

Slide 17

Slide 17 text

まとめ - goluaはGoのランタイムに 薄いLuaをかぶせてる - Goのランタイム優秀 - Lua 5.3とのバイナリレベル での互換性が担保されてい る

Slide 18

Slide 18 text

ありがとうございました!