あらすじ
mrubyがIchigoJamで動くらしい 第2回の続き
ここまで来たので動かないのは悔しいので何とかしたい。
環境は第2回の通り。
アジェンダ
結果
現状の確認
no | action | succeed |
---|---|---|
1 | make write all | success |
2 | mrbc compile | success |
3 | mruby-l1vm | failure |
4 | TransCoder | failure |
5 | make | |
6 | make write |
mruby-l1vmの結果
#mruby-l1vm code.mrb
fopen code.mrb
**********************************************************************
locals: 1, rergs: 4, ireps: 0
0: 33 jmp 0
37: 17 r[1] = true
39: 34 jmp 3 if r[1] == 1
3: 16 r[1] = self 1
5: 7 r[2] = 1
7: 46 r[1] = r[1].sym[0:led](r[2]:1-r[2])
emb_method 1.led
no methods err!!
2
#
no methods err!!
とか出てるあたり、環境しくじってる感が半端ない。
TransCoderの結果
#.\tool\TransCoder.exe code.mrb
file size = 125
** load header [0]**
###### Trans mrb to C code ######
** Open ../src/code.h **
analyze_irep_r irep=0
0 [main] TransCoder 804 cygwin_exception::open_stackdumpfile: Dumping stack trace to TransCoder.exe.stackdump
#
よし、謎。
取り合えず、mruby2.0の環境回りでしくじっている -> mruby-l1vmがこける
って方向で考える
2.0対応の謎を追いかける
2.0対応の環境回りに関して、実は気になっている点が一つある。
それはfor2.0ディレクトリ
だ。
中を覗いてみると、何とシェルスクリプトを発見。もしかしてこのスクリプトを使ってmruby2.0に対応するのじゃなかろうか。
とりあえずc.shを叩く仕様になっているっぽい。ではこの子たちをWindows用に変えてあげれば良いはず。
for2.0のwindows対応
やる事は単純。各スクリプトを元にwindowsライクな奴を作る。
各スクリプトのやっている事をざっと見てみると
name | description |
---|---|
c.sh | setruby2.sh,c-mrbreader.sh,mrbreader呼び出し |
setruby2.sh | rubyファイルのコンパイル(オプション指定付き) |
c-mrbreader.sh | mrbreaderのコンパイル |
mrbreader | オペコード変換? |
なので、それぞれに対応するbatファイルさえ作ればOKなハズ。
echo "start c.bat"
call setruby2.bat %1.rb
echo "finish setruby2"
call c-mrbreader.bat
echo "finish c-mrbreader"
mrbreader.exe %1.mrb
echo "finish mrbreader"
mrbc -e --remove-lv %1
gcc -DUSE_STDIO -DNO_VA -I ..\\src\\ mrbreader.c -o mrbreader
まぁ、こんな感じでいいだろう。
for2.0対応手順をまとめる
for2.0がWindowsに対応したことで、手順を一つ追加する。
no | action | description |
---|---|---|
1 | make write all | IchigoJamへ環境書き込み(今回は実施しない) |
2 | mrbc compile | rubyスクリプトをmrbファイルへコンパイル |
3 | for2.0/c.bat | 2.0対応バイナリへ変換 |
3 | mruby-l1vm | l1vm用のコンバート?(よく分かってない) |
4 | TransCoder | mrbファイルをcode.h,symbol_ids.hへ変換 |
5 | make | IchigoJam用にコンパイル |
6 | make write | 書き込み |
実際にやってみる
mrbc compile
for2.0/c.bat
ログはこんな感じで出る。
# cd for2.0
# .\c.bat ..\\code
#echo "start c.bat"
"start c.bat"
#call setruby2.bat ..\\code.rb
#mrbc -e --remove-lv ..\\code.rb
#echo "finish setruby2"
"finish setruby2"
#call c-mrbreader.bat
#gcc -DUSE_STDIO -DNO_VA -I ..\\src\\ mrbreader.c -o mrbreader
mrbreader.c: 関数 ‘parseIREP’ 内:
mrbreader.c:294:14: 警告: ポインタから異なるサイズの整数へのキャストです [-Wpointer-to-int-cast]
int align = (int)p & 3;
#echo "finish c-mrbreader"
"finish c-mrbreader"
#mrbreader.exe ..\\code.mrb
55b9
125
50455249 0
irep record len: 231
1 4 0
codelen: 48
0: 33 jmp 37
3: 16 r[1] = self
5: 7 r[2] = 1
7: 46 r[1] = r[1].sym[0](r[2]-r[2])
11: 16 r[1] = self
13: 3 r[2] = 10
16: 46 r[1] = r[1].sym[1](r[2]-r[2])
20: 16 r[1] = self
22: 6 r[2] = 0
24: 46 r[1] = r[1].sym[0](r[2]-r[2])
28: 16 r[1] = self
30: 3 r[2] = 10
33: 46 r[1] = r[1].sym[1](r[2]-r[2])
37: 17 r[1] = true
39: 34 jmp 3 if r[1]
43: 15 r[1] = nil
45: 55 ret r[1]
47:103 stop
n literals: 0
n symbols: 2
sym[0] led
sym[1] wait
n ireps: 0
sec 454e4400 8
#echo "finish mrbreader"
"finish mrbreader"
#
mruby-l1vm
さて、前回通らなかったmruby-l1vm。
一応出力は以下の通り。
# .\tool\TransCoder.exe code.mrb
file size = 125
** load header [0]**
###### Trans mrb to C code ######
** Open ../src/code.h **
analyze_irep_r irep=0
0 [main] TransCoder 1180 cygwin_exception::open_stackdumpfile: Dumping stack trace to TransCoder.exe.stackdump
#
以降の手順は省略
ふりかえり
今回もまた動かなかった。1言語の導入にここまで時間がかかるのは久しぶりだ。
環境構築にこれほどてこずるとは思わなかった。
手を出した以上、動くまでやってはみる。
次回はmruby-1.4.0 + mruby-l1vmの組み合わせでやってみる。