🧲
RubyのコードをC言語化して実行・眺める
サマリ
HomeBrewのmrubyを使用して、rubyファイルをC言語で実行してみました。
マシンスペック
MacBook Air M2 arm64
C言語で実行
Rubyファイルの準備
まずは、簡単なrubyのプログラムを書きます。
def fib(n)
return n if n < 2
fib(n-1) + fib(n-2)
end
puts fib(20)
これを実行するとエラーがなく結果が表示されます。
ruby fib.rb
6765
MRubyファイルを出力
mrbcコマンドでmrbファイルを出力します。
mrbc -o fib.mrb fib.rb
中身を確認してみます。
xxd fib.mrb
00000000: 5249 5445 3033 3030 0000 00b5 4d41 545a RITE0300....MATZ
00000010: 3030 3030 4952 4550 0000 0086 3033 3030 0000IREP....0300
...略
C言語のファイルを準備して実行
まず、mrbファイルをCの配列に変換します。
xxd -i fib.mrb > fib_data.c
Cのファイルを準備します。
#include <mruby.h>
#include <mruby/dump.h>
extern const uint8_t fib_mrb[];
extern const size_t fib_mrb_len;
int main(void){
mrb_state *mrb = mrb_open();
mrb_load_irep(mrb, fib_mrb);
mrb_close(mrb);
return 0;
}
環境変数を設定してビルドして実行します。
export MRPREFIX=$(brew --prefix mruby)
clang \
-I${MRPREFIX}/include \
-L${MRPREFIX}/lib -lmruby \
main.c fib_data.c \
-o fib
./fib
6765
中身を眺める
xxd fib | grep head
00073e30: 0064 6566 6e5f 6865 6164 0024 4034 0064 .defn_head.$@4.d
00073e40: 6566 735f 6865 6164 0065 7870 725f 7661 efs_head.expr_va
000b7c40: 7465 5f68 6561 6465 7200 b80f 6465 6669 te_header...defi
000ce8c0: 6375 7465 5f68 6561 6465 7200 5f64 6566 cute_header._def
000d33e0: 795f 6865 6164 6572 005f 7265 6164 5f69 y_header._read_i
000d3fc0: 6465 645f 696e 5f68 6561 6400 5f6d 7262 ded_in_head._mrb
Discussion