# 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` のリリースにあたり、バグ修正や改善に取り組んだコントリビュータの皆様に感謝を申し上げます