|
| 1 | +--- |
| 2 | +layout: news_post |
| 3 | +title: "Ruby 3.1.0 Preview 1 リリース" |
| 4 | +author: "naruse" |
| 5 | +translator: "jinroq" |
| 6 | +date: 2021-11-09 00:00:00 +0000 |
| 7 | +lang: ja |
| 8 | +--- |
| 9 | + |
| 10 | +{% assign release = site.data.releases | where: "version", "3.1.0-preview1" | first %} |
| 11 | + |
| 12 | +Ruby 3.1 に向けてフィードバックを得るためのリリースである、Ruby {{ release.version }} が公開されました。 |
| 13 | + |
| 14 | +## YJIT: 新しいインプロセス JIT コンパイラ (experimental) |
| 15 | + |
| 16 | +Ruby 3.1 には、Shopify 社が開発した新しいインプロセス JIT コンパイラである YJIT をマージしています。 |
| 17 | + |
| 18 | +[2018 年に Ruby 2.6 が MJIT を導入](https://www.ruby-lang.org/en/news/2018/12/25/ruby-2-6-0-released/)して以降、パフォーマンスは大幅に向上し、ついに[昨年 Ruby3x3 を達成しました](https://www.ruby-lang.org/en/news/2020/12/25/ruby-3-0-0-released/)。しかし、この JIT は Optcarrot では目覚ましい速度改善を示したものの、実世界のプロダクトで運用するには厳しいものでした。 |
| 19 | + |
| 20 | +近年 Shopify 社は Rails アプリケーションを高速化するために Ruby へ多くの改善をしてくれました。その中でも YJIT は重要な貢献であり、また、Rails アプリケーションのパフォーマンス向上を目的としています。 |
| 21 | + |
| 22 | +MJIT はメソッドベースの JIT コンパイラであり、外部 C コンパイラを使用します。一方、YJIT は Basic Block Versioning を使用し、その中に JIT コンパイラを含みます。 Lazy Basic Block Versioning(LBBV)では、最初にメソッドの先頭をコンパイルし、引数と変数の型が動的に決定されると、残りをインクリメンタルにコンパイルします。詳細な概要については [YJIT: a basic block versioning JIT compiler for CRuby](https://dl.acm.org/doi/10.1145/3486606.3486781) を参照してください。 |
| 23 | + |
| 24 | +この技術により、YJIT は実世界の多くのプロダクトで高速な起動時間とパフォーマンス向上の両方を実現しています。railsbench 上で 22%、liquid-render 上で 39% の改善を実現しています。 |
| 25 | + |
| 26 | +<!-- 試す人向けのお知らせ --> |
| 27 | + |
| 28 | +YJIT はまだ実験的な機能であるため、デフォルトでは無効になっています。使用するにはコマンドラインオプション `--yjit` を指定して YJIT を有効にします。また YJIT が仕様できる環境は、現時点では x86-64 プラットフォーム搭載の macOS および Linux に限定されています。 |
| 29 | + |
| 30 | +* [https://bugs.ruby-lang.org/issues/18229](https://bugs.ruby-lang.org/issues/18229) |
| 31 | +* [https://shopify.engineering/yjit-just-in-time-compiler-cruby](https://shopify.engineering/yjit-just-in-time-compiler-cruby) |
| 32 | +* [https://www.youtube.com/watch?v=PBVLf3yfMs8](https://www.youtube.com/watch?v=PBVLf3yfMs8) |
| 33 | + |
| 34 | +## debug gem: 新しいデバッガ |
| 35 | + |
| 36 | +新しいデバッガ [debug.gem](https://github.com/ruby/debug) がバンドルされています。 debug.gem は高速なデバッガであり、リモートデバッグ、色付き REPL、IDE integration(VSCode)など多くの機能を提供します。これは標準添付ライブラリの `lib/debug.rb` に置き換えられます。 |
| 37 | + |
| 38 | +## error_highlight: バックトレース内でさらに詳細なエラー箇所を示す機能 |
| 39 | + |
| 40 | +組み込み gem である error_highlight が導入されました。バックトレース内でさらに詳細なエラー箇所を示すことができます: |
| 41 | + |
| 42 | +``` |
| 43 | +$ ruby test.rb |
| 44 | +test.rb:1:in `<main>': undefined method `time' for 1:Integer (NoMethodError) |
| 45 | +
|
| 46 | +1.time {} |
| 47 | + ^^^^^ |
| 48 | +Did you mean? times |
| 49 | +``` |
| 50 | + |
| 51 | +この gem はデフォルトで有効になっています。コマンドラインオプション `--disable-error_highlight` を使用して無効にできます。詳細は[リポジトリ](https://github.com/ruby/error_highlight)を参照してください。 |
| 52 | + |
| 53 | +## Irb の改善 |
| 54 | + |
| 55 | +次の preview 版で説明します。 |
| 56 | + |
| 57 | +## その他の主要な新機能 |
| 58 | + |
| 59 | +### 言語仕様 |
| 60 | + |
| 61 | +* ハッシュリテラルとキーワード引数の値は省略できます [Feature #14579] |
| 62 | + * `{x:, y:}` は `{x: x, y: y}` の糖衣構文です |
| 63 | + * `foo(x:, y:)` は `foo(x: x, y: y)` の糖衣構文です |
| 64 | + |
| 65 | +* パターンマッチングのピン演算子が式を受け取るようになりました [Feature #17411] |
| 66 | + |
| 67 | +```ruby |
| 68 | +Prime.each_cons(2).lazy.find_all{_1 in [n, ^(n + 2)]}.take(3).to_a |
| 69 | +#=> [[3, 5], [5, 7], [11, 13]] |
| 70 | +``` |
| 71 | + |
| 72 | +### RBS |
| 73 | + |
| 74 | +RBS は Ruby プログラムの構造を記述するための言語です。詳細は[リポジトリ](https://github.com/ruby/rbs)を参照してください。 |
| 75 | + |
| 76 | +Ruby 3.0.0 からの変更点: |
| 77 | + |
| 78 | +* gem の RBS を管理する `rbs collection` が導入されています [[doc]](https://github.com/ruby/rbs/blob/master/docs/collection.md) |
| 79 | +* 組み込みライブラリおよび標準添付ライブラリの多くのシグネチャが追加/更新されています |
| 80 | +* 多くのバグ修正とパフォーマンスの改善も含まれています |
| 81 | + |
| 82 | +詳細は [CHANGELOG.md](https://github.com/ruby/rbs/blob/master/CHANGELOG.md) を参照してください。 |
| 83 | + |
| 84 | +### TypeProf |
| 85 | + |
| 86 | +TypeProf は Ruby の静的型解析器です。型注釈のない Ruby コードから RBS のプロトタイプを生成します。詳細は[ドキュメント](https://github.com/ruby/typeprof/blob/master/doc/doc.md)を参照してください。 |
| 87 | + |
| 88 | +Ruby 3.0.0 からの変更点: |
| 89 | + |
| 90 | +* [IDE サポート](https://github.com/ruby/typeprof/blob/master/doc/ide.md)が実装されました (Experimental) |
| 91 | +* 多くのバグ修正とパフォーマンスの改善も含まれています |
| 92 | + |
| 93 | +## パフォーマンスの改善 |
| 94 | + |
| 95 | +* MJIT |
| 96 | + * Rails のようなワークロードのために、`--jit-max-cache` のデフォルト値を 100 から 10000 に変更しています。 |
| 97 | + JIT コンパイラは 1000 命令列長より長いメソッドのコンパイルをスキップしなくなりました |
| 98 | + * Rails の Zeitwerk モードをサポートするために、クラスイベントで TracePoint が有効になっている場合に JIT コンパイルされたコードをキャンセルしなくなりました |
| 99 | + |
| 100 | +## その他の注目すべき 3.0 からの変更点 |
| 101 | + |
| 102 | +* 1 行パターンマッチ(例: `ary => [x, y, z]`)が experimental ではなくなりました |
| 103 | +* 多重代入の評価順序が若干変更されました [[Bug #4443]](https://bugs.ruby-lang.org/issues/4443) |
| 104 | + * Ruby 3.0では `foo[0], bar[0] = baz, qux` は `baz`, `qux`,`foo`, `bar` の順に評価されていました。Ruby 3.1 からは `foo`,`bar`, `baz`,`qux` の順に評価されるようになります |
| 105 | +* 文字列の可変幅割り当て (experimental) [[Bug #18239]](https://bugs.ruby-lang.org/issues/18239) |
| 106 | + |
| 107 | +### 標準添付ライブラリの更新 |
| 108 | + |
| 109 | +* いくつかの標準添付ライブラリが更新されています |
| 110 | + * RubyGems |
| 111 | + * Bundler |
| 112 | + * RDoc 6.4.0 |
| 113 | + * ReLine |
| 114 | + * JSON 2.6.0 |
| 115 | + * Psych 4.0.2 |
| 116 | + * FileUtils 1.6.0 |
| 117 | + * Fiddle |
| 118 | + * StringIO 3.0.1 |
| 119 | + * IO::Console 0.5.9 |
| 120 | + * IO::Wait 0.2.0 |
| 121 | + * CSV |
| 122 | + * Etc 1.3.0 |
| 123 | + * Date 3.2.0 |
| 124 | + * Zlib 2.1.1 |
| 125 | + * StringScanner |
| 126 | + * IpAddr |
| 127 | + * Logger 1.4.4 |
| 128 | + * OStruct 0.5.0 |
| 129 | + * Irb |
| 130 | + * Racc 1.6.0 |
| 131 | + * Delegate 0.2.0 |
| 132 | + * Benchmark 0.2.0 |
| 133 | + * CGI 0.3.0 |
| 134 | + * Readline(C-ext) 0.1.3 |
| 135 | + * Timeout 0.2.0 |
| 136 | + * YAML 0.2.0 |
| 137 | + * URI 0.11.0 |
| 138 | + * OpenSSL |
| 139 | + * DidYouMean |
| 140 | + * Weakref 0.1.1 |
| 141 | + * Tempfile 0.1.2 |
| 142 | + * TmpDir 0.1.2 |
| 143 | + * English 0.7.1 |
| 144 | + * Net::Protocol 0.1.2 |
| 145 | + * Net::Http 0.2.0 |
| 146 | + * BigDecimal |
| 147 | + * OptionParser 0.2.0 |
| 148 | + * Set |
| 149 | + * Find 0.1.1 |
| 150 | + * Rinda 0.1.1 |
| 151 | + * Erb |
| 152 | + * NKF 0.1.1 |
| 153 | + * Base64 0.1.1 |
| 154 | + * OpenUri 0.2.0 |
| 155 | + * SecureRandom 0.1.1 |
| 156 | + * Resolv 0.2.1 |
| 157 | + * Resolv::Replace 0.1.0 |
| 158 | + * Time 0.2.0 |
| 159 | + * PP 0.2.1 |
| 160 | + * Prettyprint 0.1.1 |
| 161 | + * Drb 2.1.0 |
| 162 | + * Pathname 0.2.0 |
| 163 | + * Digest 3.1.0.pre2 |
| 164 | + * Un 0.2.0 |
| 165 | +* 以下のバンドルされた gems が更新されています |
| 166 | + * minitest 5.14.4 |
| 167 | + * power_assert 2.0.1 |
| 168 | + * rake 13.0.6 |
| 169 | + * test-unit 3.5.0 |
| 170 | + * rbs 1.6.2 |
| 171 | + * typeprof 0.20.0 |
| 172 | +* 以下のデフォルト gems がバンドルされた gem になりました |
| 173 | + * net-ftp |
| 174 | + * net-imap |
| 175 | + * net-pop |
| 176 | + * net-smtp |
| 177 | + * matrix |
| 178 | + * prime |
| 179 | + |
| 180 | +詳細は [NEWS](https://github.com/ruby/ruby/blob/{{ release.tag }}/NEWS.md) か [commit logs](https://github.com/ruby/ruby/compare/v3_0_0...{{ release.tag }}) を参照してください。 |
| 181 | + |
| 182 | +なお、こうした変更により、Ruby 3.0.0 以降では [{{ release.stats.files_changed }} 個のファイルに変更が加えられ、 {{ release.stats.insertions }} 行の追加と {{ release.stats.deletions }} 行の削除が行われました](https://github.com/ruby/ruby/compare/v3_0_0...{{ release.tag }}#file_bucket)! |
| 183 | + |
| 184 | +## ダウンロード |
| 185 | + |
| 186 | +* <{{ release.url.gz }}> |
| 187 | + |
| 188 | + SIZE: {{ release.size.gz }} |
| 189 | + SHA1: {{ release.sha1.gz }} |
| 190 | + SHA256: {{ release.sha256.gz }} |
| 191 | + SHA512: {{ release.sha512.gz }} |
| 192 | + |
| 193 | +* <{{ release.url.xz }}> |
| 194 | + |
| 195 | + SIZE: {{ release.size.xz }} |
| 196 | + SHA1: {{ release.sha1.xz }} |
| 197 | + SHA256: {{ release.sha256.xz }} |
| 198 | + SHA512: {{ release.sha512.xz }} |
| 199 | + |
| 200 | +* <{{ release.url.zip }}> |
| 201 | + |
| 202 | + SIZE: {{ release.size.zip }} |
| 203 | + SHA1: {{ release.sha1.zip }} |
| 204 | + SHA256: {{ release.sha256.zip }} |
| 205 | + SHA512: {{ release.sha512.zip }} |
| 206 | + |
| 207 | +## Ruby とは |
| 208 | + |
| 209 | +Ruby はまつもとゆきひろ(Matz)によって 1993 年に開発が始められ、今もオープンソースソフトウェアとして開発が続けられています。 |
| 210 | +Ruby は様々なプラットフォームで動き、世界中で、特に Web アプリケーション開発のために使われています。 |
0 commit comments