エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

今日になって組み込み向けRuby「mruby」を知る

すっかり出遅れました。このようなものの開発が進んでたんですね、「mruby」。


6年ほど前。青臭い文章がいささか鼻につくんですが、そのへんはスルーして頂いて。6年ほど前、こんな文章を書いていました。

現在の組み込みソフトウェア、C++でちまちま作っているような代物ではなくなってしまいました。(中略)C++なんかより、スクリプト言語の方が向いているんじゃなかろうか。最近日に日にその思いが強くなってます。たしかに限界があるんで、PCと同じように、というわけにはいかず、プリコンパイルしてバイトコードなどにしておく必要がありそうですが、逆に言えばそれぐらいの手間をかけるだけで実現できるのではなかろうかと。(中略)Embedded-Rubyとか、どっかで作ってくれないだろうか。


C++なんか使ってる場合じゃない。 - エンジニアのソフトウェア的愛情


それから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が出てくるまで「待って」しまったのが、まだまだ自分のあまいところかな、と。いや、今でも あまあま ですが。