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

# あらすじ

[mrubyがIchigoJamで動くらしい 第2回](https://qiita.com/miyatama/items/5c114d95e567d4835a22)の続き
ここまで来たので動かないのは悔しいので何とかしたい。
環境は第2回の通り。

アジェンダ

 + [結果](#result)
 + [現状の確認](#current_status)
 + [2.0対応の謎を追いかける](#chase_the_unknown)
 + [for2.0のwindows対応](#for20_to_windows)
 + [for2.0対応手順をまとめる](#organize_flow)
 + [実際にやってみる](#lets_do_it)
 + [ふりかえり](#furikaeri)

# <a name="result">結果</a>

![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/6200b3bc-3a11-bfc5-038c-2ee62fe66de5.png)


# <a name="current_status">現状の確認</a>

| 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の結果

```bash
#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の結果

```bash
#.\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がこける``って方向で考える

# <a name="chase_the_unknown">2.0対応の謎を追いかける</a>

2.0対応の環境回りに関して、実は気になっている点が一つある。
それは``for2.0ディレクトリ``だ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/4b04d69f-0a97-50e6-cad4-c680bd5784da.png)
<font color="dark_pink">この子</font>

中を覗いてみると、何とシェルスクリプトを発見。もしかしてこのスクリプトを使ってmruby2.0に対応するのじゃなかろうか。
とりあえずc.shを叩く仕様になっているっぽい。ではこの子たちをWindows用に変えてあげれば良いはず。

# <a name="for20_to_windows">for2.0のwindows対応</a>

やる事は単純。各スクリプトを元にwindowsライクな奴を作る。

各スクリプトのやっている事をざっと見てみると

| name | description |
| :----- | :----- |
| c.sh | setruby2.sh,c-mrbreader.sh,mrbreader呼び出し |
| setruby2.sh | rubyファイルのコンパイル(オプション指定付き) |
| c-mrbreader.sh | mrbreaderのコンパイル |
| mrbreader | オペコード変換? |

なので、それぞれに対応するbatファイルさえ作ればOKなハズ。

```powershell: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"
```

```powershell:setruby2.bat
mrbc -e --remove-lv %1
```

```powershell:c-mrbreader.bat
gcc -DUSE_STDIO -DNO_VA -I ..\\src\\ mrbreader.c -o mrbreader
```

まぁ、こんな感じでいいだろう。

# <a name="organize_flow">for2.0対応手順をまとめる</a>

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 | 書き込み |

# <a name="lets_do_it">実際にやってみる</a>

## mrbc compile

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/138b397b-f23e-6c37-a98c-b1332caacd79.png)
<font color="dark_pink">まぁ、これはね</font>

## for2.0/c.bat

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/0ae076bd-fbf9-4123-706a-9c5624c57f67.png)
<font color="dark_pink">とりあえずFinishは確認できた。</font>

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

```powershell
# 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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42445/31023eed-204c-e82b-3780-fbe35642c080.png)
<font color="dark_pink">あの頃のままだ。</font>

一応出力は以下の通り。

```powershell
# .\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
#
```

以降の手順は省略

# <a name="furikaeri">ふりかえり</a>

今回もまた動かなかった。1言語の導入にここまで時間がかかるのは久しぶりだ。
環境構築にこれほどてこずるとは思わなかった。
手を出した以上、動くまでやってはみる。

次回はmruby-1.4.0 + mruby-l1vmの組み合わせでやってみる。