小型IoTデバイス向けの開発言語「mruby/c」

九州工業大学 田中 和明
しまねソフト研究開発センター 東 裕人

自己紹介
• 九州工業大学
田中 和明（たなか かずあき）• 教育研究– プログラミング，アルゴリズム，データベース、Robot Sensor Processing– 組込みシステム（mruby、リアルタイムOS）、
デジタルサイネージ、三次元測量（土木）• Rubyコミュニティ活動

Ruby, mruby

プログラム言語Ruby• オブジェクト指向型スクリプト言語• 可読性が高い• Webアプリケーション開発で広く使われている• ISO/IEC 30170, JIS X 3017
• 日本発のプログラム言語

Rubyプログラムの実行• インタープリタ方式– 実行時にコードを解析する– 「プログラムを書いて、すぐ実行できる」• 動的な実行– 動的なメモリ管理（GC）– 「開発者はメモリを管理しなくて良い」

組込みシステム• 組込みシステム– 機械や装置内に組込まれるシステム– 例：
自動車，産業機器（ロボットなど）
家電製品，通信装置、ウェアラブル機器• 開発に伴う困難– 多くの制限がある（CPU・メモリ・時間・電力）– ハードとソフト両方の技術を使う

IPA SEC 組込みソフトウェア産業の動向把握等に関する調査（2017年）

組込み開発• 組込みシステム開発費の50%はソフトウェア• 組込みシステムを効率よく開発したい～Rubyの長所を取り入れたい• さて、何が課題だろうか？

Rubyプログラムの実行• インタープリタ方式– 実行時にコードを解析する– 「実行時に多くの資源を必要とする」• 動的な実行– 動的なメモリ管理（GC）– 「実行時間の予測ができない」– 「リアルタイム性が保証できない」

mruby = 軽量Ruby• Rubyを軽量化した実装– 実行時の消費メモリが少ない– ある程度のリアルタイム性を持つ• 文法はRubyと同じ• 他のシステムに組込んで使える– Cプログラムからmrubyプログラムを呼び出す– mrubyプログラムからCの関数を呼び出すmrubyの開発• 2010年度～2012年度– 経済産業省 地域イノベーション創出研究開発事業でmrubyを開発（ネットワーク応用通信研究所、福岡CSK、九州工業大学）• 2015年度～– 島根県 しまねソフト研究開発センターとの共同研究でmruby/c を開発• 2016年度– NEDO 次世代スマートデバイス開発プロジェクトでmruby用IDEを開発（九州工業大学、SCSK九州、有明高専）• 2017年度～2019年度– 経済産業省 戦略的基盤技術高度化支援事業（サポイン事業）でmrubyを使った省電力無線モジュールを開発（Braveridge、九州工業大学、SCSK九州、ILC）

mrubyの動作• mrubyVMによりプログラムを実行する
バイトコードmrubyプログラム
def fib(n)return 1 if n<2
return fib(n-1)+fib(n-2)
endputs fib(10)コンパイル

00000000
00000010
00000020
00000030
00000040
00000050
00000060
00000070
00000080
00000090
000000a0000000b0
000000c0000000d0000000e0000000f0

52 49 54 45 30 30 30 34
54 5a 30 30 30 30 49 52
30 30 00 00 00 4b 00 01
00 80 00 48 01 00 00 c001 00 00 06 01 c0 04 8300 00 00 4a 00 00 00 00
62 00 00 04 70 75 74 73
08 00 00 00 00 00 11 00
02 40 00 83 01 80 00 b3
01 80 00 29 01 80 00 06
01 80 40 a0 02 00 00 06
02 00 40 a0 01 80 c0 ac
00 00 00 04 00 01 3c 00
2d 00 00 01 2b 00 4c 56
00 01 00 01 6e 00 00 00
00 00 00 00 08

f3 be 00 00 00 f5 4d 41
45 50 00 00 00 c0 30 30
00 05 00 01 00 00 00 09
00 80 00 46 00 80 00 06
01 00 00 a0 00 80 40 a000 00 00 02 00 03 66 69
00 00 00 00 70 00 03 00
02 00 00 26 01 80 40 01
01 c0 01 19 01 c0 00 03
02 00 40 01 02 00 80 af
02 80 40 01 02 80 81 2f
01 80 00 29 00 00 00 00
00 03 66 69 62 00 00 01
41 52 00 00 00 17 00 00
01 ff ff 00 00 45 4e 44

実行mruby VM

|RITE0004......MA||TZ0000IREP....00||00...K..........||...H.......F....||..............@.||...J..........fi||b...puts....p...||...........&..@.||.@..............||...)......@.....||..@.......@..../||..@........)....||......<...fib...||-...+.LVAR......||....n........END||.....|

IoT, mruby/c

IoT• 組込みシステムの応用• デバイスをネットに接続して活用する• 必要な技術– ハードウェア（センサ）– ソフトウェア（データ処理）– ネットワーク

IoTで必要な処理• センサの値を取得• データ処理• センサデータの送信• データ蓄積、解析• データの利用デバイスで実行する
mrubyの領域

IoTの開発• 組込みシステムでも、より厳しい制約• IoTデバイス– 小型– コスト
– 電力
– セキュリティ

実証実験・試作は成功するが、実運用できていない多くの事例

IoTデバイス• 小型デバイスが不可欠– ソフトが開発できる– ワンチップマイコン• 試作～実運用まで考えると、– ソフト開発しやすい– 開発したソフトがデバイスに依存しない

IoTデバイスの例

アナログを扱えるワンチップマイコン（Cypress PSoC5LP）

BLEモジュール
（Nordic nRF52）

mrubyを搭載してみる• nRF52モジュール• ARM Cortex M4F• 64KB SRAM
• 512KB Flash• BLE 4.2
mrubyは厳しい• NFC↓
mrubyの小型化

mruby/c• mrubyバイトコードと互換性を持つVM• 相違点– 少ないメモリで動作する（64KB以下）– 複数のmrubyプログラムを動かせる（シングルコア）– オブジェクト実装の簡素化– 例外処理の簡素化– 処理速度よりも省メモリmruby/cの方針• GCは消極的– 基本的にGCはしない– プログラム終了時に全メモリを開放する– リファレンスカウントを併用する• 最小のクラスライブラリ– 多くのクラスはオプショナル• Cインターフェースを簡単に記述できる

mruby/cの特徴• OS無しで複数プログラムを実行する– 複数のセンサを利用する– 優先度が違うプログラムを実行する– （排他制御機能も持つ）• メモリ管理– 静的に割り当てたメモリを利用する– ほとんどの場合に O(1) でメモリ割り当て

消費メモリの比較
実行時に必要なメモリ量
Ruby

mruby

mruby/c数MB400KB< 64KBmruby/cが想定するデバイス• 小型デバイス、ワンチップマイコン– 64KB以下のRAM– OS無し• 省電力デバイス– すぐに起動する• イベント・ドリブンな処理– プログラムは短時間の動作（起動～実行～終了が短時間）

その他• コンカレント処理– CPUやOSの支援なしにコンカレント処理– 割り込みが利用できるなら利用する（パフォーマンス向上）• メモリは静的に確保する– 高速な動的メモリ割り当てアルゴリズム
allocもfreeも O(1)reallocは O(n) ・・・残念 >_<mruby/cのクラス• Object, True, False, Nil• Fixnum• Float
赤字はオプショナル• String#define MRBC_USE_FLOAT 1#define MRBC_USE_STRING 1• Symbol• Array• Hash• Rangemruby/cの独自拡張• コンカレント実行するプログラムは独立したメモリ空間を持つ• ただし、以下は共有する– クラス– メソッド
– グローバル変数（＄で始まる変数）

mruby/cの事例紹介

SenStick• 小型センサデバイス（重さ 3.5g）

奈良先端科学技術大学院大学、Rubyビジネス推進協議会と共同開発

SenStick• 通信モジュール＋センサ• 搭載するセンサ– 9軸– 温度
– 湿度
– 気圧
– 照度（可視光、UV）

nRF52モジュール
ここに mruby/c が入るmruby, mruby/cの入手
GitHubで公開中
https://github.com/mruby/mruby

https://github.com/mrubyc/mrubyc
mrubyの情報： 軽量Rubyフォーラム
http://forum.mruby.org

mruby/cの情報： しまねソフト研究開発センター
http://www.s-itoc.jp