すっかり出遅れました。このようなものの開発が進んでたんですね、「mruby」。
6年ほど前。青臭い文章がいささか鼻につくんですが、そのへんはスルーして頂いて。6年ほど前、こんな文章を書いていました。
現在の組み込みソフトウェア、C++でちまちま作っているような代物ではなくなってしまいました。(中略)C++なんかより、スクリプト言語の方が向いているんじゃなかろうか。最近日に日にその思いが強くなってます。たしかに限界があるんで、PCと同じように、というわけにはいかず、プリコンパイルしてバイトコードなどにしておく必要がありそうですが、逆に言えばそれぐらいの手間をかけるだけで実現できるのではなかろうかと。(中略)Embedded-Rubyとか、どっかで作ってくれないだろうか。
それから6年。そんな時代になっていました。
2012年4月に公開されたmrubyは、Rubyの長所を生かしつつ、よりコンパクトな構造に軽量化・最適化された組み込み機器向けの新しい処理系言語。通常のRubyはスクリプト言語をインタプリタで実行するが、mrubyはRiteVMという実行環境が用意されており、コンパイラによって生成される中間コード(Ruby中間表現)をRiteVM上で実行するという仕組みだ。
ETWest2012:組み込み向けRubyから“不死身”のマイコンまで――Embedded Technology West 2012 (1/2) - MONOist(モノイスト)
で、ためしてみる
クローンしたらmakeひとつで実行ファイルとライブラリファイルが生成されました。
同リポジトリにあるtest/driver.cを参考に、最小構成で書いてみます。
こんな感じ。中身はまだわかってないです。
#include <mruby.h> #include <mruby/proc.h> #include <mruby/compile.h> #include <cstring> int main(int argc, char* argv[]) { if(argc < 2) { return 0; } mrb_state* mrb = mrb_open(); if(mrb != 0) { mrb_parser_state* parser = mrb_parse_nstring(mrb, argv[1], std::strlen(argv[1])); int byte_code = mrb_generate_code(mrb, parser->tree); mrb_value return_value = mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[byte_code]), mrb_top_self(mrb)); if(mrb->exc) { mrb_p(mrb, return_value); mrb->exc = 0; } mrb_close(mrb); } return 0; }
ビルド。
g++ -Imruby/include/ -Lmruby/lib -o sample sample.cpp -lmruby
実行。
$ mv mr sample $ ./sample 'puts "Hello, mruby!"' Hello, mruby! $ ./sample '(1..10).each { |n| puts n }' 1 2 3 4 5 6 7 8 9 10
うん、Rubyだ。
今にして思うと。
mrubyが出てくるまで「待って」しまったのが、まだまだ自分のあまいところかな、と。いや、今でも あまあま ですが。