|
| 1 | +--- |
| 2 | +layout: news_post |
| 3 | +title: "Ruby 3.1.0 Dirilis" |
| 4 | +author: "naruse" |
| 5 | +translator: "meisyal" |
| 6 | +date: 2021-12-25 00:00:00 +0000 |
| 7 | +lang: id |
| 8 | +--- |
| 9 | + |
| 10 | +{% assign release = site.data.releases | where: "version", "3.1.0" | first %} |
| 11 | + |
| 12 | +Kami dengan senang hati mengumumkan rilis dari Ruby {{ release.version }}. |
| 13 | +Ruby 3.1 menjaga kompatibilitas dengan Ruby 3.0 dan menambahkan banyak fitur. |
| 14 | + |
| 15 | +## YJIT: Compiler JIT eksperimental baru |
| 16 | + |
| 17 | +Ruby 3.1 menggabungkan YJIT, sebuah *compiler* JIT baru yang dikembangkan oleh |
| 18 | +Shopify. |
| 19 | + |
| 20 | +Sejak [Ruby 2.6 mengenalkan MJIT pada 2018](https://www.ruby-lang.org/en/news/2018/12/25/ruby-2-6-0-released/), |
| 21 | +kinerjanya sangat meningkat dan akhirnya |
| 22 | +[kami mecapai Ruby3x3 tahun lalu](https://www.ruby-lang.org/en/news/2020/12/25/ruby-3-0-0-released/). |
| 23 | +Meskipun *Optcarrot* telah menunjukkan peningkatan luar biasa, JIT belum |
| 24 | +memberikan manfaat untuk aplikasi dunia nyata. |
| 25 | + |
| 26 | +Baru-baru ini Shopify berkontribusi banyak memperbaiki Ruby dengan meningkatkan |
| 27 | +kinerja aplikasi *Rails* mereka. YJIT adalah sebuah kontribusi penting |
| 28 | +dan bertujuan untuk memperbaiki kinerja dari aplikasi *Rails*. |
| 29 | + |
| 30 | +Walaupun MJIT adalah sebuah *method-based compiler* JIT dan menggunakan sebuah |
| 31 | +*compiler* C eksternal, YJIT menggunakan *Basic Block Versioning* dan memasukkan |
| 32 | +*compiler* JIT ke dalamnya. Dengan *Lazy Basic Block Versioning* (LBBV), |
| 33 | +pertama ini akan meng-*compile* awal dari sebuah *method* dan secara bertahap |
| 34 | +meng-*compile* sisanya ketika *argument types* dan variabel ditentukan secara |
| 35 | +dinamis. Lihat |
| 36 | +[YJIT: a basic block versioning JIT compiler for CRuby](https://dl.acm.org/doi/10.1145/3486606.3486781) |
| 37 | +untuk pengenalan. |
| 38 | + |
| 39 | +Dengan teknologi ini, YJIT meraih waktu *warmup* cepat dan peningkatan kinerja |
| 40 | +pada kebanyakan aplikasi dunia nyata hingga 22% pada *railsbench* |
| 41 | +dan 39% pada *liquid-render*. |
| 42 | + |
| 43 | +YJIT merupakan sebuah fitur yang masih eksperimental dan dinonaktifkan secara |
| 44 | +*default*. Jika Anda ingin menggunakannya, tetapkan `--yjit` pada |
| 45 | +opsi *command-line*. Fitur ini terbatas pada *Unix-like platform* dengan |
| 46 | +arsitektur x86-64 saat ini. |
| 47 | + |
| 48 | +* <https://bugs.ruby-lang.org/issues/18229> |
| 49 | +* <https://shopify.engineering/yjit-just-in-time-compiler-cruby> |
| 50 | +* <https://www.youtube.com/watch?v=PBVLf3yfMs8> |
| 51 | + |
| 52 | +## debug gem: Sebuah debugger baru |
| 53 | + |
| 54 | +Sebuah *debugger* yang telah ditulis ulang dengan lengkap |
| 55 | +[debug.gem](https://github.com/ruby/debug) di-*bundle* dengan Ruby. *debug.gem* |
| 56 | +memiliki fitur-fitur berikut: |
| 57 | + |
| 58 | +* Meningkatkan kinerja *debugging* (ini tidak memperlambat aplikasi meskipun dengan *debugger*). |
| 59 | +* Mendukung *remote debugging*. |
| 60 | +* Mendukung *rich debugging frontend* (*VS Code* dan *Chrome browser* yang didukung saat ini). |
| 61 | +* Mendukung *multi-process/multi-thread debugging*. |
| 62 | +* *Colorful* REPL. |
| 63 | +* dan fitur bermanfaat lainnya, seperti *record* & *replay*, *tracing*, dan sebagainya. |
| 64 | + |
| 65 | +<video autoplay="autoplay" controls="controls" muted="muted" width="764" height="510" poster="https://cache.ruby-lang.org/pub/media/ruby310_debug_demo.jpg"> |
| 66 | + <source src="https://cache.ruby-lang.org/pub/media/ruby310_debug_demo.mp4" type="video/mp4"> |
| 67 | +</video> |
| 68 | + |
| 69 | +Ruby telah mem-*bundle* *lib/debug.rb*, tetapi pustaka ini tidak dipelihara dengan |
| 70 | +baik karena memiliki masalah kinerja dan fitur. *debug.gem* menggantikan |
| 71 | +*lib/debug.rb* secara keseluruhan. |
| 72 | + |
| 73 | +## error_highlight: Lokasi fine-grained error pada backtrace |
| 74 | + |
| 75 | +Sebuah *built-in gem*, *error_highlight*, diperkenalkan. *Gem* ini memberikan |
| 76 | +lokasi *fine-grained error* pada *backtrace*: |
| 77 | + |
| 78 | +``` |
| 79 | +$ ruby test.rb |
| 80 | +test.rb:1:in `<main>': undefined method `time' for 1:Integer (NoMethodError) |
| 81 | +
|
| 82 | +1.time {} |
| 83 | + ^^^^^ |
| 84 | +Did you mean? times |
| 85 | +``` |
| 86 | + |
| 87 | +Saat ini, hanya `NameError` yang didukung. |
| 88 | + |
| 89 | +*Gem* ini diaktifkan secara *default*. Anda dapat menonaktikannya dengan |
| 90 | +menggunakan opsi *command-line* `--disable-error_highlight`. |
| 91 | +Lihat [repositori](https://github.com/ruby/error_highlight) untuk detail. |
| 92 | + |
| 93 | +## IRB Autocomplete dan Documentation Display |
| 94 | + |
| 95 | +IRB sekarang memiliki sebuah fitur *autocomplete* di mana Anda dapat mengetik |
| 96 | +kode dan dialog kandidat *autocomplete* akan muncul. Anda bisa menggunakan |
| 97 | +*Tab* dan *Shift+Tab* untuk memilih kandidat ke atas dan ke bawah. |
| 98 | + |
| 99 | +Jika dokumentasi terpasang ketika Anda memilih sebuah kandidat *autocomplete*, |
| 100 | +sebuah dialog akan muncul disamping dialog kandidat *autocomplete*, menampilkan |
| 101 | +bagian dari dokumentasi. Anda dapat membaca dokumentasi sepenuhnya dengan |
| 102 | +menekan *Alt+d*. |
| 103 | + |
| 104 | +<video autoplay="autoplay" controls="controls" muted="muted" width="764" height="510" poster="https://cache.ruby-lang.org/pub/media/ruby310_irb_dialog.png"> |
| 105 | + <source src="https://cache.ruby-lang.org/pub/media/ruby310_irb_dialog.mp4" type="video/mp4"> |
| 106 | +</video> |
| 107 | + |
| 108 | +## Fitur penting lainnya |
| 109 | + |
| 110 | +### Bahasa |
| 111 | + |
| 112 | +* Nilai pada literal *Hash* dan *keyword argument* dapat diabaikan. [[Feature #14579]](https://bugs.ruby-lang.org/issues/14579) |
| 113 | + * `{x:, y:}` adalah sebuah *syntax sugar* dari `{x: x, y: y}`. |
| 114 | + * `foo(x:, y:)` adalah sebuah *syntax sugar* dari `foo(x: x, y: y)`. |
| 115 | + |
| 116 | +* *Pin operator* (`^`) pada *pattern matching* sekarang mengambil sebuah *expression*. [[Feature #17411]](https://bugs.ruby-lang.org/issues/17411) |
| 117 | + |
| 118 | + ```ruby |
| 119 | + Prime.each_cons(2).lazy.find_all{_1 in [n, ^(n + 2)]}.take(3).to_a |
| 120 | + #=> [[3, 5], [5, 7], [11, 13]] |
| 121 | + ``` |
| 122 | + |
| 123 | +* Tanda kurung dapat diabaikan pada *one-line pattern matching*. [[Feature #16182]](https://bugs.ruby-lang.org/issues/16182) |
| 124 | + |
| 125 | + ```ruby |
| 126 | + [0, 1] => _, x |
| 127 | + {y: 2} => y: |
| 128 | + x #=> 1 |
| 129 | + y #=> 2 |
| 130 | + ``` |
| 131 | + |
| 132 | +### RBS |
| 133 | + |
| 134 | +RBS adalah sebuah bahasa untuk mendeskripsikan struktur dari program Ruby. |
| 135 | +Lihat [repositori](https://github.com/ruby/rbs) untuk detail. |
| 136 | + |
| 137 | +Perubahan sejak Ruby 3.0.0: |
| 138 | + |
| 139 | +* Parameter *generic type* dapat dibatasi. ([PR](https://github.com/ruby/rbs/pull/844)) |
| 140 | +* Alias pada *generic type* telah didukung. ([PR](https://github.com/ruby/rbs/pull/823)) |
| 141 | +* `rbs collection` diperkenalkan untuk mengatur *gem* dari RBS. ([doc](https://github.com/ruby/rbs/blob/master/docs/collection.md)) |
| 142 | +* Banyak *signature* pada pustaka *built-in* dan standar ditambahkan/diperbarui. |
| 143 | +* Selain itu, memuat banyak perbaikan *bug* dan peningkatan kinerja. |
| 144 | + |
| 145 | +Lihat [RBS changelog](https://github.com/ruby/rbs/blob/master/CHANGELOG.md) |
| 146 | +untuk lebih detail. |
| 147 | + |
| 148 | +### TypeProf |
| 149 | + |
| 150 | +*TypeProf* adalah sebuah *static type analyzer* untuk Ruby. |
| 151 | +*TypeProf* menghasilkan sebuah prototipe RBS dari kode Ruby yang |
| 152 | +*non-type-annotated*. |
| 153 | +Lihat [dokumen](https://github.com/ruby/typeprof/blob/master/doc/doc.md) |
| 154 | +untuk detail. |
| 155 | + |
| 156 | +Perubahan utama sejak Ruby 3.0.0 adalah sebuah dukungan IDE eksperimental yang |
| 157 | +dikenal dengan "TypeProf for IDE". |
| 158 | + |
| 159 | + |
| 160 | + |
| 161 | +*VS Code extension* menampilkan sebuah perkiraan (atau secara langsung tertulis |
| 162 | +pada sebuah berkas RBS) *method signature* di atas setiap definisi *method*, |
| 163 | +menggarisbawahi kode yang mungkin menyebabkan *name error* atau *type error* |
| 164 | +dengan garis merah, dan melengkapi nama *method* (seperti menampilkan kandidat |
| 165 | +*method*). |
| 166 | +Lihat [dokumen](https://github.com/ruby/typeprof/blob/master/doc/ide.md) |
| 167 | +untuk detail. |
| 168 | + |
| 169 | +Rilis ini juga berisi banyak perbaikan *bug* dan peningkatan kinerja. |
| 170 | + |
| 171 | +## Peningkatan kinerja |
| 172 | + |
| 173 | +* MJIT |
| 174 | + * Untuk beban kerja seperti *Rails*, *default* `--jit-max-cache` diubah dari |
| 175 | + 100 menjadi 10000. *Compiler* JIT tidak lagi mengabaikan *compilation* |
| 176 | + dari *method* yang memiliki panjang lebih dari 1000 instruksi. |
| 177 | + * Untuk mendukung *Zeitwerk* dari *Rails*, *JIT-ed code* tidak lagi dibatalkan |
| 178 | + ketika sebuah *TracePoint* untuk *class event* diaktifkan. |
| 179 | + |
| 180 | +## Perubahan penting lainnya sejak 3.0 |
| 181 | + |
| 182 | +* *One-line pattern matching*, seperti `ary => [x, y, z]` tidak lagi eksperimental. |
| 183 | +* *Multiple assignment evaluation order* telah diubah sedikit. [[Bug #4443]](https://bugs.ruby-lang.org/issues/4443) |
| 184 | + * `foo[0], bar[0] = baz, qux` sebelumnya diproses dengan urutan `baz`, `qux`, |
| 185 | + `foo`, dan kemudian `bar` pada Ruby 3.0. Pada Ruby 3.1, ini diproses dengan |
| 186 | + urutan `foo`, `bar`, `baz`, dan kemudian `qux`. |
| 187 | +* *Variable Width Allocation: Strings* (eksperimental) [[Bug #18239]](https://bugs.ruby-lang.org/issues/18239) |
| 188 | + |
| 189 | +* *Psych* 4.0 mengubah `Psych.load` untuk menggunakan `safe_load` secara *default*. |
| 190 | + Anda mungkin perlu menggunakan *Psynch* 3.3.2 untuk menggunakan fitur ini. |
| 191 | + [[Bug #17866]](https://bugs.ruby-lang.org/issues/17866) |
| 192 | + |
| 193 | +### Pembaruan pustaka standar |
| 194 | + |
| 195 | +* *Default gem* berikut telah diperbarui. |
| 196 | + * RubyGems 3.3.3 |
| 197 | + * base64 0.1.1 |
| 198 | + * benchmark 0.2.0 |
| 199 | + * bigdecimal 3.1.1 |
| 200 | + * bundler 2.3.3 |
| 201 | + * cgi 0.3.1 |
| 202 | + * csv 3.2.2 |
| 203 | + * date 3.2.2 |
| 204 | + * did_you_mean 1.6.1 |
| 205 | + * digest 3.1.0 |
| 206 | + * drb 2.1.0 |
| 207 | + * erb 2.2.3 |
| 208 | + * error_highlight 0.3.0 |
| 209 | + * etc 1.3.0 |
| 210 | + * fcntl 1.0.1 |
| 211 | + * fiddle 1.1.0 |
| 212 | + * fileutils 1.6.0 |
| 213 | + * find 0.1.1 |
| 214 | + * io-console 0.5.10 |
| 215 | + * io-wait 0.2.1 |
| 216 | + * ipaddr 1.2.3 |
| 217 | + * irb 1.4.1 |
| 218 | + * json 2.6.1 |
| 219 | + * logger 1.5.0 |
| 220 | + * net-http 0.2.0 |
| 221 | + * net-protocol 0.1.2 |
| 222 | + * nkf 0.1.1 |
| 223 | + * open-uri 0.2.0 |
| 224 | + * openssl 3.0.0 |
| 225 | + * optparse 0.2.0 |
| 226 | + * ostruct 0.5.2 |
| 227 | + * pathname 0.2.0 |
| 228 | + * pp 0.3.0 |
| 229 | + * prettyprint 0.1.1 |
| 230 | + * psych 4.0.3 |
| 231 | + * racc 1.6.0 |
| 232 | + * rdoc 6.4.0 |
| 233 | + * readline 0.0.3 |
| 234 | + * readline-ext 0.1.4 |
| 235 | + * reline 0.3.0 |
| 236 | + * resolv 0.2.1 |
| 237 | + * rinda 0.1.1 |
| 238 | + * ruby2_keywords 0.0.5 |
| 239 | + * securerandom 0.1.1 |
| 240 | + * set 1.0.2 |
| 241 | + * stringio 3.0.1 |
| 242 | + * strscan 3.0.1 |
| 243 | + * tempfile 0.1.2 |
| 244 | + * time 0.2.0 |
| 245 | + * timeout 0.2.0 |
| 246 | + * tmpdir 0.1.2 |
| 247 | + * un 0.2.0 |
| 248 | + * uri 0.11.0 |
| 249 | + * yaml 0.2.0 |
| 250 | + * zlib 2.1.1 |
| 251 | +* *Bundled gem* berikut telah diperbarui. |
| 252 | + * minitest 5.15.0 |
| 253 | + * power_assert 2.0.1 |
| 254 | + * rake 13.0.6 |
| 255 | + * test-unit 3.5.3 |
| 256 | + * rexml 3.2.5 |
| 257 | + * rbs 2.0.0 |
| 258 | + * typeprof 0.21.1 |
| 259 | +* *Default gem* berikut sekarang adalah *bundled gem*. Anda perlu menambahkan |
| 260 | + pustaka berikut pada `Gemfile` yang terdapat pada *bundler environment*. |
| 261 | + * net-ftp 0.1.3 |
| 262 | + * net-imap 0.2.2 |
| 263 | + * net-pop 0.1.1 |
| 264 | + * net-smtp 0.3.1 |
| 265 | + * matrix 0.4.2 |
| 266 | + * prime 0.1.2 |
| 267 | + * debug 1.4.0 |
| 268 | + |
| 269 | +Lihat [NEWS](https://github.com/ruby/ruby/blob/{{ release.tag }}/NEWS.md) |
| 270 | +atau [commit logs](https://github.com/ruby/ruby/compare/v3_0_0...{{ release.tag }}) |
| 271 | +untuk lebih detail. |
| 272 | + |
| 273 | +Dengan perubahan tersebut, [{{ release.stats.files_changed }} berkas berubah, {{ release.stats.insertions }} sisipan(+), {{ release.stats.deletions }} terhapus(-)](https://github.com/ruby/ruby/compare/v3_0_0...{{ release.tag }}#file_bucket) |
| 274 | +sejak Ruby 3.0.0! |
| 275 | + |
| 276 | +Selamat natal, selamat berlibur, dan nikmati memprogram dengan Ruby 3.1! |
| 277 | + |
| 278 | +## Unduh |
| 279 | + |
| 280 | +* <{{ release.url.gz }}> |
| 281 | + |
| 282 | + SIZE: {{ release.size.gz }} |
| 283 | + SHA1: {{ release.sha1.gz }} |
| 284 | + SHA256: {{ release.sha256.gz }} |
| 285 | + SHA512: {{ release.sha512.gz }} |
| 286 | + |
| 287 | +* <{{ release.url.xz }}> |
| 288 | + |
| 289 | + SIZE: {{ release.size.xz }} |
| 290 | + SHA1: {{ release.sha1.xz }} |
| 291 | + SHA256: {{ release.sha256.xz }} |
| 292 | + SHA512: {{ release.sha512.xz }} |
| 293 | + |
| 294 | +* <{{ release.url.zip }}> |
| 295 | + |
| 296 | + SIZE: {{ release.size.zip }} |
| 297 | + SHA1: {{ release.sha1.zip }} |
| 298 | + SHA256: {{ release.sha256.zip }} |
| 299 | + SHA512: {{ release.sha512.zip }} |
| 300 | + |
| 301 | +## Apa itu Ruby |
| 302 | + |
| 303 | +Ruby pertama kali dikembangkan oleh Matz (Yukihiro Matsumoto) pada tahun 1993 |
| 304 | +dan sekarang dikembangkan sebagai *Open Source*. Ruby berjalan di berbagai |
| 305 | +*platform* dan digunakan di seluruh dunia, khususnya pengembangan *web*. |
0 commit comments