mruby/cでメソッドの制限
mrubyc_arduinoで、使用するflashを節約するためには、floatを無効にするとか、マルチタスク機能を削除するなど、いくつかの方法がある。 もう一つの方法は、使えるメソッドを減らすことである。
mruby/cではrubyのクラスやメソッドは、主にc言語で実装されているが、その一部はrubyで書かれたコードをmrbcでバイナリにして組み込むことによって実現している。 これがmrblibであり、そのバイナリのサイズは約4.5kである。 ch32v203でmrubyc_arduinoを使ったときには、mrblibを拡張flashに移動することによって、メインのflashを節約したが、これを組み込まないこともできる。 mrblibを組み込まなければ、必要なflashは約4.5kぐらい減る上に、mruby/cに必要なメモリの量も少なくなる。 以前、ESP8266で実験したときには、mrblibを組み込む場合にはmruby/c用に5kほどのメモリを確保しないといけなかったが、mrblibを組み込まない場合には2kでも動かすことができた。
しかし、mrblibを組み込まない場合には、そこで定義されていたメソッドが使えない。 mruby/cで使うことのできる クラス・ライブラリ の中で、下の表がmrblibで定義されているメソッドである。
| Enumerable | collect, map, each_with_index |
| Array | all?, any?, collect!, map!, delete_if, each, each_index, index, find_index, none?, reject!, reject, reverse_each, select, filter, select!, filter!, sort!, sort |
| Hash | each |
| Numeric | times, upto, downto |
| Object | loop |
| Range | each |
| String | each_byte, each_char, ljust, rjust, each_line |
一方、c言語で実装されているmethodを使わないようにするには、 autogen_class*.hのmethod_symbols_とmethod_functionsにある要素をコメントアウトすれば良い。 すると、コンパイル時の最適化でこれらは除かれるのである。 取り除いてはいけないメソッドもあるかも知れないが、ほとんど使わないけどコードが長くなりそうなメソッドを消せば、flashの節約になるだろう。
問題なのは、あまりメソッドを減らしすぎると、rubyっぽく無くなってしまうことである。 機能の限られたマイコンで動かすrubyとして、最低限必要なメソッドはどれかというのは、人によって意見が別れるだろう。
さらにflashの使用量を減らすためには、 マイコンには必要ないと思われるクラスを消すということも考えられる。 そのままではうまく働かないものの、 FloatやStringを無効にする指定はvm_config.hで定義されている。 Floatについては、2026/4/15のブログに書いてあるように修正すれば、無効にできるが、Stringは他のコードでも使われていることが多く、無効にするのは諦めている。 それと同様に、マイコンで使う必要性が低いクラスを無効にしてしまうことも出来るだろう。 例えば、Hashをマイコンから使う機会は少ないように思うが、SrtingやHashはmrblibにも定義が書かれているので、これらを無効にするのは単純には出来無いだろう。
2026/5/12追記 Hashはキーワード引数の処理に使われているので、消すことは出来無さそうだ。