LoginSignup
0

More than 3 years have passed since last update.

posted at

mrubyがIchigoJamで動くらしい 第3回戦

あらすじ

mrubyがIchigoJamで動くらしい 第2回の続き
ここまで来たので動かないのは悔しいので何とかしたい。
環境は第2回の通り。

アジェンダ

結果

result.png

現状の確認

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ディレクトリだ。

image.png
この子

中を覗いてみると、何とシェルスクリプトを発見。もしかしてこのスクリプトを使って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なハズ。

c.bat
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"
setruby2.bat
mrbc -e --remove-lv %1
c-mrbreader.bat
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

image.png
まぁ、これはね

for2.0/c.bat

image.png
とりあえずFinishは確認できた。

ログはこんな感じで出る。

# 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。

image.png
あの頃のままだ。

一応出力は以下の通り。

# .\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の組み合わせでやってみる。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0