# mruby 3.0.0 ​ mruby 3.0 シリーズ初の安定版 [mruby 3.0.0](https://github.com/mruby/mruby/releases/tag/3.0.0) をリリースします。 ​ mruby 3.0では、mruby VMの使用メモリが大幅に削減され、大幅な省メモリ化に成功しました。 これまで、数100KBのRAM領域が必要でしたが、100KB程度のRAMでアプリケーションを起動できるようになりました。 よりコンパクトになった mruby 3.0 を是非お試し下さい。 ​ mruby 3.0の新機能および変更点を紹介します。 主な変更点は [doc/mruby3.md](https://github.com/mruby/mruby/blob/master/doc/mruby3.md) にも記述しています。 ​ --- ​ # 新機能 ​ ## 言語コア ​ - 右代入演算子が実装されました。 (Ruby 3.0) [Ruby:Feature#15921](https://bugs.ruby-lang.org/issues/15921) ただし、mrubyではローカル変数のみに適用されます。 - エンドレスメソッド定義が実装されました。(Ruby 3.0) [Ruby:Feature#16746](https://bugs.ruby-lang.org/issues/16746) - Squiggly headocsをサポートしました。(Ruby 2.3) [#5246](https://github.com/mruby/mruby/pull/5246) ​ ## mruby開発者向け機能 ​ - 追加された C API - `mrbc_cleanup_local_variables()` - mrbc_contextのローカル変数クリーンアップ [#4931](https://github.com/mruby/mruby/pull/4931) - シンボルIDを引数に取るAPIの追加 - `mrb_define_singleton_method_id()` - `mrb_define_class_method_id()` - `mrb_define_module_function_id()` - `mrb_undef_method_id()` - `mrb_undef_class_method_id()` - `mrb_define_const_id()` - `mrb_funcall_id()` - mrb_sym値を返すシンボルチェックのための新しいAPIが追加されました。 - `mrb_intern_check()` - `mrb_intern_check_cstr()` - `mrb_intern_check_str()` - `mrb_fiber_resume()` - Cモジュールからコンテキストを切り換えます。 ​ --- ​ # 機能改善 ​ ## Reduce memory usage ​ - Preallocate Symbols mruby 3.0では、mrubyのコンパイル時にシンボルを静的メモリ領域に割り当てることで、RAMの使用量を大幅に削減できるようになりました。詳細は [doc/guides/symbol.md](https://github.com/mruby/mruby/blob/master/doc/guides/symbol.md) を参照して下さい。 - `Hash` オブジェクトのメモリ使用量を削減しました。 [f2d8db39](https://github.com/mruby/mruby/commit/f2d8db39) - メソッド呼び出し時のメモリ量を削減しました。 [#5272](https://github.com/mruby/mruby/pull/5272) ​ ## ビルドプロセスの更新 ​ これまでのビルド構成ファイル `build_config.rb` が `build_config`ディレクトリ内のファイルに再構成されました。 例えば、以下のような典型的なビルド構成が利用できます。 ​ - `default`: the default configuration - `host-gprof`: プロファイラ `gprof` によるパフォーマンスチューニングのためのコンパイル - `host-m32`: gcc 32bitモードでコンパイル - `boxing`: 3つのboxingオプションでコンパイル - `clang-asan`: clangのアドレスサニタイザでコンパイル ​ `rake` コマンドでmrubyをビルドする時に、`rake MRUBY_CONFIG=boxing` のように、環境変数 `MRUBY_CONFIG` にビルド構成ファイルを指定することでmrubyのビルド構成を指定することができます。 ​ ## コアライブラリ ​ - 新しいmrbgemが追加されました。 - `mruby-catch` - `Kernel.#catch` と `Kernel.#throw` がサポートされます。 [7eaaee54](https://github.com/mruby/mruby/commit/7eaaee54) - `mruby-os-memsize` - `ObjectSpace.memsize_of` と `ObjectSpace.memsize_of_all` がサポートされます。 [#5032](https://github.com/mruby/mruby/pull/5032) [#5040](https://github.com/mruby/mruby/pull/5040) [#5041](https://github.com/mruby/mruby/pull/5041) - Array.new([]) をサポートしました。 (mruby-array) - `Hash#except` が追加されました。 (mruby-hash-ext) - `IO#popen` の引数がキーワード引数に対応しました。 (mruby-io) - `Module#include` と `Module#prepend` の振る舞いを Ruby 3.0 に合わせました。 [3972df57](https://github.com/mruby/mruby/commit/3972df57) ​ ## ツール ​ - `mruby` インタプリタで `*.rb` と `*.mrb` の混在指定が可能になりました。 [a045b6b8](https://github.com/mruby/mruby/commit/a045b6b8) - `mrbc` で `irep`のC構造体を出力する `-S` オプションを追加しました。 ​ ## mruby開発者向け機能 ​ - `mrb_get_args()` にClass/Moduleを受け取るための新しい記述子 `c` が追加されました。 ​ --- ​ # 互換性を損なう変更 ​ ## mruby VM と バイトコード ​ バイナリフォーマットの改善が行われたことにより、mrubyのバイナリの下位互換が失われました。 mrubyバイナリを mruby 3.0で実行するためには、mruby 3.0 の `mrbc` で再コンパイルしてください。 ​ - mruby VMのバージョン `RITE_VM_VER` を(mruby 3.0を示す)`0300` に更新しました。 - バイトコードのバージョン `RITE_BINARY_FORMAT_VER` を `0200` に更新しました。 ​ ## Integerの再編成 ​ IntegerがCRubyに準ずる仕様に変更されました。 ​ - `Fixnum` と `Integer` が統合されました。 - `Integral` が廃止されました。 - 整数同士の除算結果は整数なりました。 - `Integer` に対応するAPIを追加しました。 `Fixnum`用のAPIも互換性のために残されます。 - `mrb_fixnum()` -> `mrb_integer()` - `mrb_fixnum_value()` -> `mrb_int_value()` - `mrb_fixnum_p()` -> `mrb_integer_p()` ​ --- ​ # 主なバグ修正 ​ - `mruby` および `mirb` コマンドでファイルスコープ変数を引き継ぐ問題を修正しました。 [#4933](https://github.com/mruby/mruby/issues/4933) - Orphanなブロック内から `block_given?` を実行すると常に false が返される問題を修正しました。 [#5039](https://github.com/mruby/mruby/issues/5039) - mrubyインタプリタのセグメンテーション違反を修正しました。 [#5046](https://github.com/mruby/mruby/issues/5046) - キーワード引数をブロックパラメータと間違える問題を修正しました。 [#5066](https://github.com/mruby/mruby/issues/5066) - FrozenされたArrayに対するsplat演算子がFrozenErrorとなる問題を修正しました。 [#5067](https://github.com/mruby/mruby/issues/5067) - ピリオドで開始または終了するファイル名の `File.extname` の誤った動作を修正しました。 (mruby-io) [#5077](https://github.com/mruby/mruby/issues/5077) - Windowsサービスとして開始されたプロセスで `mruby-io` が機能しない問題を修正しました。 [#5114](https://github.com/mruby/mruby/issues/5114) - CモジュールからのFiberの再開が無限ループする問題を修正しました。 [#5261](https://github.com/mruby/mruby/issues/5261) - UTF-8文字列の長さ計算が不正となる問題を修正しました。 [#5269](https://github.com/mruby/mruby/issues/5269) - EXPR_MIDが条件演算子に指定された場合の構文エラーを修正しました。 [#5290](https://github.com/mruby/mruby/issues/5290) - ブロック内の番号付きパラメータなどのシンボルが構文エラーとなる問題を修正しました。 [#5295](https://github.com/mruby/mruby/issues/5295) - オブジェクトを文字列に変換するときの無限ループを回避しました。 [01a8d849](https://github.com/mruby/mruby/commit/01a8d849) - `#include` のモジュール順を修正しました。 [ruby-bug:7844](https://bugs.ruby-lang.org/issues/7844) ​ --- ​ mruby 2.1.2以降、274ファイルに対して983件のコミットを行い、16,929行の追加、11,685行の削除を行いました。 詳細な更新情報は[コミットログ](https://github.com/mruby/mruby/compare/2.1.2...3.0.0)を参照して下さい。 ​ `mruby 3.0.0` のリリースにあたり、バグ修正や改善に取り組んだコントリビュータの皆様に感謝を申し上げます