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


紹介(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

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
$ 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

ソースの中身。

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

$ 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)

文書履歴(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 夕