ローファイ日記

出てくるコード片、ぼくが書いたものは断りがない場合 MIT License としています http://udzura.mit-license.org/

Rubyがエッジで動く日

Ruby/Rails Advent Calendar 2025 22日目の記事です。

qiita.com

RubyKaigi 2024 で発表した mruby/edge の進捗をつらつら書きます。

udzura.jp

最近実装した内容

去年末も頑張って機能を追加してたんですが:

udzura.hatenablog.jp

それに加えて、今年末も重要そうな機能を実装しました。師走の恒例行事か?

CLImrbedge にした

github.com

mecはもう更新しません。今後は以下でインストールしてください。

cargo install mrubyedge-cli

サブコマンドとして以下が用意されています。

  • run Rubyファイルやmrbファイルを直接実行する
  • compile-mrb Rubyファイルをmrbにコンパイルする(ここまで2コマンド、mruby-compiler2 使わせていただきました)
  • wasm 従前のように、Rubyファイルをwasmバイナリにコンパイルする

ドキュメントとかも色々整備したので見ておいてください。

配列を * で分解してアサインするやつを実装した

github.com

できてないことに気づいたので入れました。

Proc クラスをちゃんと入れた

github.com

今まで内部的にはあったんですがちゃんとクラスを定義しました。ところで、LambdaとProcの区別がまだないですガハハ

Moduleを実装した

github.com

今までなかったんです。ちゃんと ModuleClassスーパークラスになっています。

シングルトンクラスを実装した

github.com

脳が弾け飛ぶかと思いました。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に特化したSpinwasmCloudなどでも容易にRubyが動かせるはずです。その辺りを今後試しつつ、共通化できる部分をしていこうかなという感じです。

まだ未整理なんですけど今回のコードはgithubに上げときます。

github.com


最近はmrubyのVMを実装する人がたくさんいるため、RustでVM書いたぞ!と言ってもなんちゃない感じはありますが、Rubyでエッジコンピューティングで遊べるぞ! というマイルストーンが見えてきたので引き続き盆栽をやっていきます。

どうしてもしなければいけない宣伝

regional.rubykaigi.org

福岡でRubyに関するカンファレンスをするので行きましょう。ホテルや航空券を考えるともう取らないと!ほら! そして近辺・地元の方はホテル不要なのでお得に参加できます!

福岡05では、mruby VM自作勢の一人横尾さんや、“あの” yancyaさんを始め、「Rubyコミュニティの今」と「福岡の今」を両方感じ取ることができます。 RubyKaigi 前に筑紫の国で気炎をあげましょう。