Ruby/Rails Advent Calendar 2025 22日目の記事です。
RubyKaigi 2024 で発表した mruby/edge の進捗をつらつら書きます。
最近実装した内容
去年末も頑張って機能を追加してたんですが:
それに加えて、今年末も重要そうな機能を実装しました。師走の恒例行事か?
CLIを mrbedge にした
mecはもう更新しません。今後は以下でインストールしてください。
cargo install mrubyedge-cli
サブコマンドとして以下が用意されています。
runRubyファイルやmrbファイルを直接実行するcompile-mrbRubyファイルをmrbにコンパイルする(ここまで2コマンド、mruby-compiler2 使わせていただきました)wasm従前のように、Rubyファイルをwasmバイナリにコンパイルする
ドキュメントとかも色々整備したので見ておいてください。
配列を * で分解してアサインするやつを実装した
できてないことに気づいたので入れました。
Proc クラスをちゃんと入れた
今まで内部的にはあったんですがちゃんとクラスを定義しました。ところで、LambdaとProcの区別がまだないですガハハ
Moduleを実装した
今までなかったんです。ちゃんと Module は Class のスーパークラスになっています。
シングルトンクラスを実装した
脳が弾け飛ぶかと思いました。Rubyの継承はむずかしすぎて酷いと思いました。
ところでみなさん、 Class オブジェクトのシングルトンクラスと、普通のオブジェクトのシングルトンクラスは ancestors が全然違います。
class Foo; end class Bar < Foo; end Bar.new.singleton_class.ancestors #=> [#<Class:#<Bar:0x00000001253919f0>>, Bar, Foo, Object, Kernel, BasicObject] Bar.singleton_class.ancestors => [#<Class:Bar>, #<Class:Foo>, #<Class:Object>, #<Class:BasicObject>, Class, Module, Object, Kernel, BasicObject]
「クラスメソッド」は親クラスのクラスメソッドが見えないといけないのでこういうことになっています。この辺も、合わせないとおかしくなるんで、実装しました。
Procを動くようにし、継承周りを真面目に(一部雰囲気で)実装したので、フレームワークらしきコードが実装できそうな感じになってきました。
今は break (mrubyのBREAK命令)とか、ブロック内でのreturn(mrubyのRETURN_BLK命令)を実装しようとしてますが、脳が弾け飛びそうです。
mruby/edge がエッジで動いた日
さて、もう一つご報告として、 mruby/edge をそれっぽくエッジで動かせるようにしました。
こういうコードを書いたら(註: フレームワーク部分のない抜粋😅)、
class App < Router get "/" do |req, res| res.status = 200 res.body = "Hello, World!\n" end get "/version" do |req, res| res.status = 200 res.body = "Ruby version: #{RUBY_VERSION}\nRuby engine: #{RUBY_ENGINE}\n" end end $APP = App
Cloudflare Workers にデプロイして動かせるようになりました。以下をご覧ください(2025/12/22 以降、勝手に削除することがあります)
/ とか /version とか、あと /notfound とかアクセスしてみてください。
気になる? デプロイ時のバイナリサイズは、フレームワーク部分含んで以下の感じです。圧縮前でも 300 KiB 切っていますね。
> wrangler deploy ⛅️ wrangler 4.56.0 ─────────────────── Total Upload: 297.97 KiB / gzip: 92.18 KiB Uploaded mrubyedge-worker-example (3.24 sec) Deployed mrubyedge-worker-example triggers (1.33 sec) https://mrubyedge-worker-example.udzura.workers.dev
mruby/edge はいまだにRubyとして普通の機能が半分ぐらい未実装なのはそうなのですが、それらを全部実装した後も圧縮前 1 MiB を超えるとは想像しにくく、本当にエッジで軽く動かせそうな雰囲気が出てきました。圧縮したらもっと軽くなりますし。
ruby.wasmをベースにしたHibanaは素晴らしい仕事だと思います。が、mruby/edgeは開発用無料アカウントでもデプロイできます。
また、mruby/edgeはコア部分がPure RustなおかげでRustのプログラムなら容易に組み込みが可能です。そのため、 Fastly Compute やその他各種エッジ環境、あるいはWasmに特化したSpinやwasmCloudなどでも容易にRubyが動かせるはずです。その辺りを今後試しつつ、共通化できる部分をしていこうかなという感じです。
まだ未整理なんですけど今回のコードはgithubに上げときます。
最近はmrubyのVMを実装する人がたくさんいるため、RustでVM書いたぞ!と言ってもなんちゃない感じはありますが、Rubyでエッジコンピューティングで遊べるぞ! というマイルストーンが見えてきたので引き続き盆栽をやっていきます。
どうしてもしなければいけない宣伝
福岡でRubyに関するカンファレンスをするので行きましょう。ホテルや航空券を考えるともう取らないと!ほら! そして近辺・地元の方はホテル不要なのでお得に参加できます!
福岡05では、mruby VM自作勢の一人横尾さんや、“あの” yancyaさんを始め、「Rubyコミュニティの今」と「福岡の今」を両方感じ取ることができます。 RubyKaigi 前に筑紫の国で気炎をあげましょう。