mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
164 lines
4.7 KiB
Markdown
164 lines
4.7 KiB
Markdown
# User visible changes in `mruby3.0`
|
|
|
|
# Build System
|
|
|
|
## `build_config` directory
|
|
|
|
Typical build configuration files are located in `build_config`
|
|
directory. For examples:
|
|
|
|
- `default`: the default configuration
|
|
- `host-gprof`: compiles with `gprof` for performance tuning
|
|
- `host-m32`: compiles in gcc 32-bit mode on 64-bit platforms
|
|
- `boxing`: compiles all three boxing options
|
|
- `clang-asan`: compiles with `clang`'s Address Sanitizer
|
|
|
|
You can specify the build configuration file with the
|
|
`MRUBY_CONFIG` environment variable (or `CONFIG` in short).
|
|
If the value specified by `MRUBY_CONFIG` is not the path to
|
|
the configuration file, `build_config/${MRUBY_CONFIG}.rb` is
|
|
used. So you can specify it as `rake MRUBY_CONFIG=boxing`,
|
|
for example.
|
|
|
|
# Build Configuration Contribution
|
|
|
|
When you write a new build configuration description, please
|
|
contribute. We welcome your contribution as a GitHub
|
|
pull-request.
|
|
|
|
# Language Changes
|
|
|
|
## New Syntax
|
|
|
|
We have ported some new syntax from CRuby.
|
|
|
|
- Single line pattern matching (`12 => x`);
|
|
mruby matches only with local variables at the moment
|
|
- Numbered block parameter (`x.map{_1 * 2}`)
|
|
- End-less `def` (`def double(x) = x*2`)
|
|
|
|
# Configuration Options Changed
|
|
|
|
## Renamed for consistency
|
|
|
|
Some configuration macro names are changed for consistency (use `MRB_USE_XXX`
|
|
or `MRB_NO_XXX`).
|
|
|
|
| mruby2 | mruby3 |
|
|
| ------------------------------ | ------------------------- |
|
|
| `MRB_ENABLE_ALL_SYMBOLS` | `MRB_USE_ALL_SYMBOLS` |
|
|
| `MRB_ENABLE_CXX_ABI` | `MRB_USE_CXX_ABI` |
|
|
| `MRB_ENABLE_CXX_EXCEPTION` | `MRB_USE_CXX_EXCEPTION` |
|
|
| `MRB_ENABLE_DEBUG_HOOK` | `MRB_USE_DEBUG_HOOK` |
|
|
| `MRB_DISABLE_DIRECT_THREADING` | `MRB_NO_DIRECT_THREADING` |
|
|
| `MRB_DISABLE_STDIO` | `MRB_NO_STDIO` |
|
|
| `MRB_METHOD_T_STRUCT` | `MRB_USE_METHOD_T_STRUCT` |
|
|
| `MRB_USE_FLOAT` | `MRB_USE_FLOAT32` |
|
|
| `MRB_WITHOUT_FLOAT` | `MRB_NO_FLOAT` |
|
|
| `ENABLE_LINENOISE` | `MRB_USE_LINENOISE` |
|
|
| `ENABLE_READLINE` | `MRB_USE_READLINE` |
|
|
| `DISABLE_MIRB_UNDERSCORE` | `MRB_NO_MIRB_UNDERSCORE` |
|
|
|
|
- `MRB_USE_FLOAT32` is changed from `MRB_USE_FLOAT` to make sure `float` here
|
|
means using single-precision float, and not the opposite of `MRB_NO_FLOAT`.
|
|
- `MRB_USE_METHOD_T_STRUCT` uses `struct` version of `mrb_method_t`. More
|
|
portable but consumes more memory. Turned on by default on 32-bit platforms.
|
|
- `MRB_` prefix is added to those without.
|
|
|
|
## `MRB_NO_BOXING`
|
|
|
|
Uses `struct` to represent `mrb_value`. Consumes more memory
|
|
but easier to investigate the internal and to debug. It used
|
|
to be default `mrb_value` representation. Now the default is
|
|
`MRB_WORD_BOXING`.
|
|
|
|
## `MRB_WORD_BOXING`
|
|
|
|
Pack `mrb_value` in an `intptr_t` integer. Consumes less
|
|
memory compared to `MRB_NO_BOXING` especially on 32-bit
|
|
platforms. `Fixnum` size is 31 bits so some integer values
|
|
does not fit in `Fixnum` integers.
|
|
|
|
## `MRB_NAN_BOXING`
|
|
|
|
Pack `mrb_value` in a floating-point number. Nothing
|
|
changed from previous versions.
|
|
|
|
## `MRB_USE_MALLOC_TRIM`
|
|
|
|
Call `malloc_trim(0)` from mrb_full_gc() if this macro is defined.
|
|
If you are using glibc malloc, this macro could reduce memory consumption.
|
|
|
|
# Command Line Program
|
|
|
|
## `bin/mruby` (by mrbgems/mruby-bin-mruby)
|
|
|
|
The mruby3 now automatically detects `*.mrb` files without the `-b`
|
|
switch. Therefore, it can be mixed with the `*.rb` file in combination
|
|
with the `-r` switch and specified at the same time.
|
|
Here's an example that works fine:
|
|
|
|
```console
|
|
$ bin/mruby app.mrb
|
|
$ bin/mruby -r lib1.mrb -r lib2.rb app.rb
|
|
$ bin/mruby -r lib1.rb -r lib2.rb < app.mrb
|
|
```
|
|
|
|
# Internal Changes
|
|
|
|
## New Instructions
|
|
|
|
`mruby3` introduces a few new instructions.
|
|
|
|
Instructions that access pool[i]/syms[i] where i>255.
|
|
|
|
- `OP_LOADL16`
|
|
- `OP_STRING16`
|
|
- `OP_LOADSYM16`
|
|
|
|
Instructions that load a 32-bit integer.
|
|
|
|
- `OP_LOADI32`
|
|
|
|
Instruction that unwinds jump table for rescue/ensure.
|
|
|
|
- `OP_JMPUW`
|
|
|
|
Renamed from `OP_RAISE`
|
|
|
|
- `OP_RAISEIF`
|
|
|
|
Instruction that is reserved for the future keyword argument support.
|
|
|
|
- OP_SENDVK
|
|
|
|
## Removed Instructions
|
|
|
|
Instructions for old exception handling
|
|
|
|
- `OP_ONERR`
|
|
- `OP_POPERR`
|
|
- `OP_EPUSH`
|
|
- `OP_EPOP`
|
|
|
|
No more operand extension
|
|
|
|
- `OP_EXT1`
|
|
- `OP_EXT2`
|
|
- `OP_EXT3`
|
|
|
|
## Changed Instructions
|
|
|
|
Jump addresses used to be specified by absolute offset from the start of `iseq`. Now they are relative offset from the
|
|
address of the next instruction.
|
|
|
|
## `Random` now use `xoshiro128++`.
|
|
|
|
For better and faster random number generation.
|
|
|
|
## Preallocated Symbol
|
|
|
|
Preallocated symbols are interned at compile-time. They can be accessed via symbols macros (e.g. `MRB_SYM()`).
|
|
|
|
See [Symbols](guides/symbol.md).
|