|
| 1 | +--- |
| 2 | +layout: news_post |
| 3 | +title: "Ruby 3.1.0 Preview 1 ๋ฆด๋ฆฌ์ค" |
| 4 | +author: "naruse" |
| 5 | +translator: "yous" |
| 6 | +date: 2021-11-09 00:00:00 +0000 |
| 7 | +lang: ko |
| 8 | +--- |
| 9 | + |
| 10 | +{% assign release = site.data.releases | where: "version", "3.1.0-preview1" | first %} |
| 11 | + |
| 12 | +Ruby {{ release.version }} ๋ฆด๋ฆฌ์ค๋ฅผ ์๋ฆฌ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. |
| 13 | + |
| 14 | +## YJIT: ์๋ก์ด ์คํ ์ธํ๋ก์ธ์ค JIT ์ปดํ์ผ๋ฌ |
| 15 | + |
| 16 | + |
| 17 | +Ruby 3.1์ Shopify์์ ๊ฐ๋ฐํ ์๋ก์ด ์ธํ๋ก์ธ์ค JIT ์ปดํ์ผ๋ฌ์ธ YJIT๋ฅผ ํฌํจํฉ๋๋ค. |
| 18 | + |
| 19 | +[Ruby 2.6์ด 2018๋
๋์ MJIT๋ฅผ ๋ฐํ](https://www.ruby-lang.org/en/news/2018/12/25/ruby-2-6-0-released/)ํ ๋ค, ์ฑ๋ฅ์ ๊ต์ฅํ ํฅ์๋์์ผ๋ฉฐ [์๋
์ ๋๋์ด Ruby3x3](https://www.ruby-lang.org/ko/news/2020/12/25/ruby-3-0-0-released/)์ ๋ฌ์ฑํ์ต๋๋ค. ํ์ง๋ง Optcarrot์ด ์ธ์์ ์ธ ์๋ ํฅ์์ ๋ณด์ฌ์คฌ์์๋ JIT๋ ์ค์ ์ธ๊ณ์ ๋น์ฆ๋์ค ์ ํ๋ฆฌ์ผ์ด์
๋ค์ ๋์์ ์ฃผ์ง๋ ๋ชปํ์ต๋๋ค. |
| 20 | + |
| 21 | +์ต๊ทผ์ Shopify๋ ์์ฌ Rails ์ ํ๋ฆฌ์ผ์ด์
์๋๋ฅผ ๋์ด๊ธฐ ์ํด Ruby์ ๋ง์ ๊ธฐ์ฌ๋ฅผ ํ์ต๋๋ค. YJIT๋ ์ค์ํ ๊ธฐ์ฌ๋ก, Rails ์ ํ๋ฆฌ์ผ์ด์
์ ์ฑ๋ฅ ํฅ์์ ๋ชฉํ๋ก ํฉ๋๋ค. |
| 22 | + |
| 23 | +MJIT๊ฐ ๋ฉ์๋ ๊ธฐ๋ฐ์ JIT ์ปดํ์ผ๋ฌ๊ณ ์ธ๋ถ C ์ปดํ์ผ๋ฌ๋ฅผ ์ด์ฉํ๋ ๋ฐ๋ฉด, YJIT๋ ๊ธฐ๋ณธ ๋ธ๋ก ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ด์ฉํ๋ฉฐ JIT ์ปดํ์ผ๋ฌ๋ฅผ ํฌํจํฉ๋๋ค. ๊ฒ์ผ๋ฅธ ๊ธฐ๋ณธ ๋ธ๋ก ๋ฒ์ ๊ด๋ฆฌ(Lazy Basic Block Versioning, LBBV)๋ฅผ ํตํด ์ฐ์ ๋ฉ์๋์ ์์ ๋ถ๋ถ์ ์ปดํ์ผํ๊ณ ์ธ์์ ๋ณ์์ ํ์
์ด ๋์ ์ผ๋ก ๊ฒฐ์ ๋๋ฉด ์ ์ง์ ์ผ๋ก ๋๋จธ์ง ๋ถ๋ถ์ ์ปดํ์ผํฉ๋๋ค. ์์ธํ ์ค๋ช
์ [YJIT: CRuby๋ฅผ ์ํ ๊ธฐ๋ณธ ๋ธ๋ก ๋ฒ์ ๊ด๋ฆฌ JIT ์ปดํ์ผ๋ฌ](https://dl.acm.org/doi/10.1145/3486606.3486781)๋ฅผ ์ฐธ๊ณ ํ์ธ์. |
| 24 | + |
| 25 | +์ด ๊ธฐ์ ์ ์ด์ฉํ์ฌ, YJIT๋ ๋๋ถ๋ถ์ ํ์ค ์ธ๊ณ ์ํํธ์จ์ด์ ๋น ๋ฅธ ์ค๋น ์๊ฐ๊ณผ ์ฑ๋ฅ ํฅ์์ ๊ฐ์ ธ๋ค์ฃผ์ด railsbench์์๋ ์ต๋ 22%, liquid-render์์๋ ์ต๋ 39%์ ์ฑ๋ฅ ํฅ์์ด ์ด๋ฃจ์ด์ก์ต๋๋ค. |
| 26 | + |
| 27 | +<!-- ่ฉฆใไบบๅใใฎใ็ฅใใ --> |
| 28 | + |
| 29 | +YJIT๋ ์์ง ์คํ์ ์ธ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋นํ์ฑํ๋์ด ์์ต๋๋ค. ๋ง์ฝ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด `--yjit` ๋ช
๋ น์ด ์ต์
์ ํตํด ํ์ฑํํ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์์ง์ x86-64 ํ๋ซํผ์ macOS ๋ฐ Linux๋ก๋ง ํ์ ๋์ด ์์ต๋๋ค. |
| 30 | + |
| 31 | +* <https://bugs.ruby-lang.org/issues/18229> |
| 32 | +* <https://shopify.engineering/yjit-just-in-time-compiler-cruby> |
| 33 | +* <https://www.youtube.com/watch?v=PBVLf3yfMs8> |
| 34 | + |
| 35 | +## debug gem: ์๋ก์ด ๋๋ฒ๊ฑฐ |
| 36 | + |
| 37 | +์๋ก์ด ๋๋ฒ๊ฑฐ์ธ [debug.gem](https://github.com/ruby/debug)์ด ํฌํจ๋ฉ๋๋ค. debug.gem์ ๋น ๋ฅธ ๋๋ฒ๊ฑฐ ๊ตฌํ์ฒด๋ก ์๊ฒฉ ๋๋ฒ๊น
, REPL ์์, IDE(VSCode) ํตํฉ ๋ฑ์ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. `lib/debug.rb` ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ฒดํฉ๋๋ค. |
| 38 | + |
| 39 | +## error_highlight: ๋ฐฑํธ๋ ์ด์ค์์์ ์ธ๋ฐํ ์๋ฌ ์์น |
| 40 | + |
| 41 | +๋นํธ์ธ gem์ธ error_highlight๊ฐ ๋์
๋์์ต๋๋ค. ๋ฐฑํธ๋ ์ด์ค์ ์ธ๋ฐํ ์๋ฌ ์์น๋ฅผ ์ถ๊ฐํฉ๋๋ค. |
| 42 | + |
| 43 | +``` |
| 44 | +$ ruby test.rb |
| 45 | +test.rb:1:in `<main>': undefined method `time' for 1:Integer (NoMethodError) |
| 46 | +
|
| 47 | +1.time {} |
| 48 | + ^^^^^ |
| 49 | +Did you mean? times |
| 50 | +``` |
| 51 | + |
| 52 | +์ด gem์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด ์์ต๋๋ค. `--disable-error_highlight` ๋ช
๋ น์ด ์ต์
์ ํตํด ๋นํ์ฑํํ ์ ์์ต๋๋ค. ์์ธํ ์ค๋ช
์ [error_highlight ์ ์ฅ์](https://github.com/ruby/error_highlight)๋ฅผ ์ฐธ๊ณ ํ์ธ์. |
| 53 | + |
| 54 | +## Irb ๊ฐ์ |
| 55 | + |
| 56 | +๋ค์ ํ๋ฆฌ๋ทฐ์์ ์ค๋ช
๋ ์์ ์
๋๋ค. |
| 57 | + |
| 58 | +## ๋ค๋ฅธ ์ฃผ๋ชฉํ ๋งํ ์๋ก์ด ๊ธฐ๋ฅ |
| 59 | + |
| 60 | +### ์ธ์ด |
| 61 | + |
| 62 | +* ํด์ ๋ฆฌํฐ๋ด๊ณผ ํค์๋ ์ธ์์ ๊ฐ์ ์๋ตํ ์ ์์ต๋๋ค. [[Feature #14579]](https://bugs.ruby-lang.org/issues/14579) |
| 63 | + * `{x:, y:}`๋ `{x: x, y: y}`์ ํธ์ ๋ฌธ๋ฒ์
๋๋ค. |
| 64 | + * `foo(x:, y:)`๋ `foo(x: x, y: y)`์ ํธ์ ๋ฌธ๋ฒ์
๋๋ค. |
| 65 | + |
| 66 | +* ํจํด ๋งค์นญ์์ ํ ์ฐ์ฐ์(`^`)์ ํํ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. [[Feature #17411]](https://bugs.ruby-lang.org/issues/17411) |
| 67 | + |
| 68 | +```ruby |
| 69 | +Prime.each_cons(2).lazy.find_all{_1 in [n, ^(n + 2)]}.take(3).to_a |
| 70 | +#=> [[3, 5], [5, 7], [11, 13]] |
| 71 | +``` |
| 72 | + |
| 73 | + |
| 74 | +### RBS |
| 75 | + |
| 76 | +RBS๋ Ruby ํ๋ก๊ทธ๋จ์ ๊ตฌ์กฐ๋ฅผ ์ค๋ช
ํ๊ธฐ ์ํ ์ธ์ด์
๋๋ค. ์์ธํ ์ค๋ช
์ [RBS ์ ์ฅ์](https://github.com/ruby/rbs)๋ฅผ ์ฐธ๊ณ ํ์ธ์. |
| 77 | + |
| 78 | +Ruby 3.0.0 ์ดํ์ ๋ณ๊ฒฝ ์ฌํญ: |
| 79 | + |
| 80 | +* `rbs collection`์ด gem๋ค์ RBS๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ๋์
๋์์ต๋๋ค. ([๋ฌธ์](https://github.com/ruby/rbs/blob/master/docs/collection.md)) |
| 81 | +* ๋นํธ์ธ ๋ฐ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ง์ ์๊ทธ๋์ฒ๊ฐ ์ถ๊ฐ๋๊ฑฐ๋ ๊ฐฑ์ ๋์์ต๋๋ค. |
| 82 | +* ๋ค์์ ๋ฒ๊ทธ ์์ ๊ณผ ์ฑ๋ฅ ํฅ์๋ ํฌํจํฉ๋๋ค. |
| 83 | + |
| 84 | +๋ ๋ง์ ์ ๋ณด๋ [CHANGELOG.md](https://github.com/ruby/rbs/blob/master/CHANGELOG.md)๋ฅผ ์ฐธ๊ณ ํ์ธ์. |
| 85 | + |
| 86 | +### TypeProf |
| 87 | + |
| 88 | +TypeProf๋ Ruby๋ฅผ ์ํ ์ ์ ํ์
๋ถ์๊ธฐ์
๋๋ค. ํ์
์ ๊ธฐ์ ํ์ง ์์ Ruby ์ฝ๋๋ก๋ถํฐ RBS์ ํ๋กํ ํ์
์ ์์ฑํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ [๋ฌธ์](https://github.com/ruby/typeprof/blob/master/doc/doc.md)๋ฅผ ์ฐธ๊ณ ํ์ธ์. |
| 89 | + |
| 90 | +Ruby 3.0.0 ์ดํ์ ๋ณ๊ฒฝ ์ฌํญ: |
| 91 | + |
| 92 | +* [์คํ์ ์ธ IDE ์ง์](https://github.com/ruby/typeprof/blob/master/doc/ide.md)์ด ๊ตฌํ๋์์ต๋๋ค. |
| 93 | +* ๋ค์์ ๋ฒ๊ทธ ์์ ๊ณผ ์ฑ๋ฅ ํฅ์์ ํฌํจํฉ๋๋ค. |
| 94 | + |
| 95 | +## ์ฑ๋ฅ ํฅ์ |
| 96 | + |
| 97 | +* MJIT |
| 98 | + * Rails์ ๊ฐ์ ์์
๋์ ์ํ์ฌ `--jit-max-cache`์ ๊ธฐ๋ณธ๊ฐ์ด 100์์ 10000์ผ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค. |
| 99 | + JIT ์ปดํ์ผ๋ฌ๋ ๋ ์ด์ 1000๊ฐ์ ๋ช
๋ น์ด๋ณด๋ค ๊ธด ๋ฉ์๋์ ์ปดํ์ผ์ ๊ฑด๋๋ฐ์ง ์์ต๋๋ค. |
| 100 | + * Rails์ Zeitwerk๋ฅผ ์ง์ํ๊ธฐ ์ํด, ํด๋์ค ์ด๋ฒคํธ์ TracePoint๊ฐ ํ์ฑํ๋์์ |
| 101 | + ๋ JIT๋ ์ฝ๋๋ฅผ ๋ ์ด์ ์ทจ์ํ์ง ์์ต๋๋ค. |
| 102 | + |
| 103 | +## ๊ทธ ์ธ 3.0 ์ดํ ์ฃผ๋ชฉํ ๋งํ ๋ณํ |
| 104 | + |
| 105 | +* ํ ์ค ํจํด ๋งค์นญ(์: `ary => [x, y, z]`)์ ๋ ์ด์ ์คํ์ ์ด์ง ์์ต๋๋ค. |
| 106 | +* ๋ค์ค ๋์
์ ํ๊ฐ ์์๊ฐ ์ด์ง ๋ณ๊ฒฝ๋์์ต๋๋ค. [[Bug #4443]](https://bugs.ruby-lang.org/issues/4443) |
| 107 | + * `foo[0], bar[0] = baz, qux`๋ Ruby 3.0์์ `baz`, `qux`, `foo`, `bar` ์์ผ๋ก ํ๊ฐ๋์์ต๋๋ค. Ruby 3.1์์ `foo`, `bar`, `baz`, `qux` ์์ผ๋ก ํ๊ฐ๋ฉ๋๋ค. |
| 108 | +* ๋ณ์ ๋๋น ํ ๋น: ๋ฌธ์์ด (์คํ์ ) [[Bug #18239]](https://bugs.ruby-lang.org/issues/18239) |
| 109 | + |
| 110 | +### ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์
๋ฐ์ดํธ |
| 111 | + |
| 112 | +* ๋ค์ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์
๋ฐ์ดํธ๋์์ต๋๋ค. |
| 113 | + * RubyGems |
| 114 | + * Bundler |
| 115 | + * RDoc 6.4.0 |
| 116 | + * ReLine |
| 117 | + * JSON 2.6.0 |
| 118 | + * Psych 4.0.2 |
| 119 | + * FileUtils 1.6.0 |
| 120 | + * Fiddle |
| 121 | + * StringIO 3.0.1 |
| 122 | + * IO::Console 0.5.9 |
| 123 | + * IO::Wait 0.2.0 |
| 124 | + * CSV |
| 125 | + * Etc 1.3.0 |
| 126 | + * Date 3.2.0 |
| 127 | + * Zlib 2.1.1 |
| 128 | + * StringScanner |
| 129 | + * IpAddr |
| 130 | + * Logger 1.4.4 |
| 131 | + * OStruct 0.5.0 |
| 132 | + * Irb |
| 133 | + * Racc 1.6.0 |
| 134 | + * Delegate 0.2.0 |
| 135 | + * Benchmark 0.2.0 |
| 136 | + * CGI 0.3.0 |
| 137 | + * Readline(C-ext) 0.1.3 |
| 138 | + * Timeout 0.2.0 |
| 139 | + * YAML 0.2.0 |
| 140 | + * URI 0.11.0 |
| 141 | + * OpenSSL |
| 142 | + * DidYouMean |
| 143 | + * Weakref 0.1.1 |
| 144 | + * Tempfile 0.1.2 |
| 145 | + * TmpDir 0.1.2 |
| 146 | + * English 0.7.1 |
| 147 | + * Net::Protocol 0.1.2 |
| 148 | + * Net::Http 0.2.0 |
| 149 | + * BigDecimal |
| 150 | + * OptionParser 0.2.0 |
| 151 | + * Set |
| 152 | + * Find 0.1.1 |
| 153 | + * Rinda 0.1.1 |
| 154 | + * Erb |
| 155 | + * NKF 0.1.1 |
| 156 | + * Base64 0.1.1 |
| 157 | + * OpenUri 0.2.0 |
| 158 | + * SecureRandom 0.1.1 |
| 159 | + * Resolv 0.2.1 |
| 160 | + * Resolv::Replace 0.1.0 |
| 161 | + * Time 0.2.0 |
| 162 | + * PP 0.2.1 |
| 163 | + * Prettyprint 0.1.1 |
| 164 | + * Drb 2.1.0 |
| 165 | + * Pathname 0.2.0 |
| 166 | + * Digest 3.1.0.pre2 |
| 167 | + * Un 0.2.0 |
| 168 | +* ๋ค์ ๋ด์ฅ gem์ด ์
๋ฐ์ดํธ๋์์ต๋๋ค. |
| 169 | + * minitest 5.14.4 |
| 170 | + * power_assert 2.0.1 |
| 171 | + * rake 13.0.6 |
| 172 | + * test-unit 3.5.0 |
| 173 | + * rbs 1.6.2 |
| 174 | + * typeprof 0.20.0 |
| 175 | +* ๋ค์ ๊ธฐ๋ณธ gem์ ์ด์ ๋ด์ฅ gem์
๋๋ค. |
| 176 | + * net-ftp |
| 177 | + * net-imap |
| 178 | + * net-pop |
| 179 | + * net-smtp |
| 180 | + * matrix |
| 181 | + * prime |
| 182 | + |
| 183 | +๋ ์์ธํ ๋ด์ฉ์ [NEWS](https://github.com/ruby/ruby/blob/{{ release.tag }}/NEWS.md)๋ |
| 184 | +[์ปค๋ฐ ๋ก๊ทธ](https://github.com/ruby/ruby/compare/v3_0_0...{{ release.tag }})๋ฅผ |
| 185 | +ํ์ธํด์ฃผ์ธ์. |
| 186 | + |
| 187 | +์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ๋ผ, 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)๊ฐ |
| 188 | +์ด๋ฃจ์ด์ก์ต๋๋ค! |
| 189 | + |
| 190 | +## ๋ค์ด๋ก๋ |
| 191 | + |
| 192 | +* <{{ release.url.gz }}> |
| 193 | + |
| 194 | + SIZE: {{ release.size.gz }} |
| 195 | + SHA1: {{ release.sha1.gz }} |
| 196 | + SHA256: {{ release.sha256.gz }} |
| 197 | + SHA512: {{ release.sha512.gz }} |
| 198 | + |
| 199 | +* <{{ release.url.xz }}> |
| 200 | + |
| 201 | + SIZE: {{ release.size.xz }} |
| 202 | + SHA1: {{ release.sha1.xz }} |
| 203 | + SHA256: {{ release.sha256.xz }} |
| 204 | + SHA512: {{ release.sha512.xz }} |
| 205 | + |
| 206 | +* <{{ release.url.zip }}> |
| 207 | + |
| 208 | + SIZE: {{ release.size.zip }} |
| 209 | + SHA1: {{ release.sha1.zip }} |
| 210 | + SHA256: {{ release.sha256.zip }} |
| 211 | + SHA512: {{ release.sha512.zip }} |
| 212 | + |
| 213 | +## Ruby๋ |
| 214 | + |
| 215 | +Ruby๋ 1993๋
์ Matz(๋ง์ธ ๋ชจํ ์ ํคํ๋ก) ์จ๊ฐ ์ฒ์ ๊ฐ๋ฐํ๊ณ , |
| 216 | +ํ์ฌ๋ ์คํ ์์ค๋ก์ ๊ฐ๋ฐ๋๊ณ ์์ต๋๋ค. ์ฌ๋ฌ ํ๋ซํผ์์ ๋์ํ๋ฉฐ, |
| 217 | +ํนํ ์น ๊ฐ๋ฐ์์ ์ ์ธ๊ณ์ ์ผ๋ก ์ด์ฉ๋๊ณ ์์ต๋๋ค. |
0 commit comments