mruby/cを導入してみた(Mac編) 課題11（１つ解決）

#紹介(introduction)
mrubyは、Rubyの小型版です。
mruby/cは、mrubyコンパイラを利用した、さらに小規模なruby実行環境です。

mrubyはRubyの基本機能を持っており、
mrubyコンパイラは、Rubyコンパイラのまつもとゆきひろさんが書かれています。

そのため、基本的なrubyプログラムは、mruby, mruby/cで動きます。

#経緯(history)
田中和明さんのmrubyの講義を聞いたのは過去２回。
田中和明さんのmruby/cの講義を聞くのは３回目。

これまでもすごく興味は持っていたが、自分が何をするといいか見当がついてなかった。

http://swest.toppers.jp/
swestでRuby, mruby, mruby/cの関係者６人の方とお話しをした。
まつもとゆきひろさんはじめ、Ruby, mruby, mruby/c関係者と同時に話をしたのは初めて。

自分が発言したのは「キーワード引数をコンパイラでmrubyで対応できるようにならないか」
参加者から「静的な解決をすればできるはずだけど、、、」

swestに参加していただいた方々の議論の中で、音楽関係のプログラムを組みやすくするためのdelayについてよい提案があった。


#入手(download)
俄然やる気になり、mruby/cを触ろうと　ネットで「mruby/c」で検索。

http://www.s-itoc.jp/activity/research/mrubyc/
記事の日付が見あたらない。

リンクは下記。
https://github.com/mrubyc/mrubyc/releases/tag/release1.1

根っこは
https://github.com/mrubyc/mrubyc

masterをダウンロードしてみる。

フォルダ構成は
![mruby.png](https://qiita-image-store.s3.amazonaws.com/0/51423/3d119e40-ce26-04bb-bf02-7ff777061b71.png)

#環境(environment)
Mac OS Sierra 10.12.6
Mac mini(late 2014)
3Ghz intel Corei7
16GB 16000MHz DDR3
ディスク: 999.35GB  611.15GB空き

```
$ cc --version
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
```

#手順(procedure)
下記README.md文書には記載がないが、mrubyコンパイラが別途必要。

「mrubyコンパイラ(mrbc.exe)は、OSS版mrubyをコンパイルして作成するか、上記からダウンロードします」
http://www.s-itoc.jp/activity/research/mrubyc/mrubyc_tutorial/735

##mruby

```
$ brew install mruby
```
1.4.1が入る。(20180903現在）

makeした時の例：
https://researchmap.jp/jo449djb8-1778110/#_1778110


##mrubyc
```README.md
## Documents

[How to compile?](doc/compile.md)
```

```doc/compile.md
# How to compile?

To make mruby/c sample programs, just `make` in top directory. `Makefile` generates mruby/c VM library `libmrubyc.a` and mruby/c executables.

#mruby/c executables

Three mruby/c executables are generated in /sample_c directory.

mrubyc is a mruby/c VM for one mruby byte-code file. This program executes one mrb file.

mrubyc basic_sample01.mrb
```

```shell-session
$ make
cd mrblib ; make all
make[1]: Nothing to be done for `all'.
cd src ; make all
/Library/Developer/CommandLineTools/usr/bin/make libmrubyc.a
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o alloc.o alloc.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o class.o class.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o console.o console.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o global.o global.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o keyvalue.o keyvalue.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o load.o load.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o rrt0.o rrt0.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o static.o static.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o symbol.o symbol.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o value.o value.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o vm.o vm.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o hal/hal.o hal/hal.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o c_array.o c_array.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o c_hash.o c_hash.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o c_numeric.o c_numeric.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o c_math.o c_math.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o c_range.o c_range.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o c_string.o c_string.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o mrblib.o mrblib.c
ar rv libmrubyc.a alloc.o class.o console.o global.o keyvalue.o load.o rrt0.o static.o symbol.o value.o vm.o hal/hal.o c_array.o c_hash.o c_numeric.o c_math.o c_range.o c_string.o mrblib.o
ar: creating archive libmrubyc.a
a - alloc.o
a - class.o
a - console.o
a - global.o
a - keyvalue.o
a - load.o
a - rrt0.o
a - static.o
a - symbol.o
a - value.o
a - vm.o
a - hal/hal.o
a - c_array.o
a - c_hash.o
a - c_numeric.o
a - c_math.o
a - c_range.o
a - c_string.o
a - mrblib.o
/Library/Developer/CommandLineTools/usr/bin/ranlib: file: libmrubyc.a(c_math.o) has no symbols
cd ext ; make all
/Library/Developer/CommandLineTools/usr/bin/make libmrubyc_ext.a 
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG -I../src    -c -o c_ext.o c_ext.c
ar rv libmrubyc_ext.a c_ext.o
ar: creating archive libmrubyc_ext.a
a - c_ext.o
cd sample_c ; make all
cc -g -I ../src -I ../ext -Wall -Wpointer-arith -L ../src -o mrubyc main.c ../src/libmrubyc.a ../ext/libmrubyc_ext.a
cc -g -I ../src -I ../ext -Wall -Wpointer-arith -L ../src -o mrubyc_sample main_sample.c ../src/libmrubyc.a ../ext/libmrubyc_ext.a
cc -g -I ../src -I ../ext -Wall -Wpointer-arith -L ../src -o mrubyc_concurrent main_concurrent.c ../src/libmrubyc.a ../ext/libmrubyc_ext.a
cc -g -I ../src -I ../ext -Wall -Wpointer-arith -L ../src -o mrubyc_myclass main_myclass.c ../src/libmrubyc.a ../ext/libmrubyc_ext.a
```

```
$ mrubyc basic_sample01.mrb
-bash: mrubyc: command not found
$ ../sample_c/mrubyc basic_sample01.rb 
Error: Illegal bytecode.
```
#実行(compile and go)
mrbcでrbをmrbにコンパイル。
次に、mrubycで実行。

```
$ mrbc basic_sample01.rb
$ ../sample_c/mrubyc basic_sample01.mrb 
30
-10
30
```
ソースの中身。

```mruby:basic_smple01.rb
a = 10
b = 20
c = a + b
puts c

d = a - b
puts d

a = a * 2
b = b / 2
c = a + b
puts c
```



#課題(issue)
##課題1 
mrubyc, mrubyc_concurrentのPathの切り方のお勧め

##課題2
フォルダの中のsampleの拡張子はrb。
mrubyを導入し、mrbcでコンパイルしてmrbを生成しないといけない。（手順の記載なし）

##課題3
brew install mrubyc, ruby_cで導入できない。
brewで一緒にmrubyも導入できるとよい。

##課題4
mrubyc-masterでは、
「/Library/Developer/CommandLineTools/usr/bin/ranlib: file: libmrubyc.a(c_math.o) has no symbols」がでる。release1.1は該当ファイルがなく警告はでない。

##課題5 
mruby/c IDEを使いこなせていない。
どうやったらコンパイルがうまくできるか。
一度教えてもらったことがあるはずなのに、、、。

##課題6
Rubyの仕様拡張にmruby/cとしてどう対応するか。

上記、キーワード引数を含む。

##課題7
音楽演奏に必要な同機の仕組みをどう実現するか。

上記、SWESTでの発言から。

##課題8
特定のCPUへの移植方法の習得

##課題9
TOPPERS/SSPに同梱できないか。

configuratorをruby系にするなら。

##課題10
masterとrelease1.1の関係がわかっていない。

##課題11
dockerでmruby/cを導入中。まだうまくいっ ~~ていない~~。

docker hubに登録。


```
$ docker pull kaizenjapan/mrubyc
Using default tag: latest
latest: Pulling from kaizenjapan/mrubyc
55cbf04beb70: Pull complete 
1607093a898c: Pull complete 
9a8ea045c926: Pull complete 
d4eee24d4dac: Pull complete 
b59856e9f0ab: Pull complete 
34d336b2fcd6: Pull complete 
cc1ab820e4eb: Pull complete 
a27cf78a7a17: Pull complete 
3144ee375031: Pull complete 
64338bafac63: Pull complete 
Digest: sha256:15ee5f97aaad81e7e0650b2f9223e5634bb2c01a70111fea27387a105840047b
Status: Downloaded newer image for kaizenjapan/mrubyc:latest
KM-S05:sample_ruby administrator$ docker images
REPOSITORY                              TAG                 IMAGE ID            CREATED             SIZE
kaizenjapan/mrubyc                      latest              0d4197b2f770        20 minutes ago      1.86GB
$ docker run -it kaizenjapan/mrubyc
root@f5fb4d1350a8:/# ls
1.3.0.zip  boot  etc   lib    media  mruby-1.3.0  opt	root  sbin  sys  usr
bin	   dev	 home  lib64  mnt    mrubyc	  proc	run   srv   tmp  var
root@f5fb4d1350a8:/# cd mrubyc
root@f5fb4d1350a8:/mrubyc# cd sample_ruby
root@f5fb4d1350a8:/mrubyc/sample_ruby# /mruby-1.3.0/bin/mrbc basic_sample01.rb
root@f5fb4d1350a8:/mrubyc/sample_ruby# ../sample_c/mrubyc basic_sample01.mrb
30
-10
30
```

##Dockerでの導入
gccを使う場合には、dockerのgcc公式からpull

```
$ docker pull gcc
Using default tag: latest
latest: Pulling from library/gcc
55cbf04beb70: Pull complete 
1607093a898c: Pull complete 
9a8ea045c926: Pull complete 
d4eee24d4dac: Pull complete 
b59856e9f0ab: Pull complete 
34d336b2fcd6: Pull complete 
cc1ab820e4eb: Pull complete 
a27cf78a7a17: Pull complete 
3144ee375031: Pull complete 
Digest: sha256:728cb48fde7df7a788d7fee93567e2841624aeaaea7e07fd42326836663d4066
Status: Downloaded newer image for gcc:latest
```


```
$ docker run -it --name gcc gcc
root@685f0be9ffee:/# apt-get update
Ign:1 http://deb.debian.org/debian stretch InRelease
Get:2 http://security.debian.org/debian-security stretch/updates InRelease [94.3 kB]
Get:3 http://deb.debian.org/debian stretch-updates InRelease [91.0 kB]
Get:4 http://deb.debian.org/debian stretch Release [118 kB]      
Get:5 http://security.debian.org/debian-security stretch/updates/main amd64 Packages [392 kB]
Get:6 http://deb.debian.org/debian stretch-updates/main amd64 Packages [5148 B]
Get:7 http://deb.debian.org/debian stretch Release.gpg [2434 B]               
Get:8 http://deb.debian.org/debian stretch/main amd64 Packages [7099 kB]
Fetched 7801 kB in 9s (797 kB/s)                                                                                                             
Reading package lists... Done

# apt-get update
(略)
# apt-get install mruby
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  mruby
0 upgraded, 1 newly installed, 0 to remove and 4 not upgraded.
Need to get 296 kB of archives.
After this operation, 2091 kB of additional disk space will be used.
Err:1 http://deb.debian.org/debian stretch/main amd64 mruby amd64 1.2.0+20161228+git30d5424a-1
  Could not resolve 'deb.debian.org'
E: Failed to fetch http://deb.debian.org/debian/pool/main/m/mruby/mruby_1.2.0+20161228+git30d5424a-1_amd64.deb  Could not resolve 'deb.debian.org'
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
root@685f0be9ffee:/# apt-get install mruby --fix-missing?
E: Command line option --fix-missing? is not understood in combination with the other options

```
<この項は書きかけです。順次追記します。>

### mrubyc release1.1 
![mrubyc1.png](https://qiita-image-store.s3.amazonaws.com/0/51423/ecaf3520-9870-2878-1193-c8a7dc5e1159.png)

```
$ cd src
$ ls
Doxyfile	c_ext.h		c_string.c	console.h	libmrubyc.a	static.c	vm.h
Makefile	c_hash.c	c_string.h	errorcode.h	load.c		static.h	vm_config.h
alloc.c		c_hash.h	c_symbol.c	global.c	load.h		symbol.c
alloc.h		c_numeric.c	c_symbol.h	global.h	mrubyc.h	symbol.h
c_array.c	c_numeric.h	class.c		hal		opcode.h	value.c
c_array.h	c_range.c	class.h		hal_posix	rrt0.c		value.h
c_ext.c		c_range.h	console.c	hal_psoc5lp	rrt0.h		vm.c
```

```
$ make
cd src ; make all
if [ ! -e hal ]; then ln -s hal_posix hal; fi
/Library/Developer/CommandLineTools/usr/bin/make libmrubyc.a
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o alloc.o alloc.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o class.o class.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o console.o console.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o global.o global.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o load.o load.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o rrt0.o rrt0.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o static.o static.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o symbol.o symbol.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o value.o value.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o vm.o vm.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o hal/hal.o hal/hal.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o c_array.o c_array.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o c_hash.o c_hash.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o c_ext.o c_ext.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o c_numeric.o c_numeric.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o c_range.o c_range.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o c_string.o c_string.c
cc -Wall -Wpointer-arith -g -DMRBC_DEBUG     -c -o c_symbol.o c_symbol.c
ar rv libmrubyc.a alloc.o class.o console.o global.o load.o rrt0.o static.o symbol.o value.o vm.o hal/hal.o c_array.o c_hash.o c_ext.o c_numeric.o c_range.o c_string.o c_symbol.o
ar: creating archive libmrubyc.a
a - alloc.o
a - class.o
a - console.o
a - global.o
a - load.o
a - rrt0.o
a - static.o
a - symbol.o
a - value.o
a - vm.o
a - hal/hal.o
a - c_array.o
a - c_hash.o
a - c_ext.o
a - c_numeric.o
a - c_range.o
a - c_string.o
a - c_symbol.o
cd sample_c ; make all
cc -g -I ../src -Wall -Wpointer-arith -L ../src -o mrubyc main.c ../src/libmrubyc.a
cc -g -I ../src -Wall -Wpointer-arith -L ../src -o mrubyc_sample main_sample.c ../src/libmrubyc.a
cc -g -I ../src -Wall -Wpointer-arith -L ../src -o mrubyc_concurrent main_concurrent.c ../src/libmrubyc.a
cc -g -I ../src -Wall -Wpointer-arith -L ../src -o mrubyc_myclass main_myclass.c ../src/libmrubyc.a
$ cd sample_ruby
$ mrbc basic_sample01.rb 
$ ../sample_c/mrubyc basic_sample01.mrb 
30
-10
30
```

#参考資料(reference)
https://github.com/mrubyc/mrubyc/issues/57

#文書履歴(document history)
ver. 0.10 初稿 20180903 朝
ver. 0.11 mrubyc/issues/57　追記 20180903　午前 
ver. 0.12 libmrubyc.a(c_math.o) has no symbols 追記 20180903　昼
ver. 0.13 mrbc記述　追記 20180903 午後
ver. 0.14 表題（Mac編）課題９追記 20180903　夕
ver. 0.15 紹介(introduction)追記, 課題10に変更 20180903　夜
ver. 0.16 docker項目記入通。課題11に変更 20180904 夜
ver. 0.17 docker hub登録 20180905 夕
ver. 0.18 URL追記　20230228

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.