3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AUTOSAR CountdownAdvent Calendar 2022

Day 17

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

Last updated at Posted at 2018-09-03

#紹介(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をダウンロードしてみる。

フォルダ構成は
mruby.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
$ 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

mrubyc1.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編)課題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.

3
0
0

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
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?