mrubyの夕べ 参加しました

昨日は、1/28(月) 15:00-からの 「mrubyプチハッカソン」と17:00-からの「mrubyの夕べ」に参加してきました。

今回mrubyネタで私も発表する機会を頂きましたが、そちらについては別途会社提供のブログで公開する予定です。本ブログでは、まつもとゆきひろさんのmruby講演内容についてまとめてみます。
私の知る限り、90分の時間をかけてmrubyの詳細についてまつもとさんから説明していただける機会は今回が初めてだと思います。

mrubyのテクニカルな話は今回が初めて

  • mruby = embedded-ruby, 又は matsumoto-ruby の略

mrubyにおける組み込みとは

  • Cruby: Rubyが主 (rubyに対して C Extension を提供、アプリはRuby)
  • mruby: Rubyが従 (必要な箇所のみmrubyで記述)
    • 小さなデバイス、システム、アプリへの組み込み

mrubyに必要なもの

  • 組み込みAPI
  • 移植性(Portability)
    • POSIX非依存、OS非依存, C99の範囲内で (できるだけ)
    • ただし、Visual Cでも動作するように、C99の制限は緩和ている
  • 構成可能性
    • システムに対する最適なカスタムコンフィグレーション
  • ソフトリアルタイム
    • 車のABSなどには不向き(ハードリアルタイムは難しい)
    • ゲームへの組み込みレベルのリアルタイム性
      • GCの設計

福岡の人たちが、とてもモチベーションが高かった

  • 平成22年度地域イノベーション創出研究開発事業に採択されてmruby開発を進めることになった
    • このプロジェクトが無ければmrubyは生まれていなかったかもしれない
    • compiler + virtual machine : まつもとさん担当
    • class library + α: 九工大担当
    • プロジェクト管理+周辺ツール: 福岡CSK担当
      • 実証実験: 複数の企業担当
  • 昨年4月にソースコードをgithub上に公開した

組み込みAPI

  • mrb_open()
  • mrb_load_string()
  • mrb_close()

mruby VM

struct mruby_value

  • 構造体渡し
  • mrb_float は double
  • NaN Boxing
    • double float に情報を押し込む
    • lua JITの影響を受けた

mruby C API

  • lua を参考にしている cf. 32bit encoding op code
  • CRuby API に似ている
  • mrb_stateを取る
  • ブロック呼び出しは非推奨
    • できるだけrubyコードで書くことを推奨
    • fiberに将来対応するときなど、大変なことになる

言語としてのlua

  • コンパクトさ優先のため、言語としての機能は少ない
  • rubyっぽく書けるコンパクトな言語が欲しいというモチベーションがあった

移植性

構成可能性

  • include/mrbconf.h の設定を変えることで構成変更が出来る
  • 主要なオプション
    • MRB_NAN_BOXING, MRB_USE_IV_SEGLIST, MRB_VHASH_INT_SIZE
      • リソース節約できる
    • DISABLE_REGEXP
      • enableしても動きません ;(
    • DISABLE_MATH
    • DISABLE_TIME
    • DISABLE_STRUCT
    • DISABLE_STDIO

リンカオプション

  • コンパイラの排除ができる
    • eval, load要らない場合
  • コード生成器の排除
  • 事前コンパイル
  • bin/mrbcを使う
    • test/mrbtest でも使っている

複雑なビルド条件

mrbgems

  • ライブラリの組み込みができる
  • 動的にロードする機能は無い、コンパイル時にリンクする
  • プラットフォーム非依存
  • mrubyソースコード外のコードを指定できる
    • githubを指定することも可能

mgem

  • gem install mgem で簡単インストール
  • mrbgems を管理できる
  • mgem update すれば、リストを更新できる
  • 使い方の例
    • mgem add mruby-env
    • mgem config > build_config.rb

ソフトリアルタイム

  • GC
    • スループット
      • 実行時間中にGCの占める割合
    • 最大停止時間
      • 最も長い停止時間
      • リアルタイム性の評価指標
      • 組み込みの領域では、スループットよりも最大停止時間を重視することが多い
    • マークアンドスイープGC
      • mark phase と seep phase に分かれる
      • mark phase
      • top level変数を root にする
      • 数珠つなぎにアクセスできるオブジェクトを探索
      • 見つけたオブジェクトをマークする
      • sweep phase
      • 全てのオブジェクトを探索し、死んでいるオブジェクトを改修する
    • 保守的GC
    • Arena
    • インクリメンタルGC
    • 世代別GC
    • インクリメンタル世代別GC

太陽光発電管理システム

  • 東芝さんが開発
  • 管理スパンが10年単位と長いため、PCより可動部の少ない機器が最適
  • mrubyを使ってプロトタイプを実装した

自動機メンテシステム

  • 富士電機さんが開発
  • 中国の子会社がコードを書いている
  • ruby -> rule based compiler -> c言語 に変換して使っている
  • メンテナンスシステム(レシート印字)向けにプロトタイプを作成した

ruby対応インテリジェントルータ

  • mrubyを搭載したエッジルータ

教育用ボードコンピュータ

モジュール色々

  • mod_mruby
  • Nginx
  • mruby-uv

サーバ用途でのmruby

  • メモリの増大、GCコストの増大
    • mrubyのGCは優秀なので、crubyからmrubyへの置き換え検討の余地がある

クライアントサイド

  • mruby to JS converter
    • llvmを使っている
  • NaCl (native client)
    • web browser で動かすのに向いている

ロボット

  • top levelの制御にmrubyを使う

レゴ マインドストーム

  • ETロボコンで使っているチームがある
  • メモリが64kBしかないので、ライントレースするだけでも大変
    • メモリの増えたバージョンが最近発売された

MobiRuby

  • iOS上で動作する

Games

  • ゲームのプログラム内で利用する
    • 今のところ lua が多い
    • mrubyも是非使ってほしい