#紹介(introduction)
mrubyは、Rubyの小型版です。
mruby/cは、mrubyコンパイラを利用した、さらに小規模なruby実行環境です。
mrubyはRubyの基本機能を持っており、
mrubyコンパイラは、Rubyコンパイラのまつもとゆきひろさんが書かれています。
そのため、基本的なrubyプログラムは、mruby, mruby/cで動きます。
#経緯(history)
田中和明さんのmrubyの講義を聞いたのは過去2回。
田中和明さんのmruby/cの講義を聞くのは3回目。
これまでもすごく興味は持っていたが、自分が何をするといいか見当がついてなかった。
http://swest.toppers.jp/
swestでRuby, mruby, mruby/cの関係者6人の方とお話しをした。
まつもとゆきひろさんはじめ、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をダウンロードしてみる。
#環境(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
## Documents
[How to compile?](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
$ 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
ソースの中身。
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
$ 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編)課題9追記 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.