一往確認日記 |
2020年12月16日
_ PLCでmruby (3) mrbcコマンド
前回はmrubyとmirbコマンドを使いましたが、今度はmrbcコマンドを使ってみます。
まずは簡単なmrubyプログラムa.rbを準備します。
a = 1
変数aに整数1を代入するだけのプログラムです。
mrbcコマンドでmrubyの中間表現のmrbファイルを生成します。
% mrbc a.rb
mrbファイルを見てみると何のことかさっぱりわかりません。 先行き不安です。
RITE0101ltUMATZ0000IREP&039gLVARaEN%
mrbのBオプションを使うとC言語でリンクできるバイト列の配列を生成します。
% mrbc -Bcodes a.rb
codes配列のデータはバイト列っぽいですね、これだけ見てもやっぱりさっぱりわかりません。
#include <stdint.h>
#ifdef __cplusplus
extern const uint8_t codes[];
#endif
const uint8_t codes[] = {
0x52,0x49,0x54,0x45,0x30,0x31,0x30,0x31,0x6c,0x74,0x00,0x00,0x00,0x55,0x4d,0x41,
0x54,0x5a,0x30,0x30,0x30,0x30,0x49,0x52,0x45,0x50,0x00,0x00,0x00,0x26,0x30,0x33,
0x30,0x30,0x00,0x00,0x00,0x1a,0x00,0x02,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x08,
0x08,0x02,0x01,0x01,0x02,0x39,0x02,0x67,0x00,0x00,0x00,0x00,0x4c,0x56,0x41,0x52,
0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x01,0x00,0x01,0x61,0x00,0x00,0x45,0x4e,0x44,
0x00,0x00,0x00,0x00,0x08,
};
mrbcにverboseオプションを付けて実行してみます。
% mrbc --verbose a.rb
00001 NODE_SCOPE:
00001 local variables:
00001 a
00001 NODE_BEGIN:
00001 NODE_ASGN:
00001 lhs:
00001 NODE_LVAR a
00001 rhs:
00001 NODE_INT 1 base 10
irep 0x7f897b4059c0 nregs=3 nlocals=2 pools=0 syms=0 reps=0 iseq=8
local variable names:
R1:a
file: a.rb
1 000 OP_LOADI_1 R2
1 002 OP_MOVE R1 R2 ; R1:a
1 005 OP_RETURN R2
1 007 OP_STOP
なんかアセンブリ言語の様な出力が出てきました。 これなら何とか読んでいけそうな気がします。