mruby/edge バージョン 1.0.3 を出した。
これは mruby/edge バージョン 1.0.0 ではないのかという話だが、ちょっと前に 1.0.0 を出したのだが、その時点では Hash と Object#==
がなかったりしたので後から追加していたらバージョンを上げることになったため。
mruby/edge バージョン 1.0.3 を出した。
これは mruby/edge バージョン 1.0.0 ではないのかという話だが、ちょっと前に 1.0.0 を出したのだが、その時点では Hash と Object#==
がなかったりしたので後から追加していたらバージョンを上げることになったため。
componentize_any
というコマンドラインツールを作りました。Rubyで書いたので以下の方法でインストールしてください。
$ gem install componentize_any ## もしくは $ git clone https://github.com/udzura/componentize_any.git && cd componentize_any $ bundle install
以下のようなスクリプトを用意します。(wittyファイルとでも名付けました)
witty do world do export "wasi:cli/run@0.2.0" end package "wasi:cli@0.2.0" do interface "run" do define "run", :func, {[] => :result}, counterpart: "component_run" end end end
以下のようなRubyとRBSのファイルを用意し、 mec
コマンドをインストールしていわゆる普通の(WASI p1依存なしの)WASMバイナリを用意。
# run.rb def component_run 0 end
# run.export.rbs def component_run: () -> Integer
$ cargo install mec --version=1.0.0-rc3 $ mec --no-wasi run.rb $ file run.wasm run.wasm: WebAssembly (wasm) binary module version 0x1 (MVP)
mec
とはRubyのスクリプトをCore WASMのバイナリにコンパイルするコマンドです。以下の記事などで解説しています。
これらが揃ったら componentize_any
でComponentを作ることができます。
$ bundle exec componentize_any \ -witty-file witty.rb \ --input run.wasm \ --output out.wasm Writing WAT to /var/folders/sv/... Compiling WAT to WASM0: /var/folders/sv/... joining WASM0 files with run.wasm created out.wasm run to check: `wasm-tools dump out.wasm 2>&1 | less`
ちゃんとWIT表現を取り出せることを確認。
$ wasm-tools component wit out.wasm package root:component; world root { export wasi:cli/run@0.2.0; } package wasi:cli@0.2.0 { interface run { run: func() -> result; } }
このComponentは wasi:cli/run@0.2.0
を実装しているので、現在の wasmtime
ならそのままファイルを渡して実行可能です。実行が(何も警告を吐かずに)成功することを確認します。
$ wasmtime out.wasm $ echo $? 0
この時、Rubyスクリプトの Kernel#component_run
で 1
を返すようにして再度この手順を踏めば、実行は正しく失敗します。
mrubyファミリ (組み込み向け軽量Ruby) Advent Calendar 2024、23日目の記事です。メリークリスマス!
mrubyファミリAdvent Calendar、今年は1日目からyharaさんによる衝撃的な記事がありました。
なぜ衝撃的だったかというと、僕も全く同じことをしてた(mrubyをRubyで実装しようとしていた)ので...。
で、その実装の下準備のために mruby/c 1.2 のコードリーディングをしていたわけです。今日はそのメモの内容を整理して、最低限のmruby VMの実装を理解する手助けとしようと思います。
ちなみに今回、以下はしません。
あと、筆者は言語実装の素人なのですが、しかし読みやすくするためにこの実装が何者なのかについて適当に言い切っちゃってる点もあります。ツッコミは優しく、事実確認は適宜ご自身でおなしゃす。
また、mruby/cがどのバージョンでどの使用をサポートしているかについての情報もアドベントカレンダーで公開されました。ぜひ併せてお読みください。この記事で色々な背景を残していただいているおかげで、筆者もコード上の不明点がいくつか明らかになり大変助かりました。
続きを読む