🧲

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