mruby は、こちらでも述べられているように組み込み言語として広く使われている Lua を強く意識した実装になっています。
mruby も Lua もそれぞれ、他システムに組み込むのが簡単ということだけあって、多からず相互利用の試みは mruby が登場した当初からあるようです。
Lua から mruby を呼ぶのは、ngx_mruby などでちらほらお名前を見かける松本亮介さんが「Lua上でmrubyを動かすための禁断のLuaライブラリを作った」という記事を3年以上前に 書かれています。
人間とウェブの未来 – Lua上でmrubyを動かすための禁断のLuaライブラリを作った
禁断とされている(勝手な思い)Lua上でmrubyを動かす
と、なんだか言葉を濁しつつ書かれているところを見ると、mruby 界隈に暗に「打倒 Lua」の風潮があるのではないかと邪推しちゃいます…(笑)。
また、
というのもあるようです。(これも3年以上前)
時間をかけて調べたわけではないですが、mruby 側から Lua を呼び出す形のちゃんとしたものはなかったようなので、試しに書いてみました。
それまで Lua といえば、漠然と「オンラインゲームの AI スクリプトとして使われている軽量言語」というイメージしかありませんでした。昨日、Lua の具体的な構文も知らないまま、とりあえず C と C# から Lua を使うデモコードを書いてみたら、なるほど簡単。自分なんかでも、2つの言語環境のライブラリのダウンロードからコーディング、実行まで数十分でできてしまいました。
言語仕様もコンパクトに抑えられ、API ではスタックを使って(ちょっと煩雑になる部分はあるにしろ、考え方そのものは)シンプルにコーディングできます。組み込みスクリプト環境に求めるものや規模にもよるとは思いますが、大抵の場合 Lua で事足りるのも納得できます。
拡張性が高く、ポータビリティもよく、言語の中身自体も簡単で敷居が低い Lua は魅力的ではありますが、それはあくまでもダイナミックに保持しなければならないリライタブルなコード部分を限定する場合に限るんじゃないかな、とも思います。というのも mruby を使うと、「スクリプト機能」という部分的なものだけではなく「システム全体を Ruby の上で書く」ことも、より容易になると考えているからです。柔軟で高次元な言語基盤を持つ mruby をグルー言語として使い、その上で各種アプリが動作する形がメンテナンスの上でも生産性の高さでも強みになりそうです。
mruby も Lua も Windows や組み込み機器といった「スクリプト環境の砂漠地帯」に持っていくための良いツールになります。 目的の用途にあった形でお互いを上手く利用することができたらいいな、と思いました。
mruby-lua について
Github で公開しています。Lua5.2 を使っています。
README.md に書いてあること以上でも以下でもないので、ここであんまり書くこともないんですが、mruby から Lua VM を呼び出して実行することができます。
Lua#dostring
は Lua スクリプトを含む文字列として、 Lua#dofile
は Lua スクリプトファイルのパスを受けて実行します。 Lua#[]
と Lua#[]=
は、Lua 上のグローバルなオブジェクトを取得・設定することができます。昨日 Lua を触りはじめて mruby-lua を書いてみて今日なので…まだ mruby と Lua 上の型を相互変換している箇所において一部対応していない型があります(2015/12/8現在)。
より高級な mruby が動く環境で Lua スクリプトを呼び出すことにどれだけの意味があるかは分かりませんが、Lua スクリプトをデータ記述言語として使う既存のシステムとのやり取りとか…何かに使えるのかな…。