Skip to content

Instantly share code, notes, and snippets.

@t-nissie
Last active February 23, 2025 04:40
Show Gist options
  • Save t-nissie/a2eeabc18c4cd5b010f89890ff30dc5f to your computer and use it in GitHub Desktop.
Save t-nissie/a2eeabc18c4cd5b010f89890ff30dc5f to your computer and use it in GitHub Desktop.
C++のクラスやメソッドを半自動的にmrubyに変換(bind)してくれるmrubybindを調査

C++のクラスやメソッドを半自動的にmrubyに変換(bind)してくれるmrubybindを調査

先日、無謀にも mrubyファミリ (組み込み向け軽量Ruby) Advent Calendar 2024 向けに mrubyをC言語のシミュレーションのプログラムに組み込んでDSLとして利用する という記事を書いてしまいました。 このgist文章はそのC++言語版かもしれません。

C++のクラスは小難しい構造体にすぎないので、 Cと同じようにC++プログラムにmrubyを組み込むことはできなくもないです。 しかし、そうするとコンストラクタとデストラクタをそのまま使うことができませんし、 使いたいC++のメソッドなどのラッパをmruby用にいちいち書く必要があり面倒です。

C++のクラスやメソッドを半自動的にmrubyに変換してくれるmrubybindが便利そうです。 ライセンスはmrubyと同じMITです。 名前的にpybindのmruby版でしょうか。 しかし、mrubyの9c9be44a98のコミットで mrb_const_get()の動作が変わり、2024年末現在最新のmrubyでは mrubybindがそのままでは動かなくなってしまったようです。

このgist文章ではGitHubにあるいくつかのmrubybindのforkを調査しレポートします。 mdorier/mrubybindのforkについては最新のmrubyとともに動くように修正してみます。

オリジナルのmrubybind

Keita Oboさんが作られたオリジナルのmrubybindは https://github.com/ktaobo/mrubybind にあったようですが、現在は残念ながらなくなってしまったようです。

変更のないforkが https://github.com/skandhas/mrubybind のようです。

Keita Oboさんの解説記事がブログ https://ktaobo.blogspot.com/2013/03/mrubybind.html にあります。

codegenディレクトリで 引数の数0-6だけ7通りtemplateを生成してmrubybind.hを作っています。 よって、mrubybind.hはデバッグしづらいです。

mdorier/mrubybind

https://github.com/mdorier/mrubybind

Matthieu Dorierさんが C++14のvariadic templatesを使ってtemplateを超単純化されました。 mrubybind.hのデバッグが楽です。すばらしいです。 例題テストもそろっています。

残念ながら2023年5月の9c9be44a98のコミット 以降のmrubyでは動かなくなってしまいました。 修正をプルリク中です。

t-nissie/mrubybind

https://github.com/t-nissie/mrubybind

わたくしが mdorier/mrubybind をforkして、 2024年末現在最新のmrubyで動くように修正したつもりです。 例題のテストが次のようにできます。

git clone https://github.com/mruby/mruby.git
cd mruby
rake -j33
cd ..
git clone https://github.com/t-nissie/mrubybind.git
cd mrubybind/test
MRUBY=../../mruby make test

dycoon/mrubybind

https://github.com/dycoon/mrubybind

オリジナルにいくつかの便利な機能が追加されています。 解説が https://qiita.com/dycoon/items/697be0f649f174e70931 にあります。

残念ながらmruby側のいくつかの更新のために現状では動きません。

lihaochen910/mrubybind

https://github.com/lihaochen910/mrubybind

dycoon/mrubybindをforkしたものです。 mruby側のいくつかの更新のために現状では動きません。 mrubydind.hのコンパイル時にエラーの出る箇所を

auto& → auto
->env → ->e.env

などと直してゆけば動きそうな気がします。 ホントはcodegenデレクトリ以下を編集すべきで、 mrubybind.hを直接編集してはいけないです。

まとめ

C++のプログラムにmrubyを組み込むときに便利そうなmrubybindを調査しました。 GitHubのforkにはさらに便利そうな機能が追加されているものがありました。 mdorier/mrubybindのforkについては最新のmrubyとともに動くような修正を施してみました。 正しい修正かどうかをチェックしていただけたら幸いです。 最新のmrubyに追従する修正は面倒なので、 いつの日かmrubybindが https://github.com/mruby/mruby の中に取り込まれるとよいですね。

@gbbnfhb
Copy link

gbbnfhb commented Feb 23, 2025

自分も本家のが動かなくて丁度探してました。androidで動きました、ありがたや~
5000行がこんなに短くなるとは。
ぐぐっても本家の方が上に来るのでここにたどり着ける人がどれほどいるか

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment