この記事は、mrubyファミリ (組み込み向け軽量Ruby) Advent Calendar 2025に参加してます。

今日は、PicoRubyとMicroRubyについて、具体的にどんな技術なのか、どんな活用が可能なのか、いまいち想像がついていない方向けへの情報を提供できればと思っています。

PicoRubyとは

PicoRubyとは、hasumikinさんが開発されたオリジナルのmrubyバイトコードコンパイラとmruby/cのVMを組み合わせた、Raspberry Pi Picoのようなメモリのリソースが少ない環境向けのRuby環境です。

mruby単体でもコンパイラやVMを持っていますが、それだとRaspberry Pi Picoで動かすにはちょっとメモリが足りなかったのもあり、開発されたようです。

PicoRubyは、限られたリソースでmruby互換のコードを動かすだけでなく、以下のような特徴を備えてます。

  • フラッシュメモリ上のファイルシステムをFATで実装
  • 動的コンパイルの仕組みを導入、ファイルシステム上のコードをrequireも可能に
  • USBのマスストレージクラスに対応して、簡単にファイルを読み書きできる
  • などなど

これらの特徴を備えることにより、単なる言語のマイコンポーティングを超えた統合された環境として実装されています。hasumikinさんもMicroPythonについて言及されてますが、PicoRubyによって、mrubyがMicroPythonに肩を並べるところまできたのではないかと思います。

R2P2とは?

R2P2とは、PicoRubyのアプリケーションとして、シリアル通信でアクセスできる簡易シェルを実装したものです。

PicoRuby Shellが起動した様子

中身では、以下のようなことを行ってます。

shellの実装はpicoruby/mrbgemsにあるので、R2P2は、アプリケーションの実装ではなく、エントリーポイントやターゲットにあわせたビルド環境の提供を行う役割になってます。

R2P2-ESP32とは?

R2P2をESP32に移植したものです。ビルド環境としてESP-IDFを利用するので、picorubyのコードはESP-IDFの作法のcomponent(picoruby-esp32)としてビルドする形式を取っています。

PicoRubyをESP32マイコン上で動かすR2P2-ESP32のはじめかた - QiitaR2P2 はRaspberry Pi Pico上で動作する PicoRuby で書かれたシェルシステムです。 私はこのR2P2をESP32という別のマイコンで動作させる取り組みをしています。先日、 R2P2-ESP32 という名前でGitHubリポジトリも公開しました。 ...Qiita

PicoRubyはどんな要素から構成されるのか?

picoruby/mrbgems以下には、Rubyコードから使うgemや、コンパイラのバイナリや、mrubyやmruby/cのVMコードなど色々なレイヤーのmrbgemが並んでいます。

全体像を理解する上で重要なmrbgemは以下のあたりかなと思います。

  • mruby-compiler2
    • Prismパーサーを取り込んでコンパイラが実装されています。ホスト側でのmrbcでも使われますし、マイコン上の実行中も使われます。
  • picoruby-mruby
    • lib/にmrubyのリポジトリがサブモジュールとして取り込まれています。VMやmruby用のgemが参照されています。
    • src/にはmrubyには元々含まれてないタスク機能に必要なtask.cなどが居たりします。
    • mruby本家から改造が入っているので、hasumikin/mrubyを参照してます。
  • picoruby-mrubyc
    • lib/にmruby/cのリポジトリがサブモジュールとして取り込まれています。
  • picoruby-filesystem-fat
    • PCで使うように使うにはファイルシステムが大切です。こちらではFATのコードをビルドしてファイルシステムを実現してます、
  • picoruby-machine
    • Sleep処理など、VMの実行に必要なHW依存部を定義しています。
  • picoruby-sandbox
    • コンパイラを使って動的にコードをロードして実行するための仕組みを提供してます。

ビルドも含めて詳しく知りたい方は、以下の記事を読まれると良いかもしれません。

hasumikin.comhasumikin is a programmer.hasumikin.com

MicroRubyとは?

MicroRubyとは、RubyKaigi2025でhasumikinさんが発表したPicoRubyから派生した実装です。ざっくりいうとVMがmruby/cベースから、mrubyベースに変わっています。PicoRubyとの比較は、以下のhasumikinさん発表時の資料がわかりやすいと思います。

RubyKaigi2025 @hasumikin さんスライドより

その他参考になる記事はこちら。

RubyKaigi 2025 で発表したMicroRubyとはなんだったのか - hasumikin.comRubyKaigi 2025 で発表したMicroRubyとはなんだったのかhasumikin.com

特に面白いのは、mruby/cの特徴であるマルチタスク機能をmrubyに取り込んでいる点です。以下のあたりで実装されてます。

picoruby/mrbgems/picoruby-mruby/src/task.c at ff5693303ff27c5a11d3cb5cb0db7a29db9171dd · picoruby/picorubyPicoRuby is the smallest Ruby implementation for one-chip microcontrollers - picoruby/picorubyGitHub

PicoRubyとMicroRubyは別のリポジトリ?

いいえ、今は同じpicorubyのリポジトリ上で開発されています。

各mrbgemの内部で、コンパイルオプションにより、PicoRuby向けと、MicroRuby向けの実装のどちらかが選ばれてビルドされています。

どうやってR2P2をビルドするのか?

rakeでビルドできますが、現時点での最新版だと以下のようなオプションが選べるようです。

PicoRubyとMicroRubyそれぞれについて、Raspberry Pi Pico, Pico-W, Pico2, Pico2-Wがターゲットとして選択できます。

私は試したこと無いのですが、Posixビルドもできるらしいので、Linuxでもデバイス依存しない部分は試せるようです。

$ rake -T
rake microruby:pico2:clean    # Clean microruby for pico2 (both debug and prod)
rake microruby:pico2:debug    # Build microruby for pico2 (debug)
rake microruby:pico2:prod     # Build microruby for pico2 (prod)
rake microruby:pico2_w:clean  # Clean microruby for pico2_w (both debug and prod)
rake microruby:pico2_w:debug  # Build microruby for pico2_w (debug)
rake microruby:pico2_w:prod   # Build microruby for pico2_w (prod)
rake microruby:pico:clean     # Clean microruby for pico (both debug and prod)
rake microruby:pico:debug     # Build microruby for pico (debug)
rake microruby:pico:prod      # Build microruby for pico (prod)
rake microruby:pico_w:clean   # Clean microruby for pico_w (both debug and prod)
rake microruby:pico_w:debug   # Build microruby for pico_w (debug)
rake microruby:pico_w:prod    # Build microruby for pico_w (prod)
rake picoruby:pico2:clean     # Clean picoruby for pico2 (both debug and prod)
rake picoruby:pico2:debug     # Build picoruby for pico2 (debug)
rake picoruby:pico2:prod      # Build picoruby for pico2 (prod)
rake picoruby:pico2_w:clean   # Clean picoruby for pico2_w (both debug and prod)
rake picoruby:pico2_w:debug   # Build picoruby for pico2_w (debug)
rake picoruby:pico2_w:prod    # Build picoruby for pico2_w (prod)
rake picoruby:pico:clean      # Clean picoruby for pico (both debug and prod)
rake picoruby:pico:debug      # Build picoruby for pico (debug)
rake picoruby:pico:prod       # Build picoruby for pico (prod)
rake picoruby:pico_w:clean    # Clean picoruby for pico_w (both debug and prod)
rake picoruby:pico_w:debug    # Build picoruby for pico_w (debug)
rake picoruby:pico_w:prod     # Build picoruby for pico_w (prod)

ビルドの仕組みは、rakeとCMakeが連動していて、かつ多段でビルドしたり、生成されるバイナリが複数あったりと、すこし複雑です。

またリポジトリもgit サブモジュールで複数のリポジトリが階層関係を持っています。下の図にその関係を図示してます。

ビルド全体の詳細を理解するには各サブモジュールのCMakeList.txtやRakefileも確認する必要があります。

R2P2は、picorubyを内包する形になっています。ESP32の場合は、ESP-IDFのcomponentとして、picorubyを扱うために、picoruby-esp32が存在しています。

サブモジュールの関係

picorubyの構成のポイントとしては、現在はmrubyのコードは、本家をフォークしたhasumikin/mrubyを参照してる点と、mrubycは本家を参照している点、picoruby/mruby-compiler2が、ruby/prismを参照している点あたりかなと思います。

R2P2-ESPの場合は?

コマンドは異なりますが、ESP-IDFが有効な環境で、R2P2同様にrakeでビルドできます。

ESP32でMicorRubyは使える?

今は使えません。

現状のpicorubyのESP32向けビルド設定(xtensa-esp.rb)では、PicoRubyのビルド用の設定しか用意されていないです。

また、picoruby/mrbgems以下の必須のmruby向けのポートが存在していません。

どう使えばよいのか?(あなたはどう使いたいのか?)

使い方は以下のようなパターンに分かれると思います。

ハードはこだわらずRubyのコードでセンサーやデバイスを使いたい

Raspberry Pi Pico2 あたりで、R2P2のビルド済みバイナリを書き込んで、Rubyで開発するのが王道と思います。(ただしmrbgemで対応できてないデバイスはC言語でバインドを書く必要がでてくることもあり)

M5StackとかのデバイスでR2P2使いたい

R2P2-ESP32を使うことなります。

現状はコードの転送のたびに、フラッシュを上書きする必要があったりするので、開発の利便性に劣るところがありますが、ハードの選択肢が広いのが魅力です。

MicroRubyでR2P2使いたい

現状は、Raspberry Pi Pico2 で rake microruby:pico2:prod とかするのが良さそうです。Pico1だとメモリ不足しがちなので。

R2P2以外のアプリケーションをPicoRuby/MicorRubyで作りたい

R2P2の実装を雛形にして、起動のシーケンスを書き換えることで、すぐ作り始めることができます。

今後の展望

思っていることをつらつらと。

個人的にはESP32推しなので、コメントがそちらに偏りますが、MicroRubyがより安定したら、ESP32向けの対応も進むのかな、と思ってますが、どうなのかな?(色々実装を追加することで、個人的なプロジェクトではMicroRubyをESP32で動かしてる実績ありますが、本家の方向性とは異なるので)

今準備中のシリアルによるファイル転送も取り込まれると、ESP32でも毎回ビルドしたりフラッシュの領域ごと上書きとかは不要になるはず。

Raspberry Pi Pico2でも、最近はPSRAM付きボードが出てきているので、メモリ面では結構緩和される日が来るのかな、と思ったりします。