明日にはでっかい太陽が昇るかもしれません。

「覚悟」とは!! 暗闇の荒野に!!進むべき道を切り開く事だッ!

luajit に入門してみた

ことの始まり

仕事で Lua を使うことになりそう (というか、使う方向に持って行こうとしている) ので、 LuaJIT の使い勝手を事前に確認してみた。

C との IF が多くあるっぽいので、個別に binding を実装するととんでもないことになりそうなので、 LuaJIT の FFI を使ってみようと思ってのことである。

環境準備

Ubuntu 14.04 64bit ベースで build-essential のインストールは完了している前提。

### とりあえず git から取得
$ git clone http://luajit.org/git/luajit-2.0.git
### リリース版が良かったので、ブランチを切り替え
$ git checkout -b v2.0.5-release refs/tags/v2.0.5
### コンパイル (本番は arm だけど、動作確認なのでホスト向けに)
$ make
### インストール (動作確認なので、システムにはインストールしない)
$ make install PREFIX=~/path/to/workspace
### パスを設定
$ export PATH=~/path/to/workspace/bin:$PATH

C ライブラリの準備

/* コンパイルして libsample.so を生成する */
#include <stdio.h>

struct sample_data {
        char name[100];
        int type;
};

int sample_c_func(struct sample_data* data)
{
        printf("%s:%d name: %s, type: %d\n", __func__, __LINE__, data->name, data->type);
        return data->type;
}

なんてことのない、独自構造体で文字列と数値のやりとりをするだけのものを準備した。

lua コード

ffi = require 'ffi'

ffi.cdef[[
struct sample_data {
        char name[100];
        int type;
};
int sample_c_func(struct sample_data* data);
]]

module = ffi.load('c/libsample.so')

data = ffi.new('struct sample_data')
data.name = 'aaa'
data.type = 12

local ret = module.sample_c_func(data)
print(ret)

データは Lua 側で生成して、 C 関数側に渡す形。

実行結果

sample_c_func:10 name: aaa, type: 12
12

以前、 Lua で C ライブラリをやりとりする処理を実装したことがあったけど、その時は自力でスタックに積んだりおろしたりしていたので、 binding の実装だけでかなりのコード数になったけど、、、なんだこれは!?簡単すぎる (うれしい)

実際にはもっと大きなデータのやりとりになるけど、文字列の取り扱いがメインになるっぽいので、文字列のやりとりがこんなにお手軽だと非常に助かるというのが実感。

ターゲット上で LuaJIT が動作することを早く確認しなければ。