Home - gfd-dennou-club/mrubyc-esp32 GitHub Wiki

Welcome to the mrubyc-esp32 wiki!

mruby/c による開発の基礎

Ruby シリーズ

  • Ruby

    • 元祖. サーバ, PC 向け
  • mruby (https://github.com/mruby/mruby)

    • マイコン, 組み込み向け
    • 2010年~2012年 経済産業省地域イノベーション創出研究開発事業で mruby を開発(ネットワーク応用通信研究所,福岡CSK,九州工業大学)
      • 現在は, まつもとゆきひろ氏が主にメンテナンス
    • Ruby を軽量化した実装 (実行時に必要なメモリ量 200 kb)
      • 実行時の消費メモリが少ない
    • 文法はRubyと同じ
  • mruby/c (https://github.com/mrubyc/mrubyc)

    • 小規模マイコン, 組み込み向け
    • 2015年~ しまねソフト研究開発センター, 九州工業大学との共同研究でmruby/cを開発
    • mruby よりさらに小さな実装 (実行時に必要なメモリ量 < 64 kb)
      • RAM 削減を優先 (実行速度を捨てて)
    • 文法はRubyと同じ
      • 利用頻度が低いメソッドは実装していない
    • OS なしでも複数の Ruby プログラムを動かせる

本リポジトリは小規模マイコン ESP32 をターゲットにしているため, 必然的に mruby/c を利用している.

mruby/c の処理系

Ruby はインタプリタ型言語である. Ruby 1.8 までは, 行あるいは ブロック単位でプログラムが逐次機械語プログラムに変換されながら実行されていた. Ruby 1.9 以降は, Java と同様に, ソースコードをバイトコード (中間コード) にコンパイルし, それを仮想マシン (Virtual Machine; VM) で実行するような処理の流れになっている. 当然ながら mruby や mruby/c も基本的に同じような処理系になっている.

仮想マシンが独立しているので, コンパイルまでの複雑な処理と仮想マシンの実行環境を 別々にすることができる. mruby/c では, 以下のように処理をパソコンとマイコンに分ける.

  • Rubyプログラムをバイトコードにコンパイル →パソコンで行う
  • VM (Virtual machine) を使って実行 →マイコンで行う image

mruby/c では Parser と Code Generator の部分 (mrbc コマンド) は mruby の実装をそのまま使用し, VM だけ独自のコンパクトな実装を用いている. 詳細はmrubycで始めるオリジナルIoTデバイス作り (https://magazine.rubyist.net/articles/0059/0059-original_mrubyc_iot_device.html)を参照のこと.

mruby/c による開発方法

本リポジトリは以下の 2 通りの開発方法に対応している.本 wiki に載っているクラス・メソッドを使う限りにおいては, 方法 1 を採用できる.

方法 1: mruby/c だけで完結させる場合

mruby/c VM を書き込み済みのマイコンボードを使い, PC からバイトコードを送り込む.

  • メリット: 簡単に開発が始められ, 試行錯誤もやりやすい.

  • デメリット: VM 側に用意されている機能以外を使いたい場合には VM の拡張が必要.

    • VM が律速となり, マイコンが持っている全ての機能を使えないことがある.

image

本リポジトリを用いて方法 1 でプログラムの作成・マイコンへの書き込みをする方法については, プログラムの作成と書き込みを参照されたい.

方法 2: マイコンの C 言語開発環境を使う

メーカ等が用意した C 言語開発環境と VM のソースコードを使って, 既存の C 言語のプログラムに mruby バイトコードを結合する.

  • メリット: 既存資産 (C言語プログラムなど) が生かせる. マイコンが持っている全ての機能を使うことができる.
  • デメリット: 開発環境の構築など, 開発開始前の作業が多い, 試行錯誤が少しやりにくくなる (コンパイルに時間がかかる)

image

本リポジトリを用いて方法 2 でプログラムの作成・VM のコンパイル・マイコンへの書き込みをする方法については, プログラム作成・VMコンパイル・書き込みを参照されたい.