|
| 1 | +--- |
| 2 | +layout: news_post |
| 3 | +title: "Ruby 3.3.0-preview3 Dirilis" |
| 4 | +author: "naruse" |
| 5 | +translator: "meisyal" |
| 6 | +date: 2023-11-12 00:00:00 +0000 |
| 7 | +lang: id |
| 8 | +--- |
| 9 | + |
| 10 | +{% assign release = site.data.releases | where: "version", "3.3.0-preview3" | first %} |
| 11 | +Kami dengan senang hati mengumumkan rilis dari Ruby {{ release.version }}. |
| 12 | +Ruby 3.3 menambahkan sebuah *parser* baru yang bernama Prism, menggunakan Lrama |
| 13 | +sebagai *parser generator*, menambahkan *pure-Ruby* JIT *compiler* baru |
| 14 | +yang bernama RJIT, dan memperbaiki performa khususnya YJIT. |
| 15 | + |
| 16 | +## Prism |
| 17 | + |
| 18 | +* Memperkenalkan [the Prism parser](https://github.com/ruby/prism) sebagai *default gem* |
| 19 | + * Prism adalah sebuah *parser* yang *portable*, *error tolerant*, dan *maintainable recursive descent* untuk Ruby |
| 20 | +* Prism siap digunakan di *production* dan aktif dirawat, Anda dapat menggunakannya sebagai pengganti Ripper |
| 21 | + * Ada [extensive documentation](https://ruby.github.io/prism/) untuk menggunakan Prism |
| 22 | + * Prism adalah sebuah pustaka bahasa C yang digunakan secara internal oleh CRuby dan sebuah Ruby *gem* yang digunakan untuk mem-*parse* kode Ruby |
| 23 | + * Beberapa *method* penting pada Prism API: |
| 24 | + * `Prism.parse(source)` yang mengembalikan AST sebagai bagian dari ParseResult |
| 25 | + * `Prism.dump(source)` yang mengembalikan *serialized* AST sebagai sebuah String |
| 26 | + * `Prism.parse_comments(source)` yang mengembalikan komentar pada kode |
| 27 | +* Anda dapat membuat *pull request* atau melaporkan isu secara langsung pada [the Prism repository](https://github.com/ruby/prism) jika Anda tertarik untuk berkontribusi |
| 28 | + |
| 29 | +## Menggunakan Lrama ketimbang Bison |
| 30 | + |
| 31 | +* Mengganti Bison dengan [Lrama LALR parser generator](https://github.com/yui-knk/lrama) [Feature #19637](https://bugs.ruby-lang.org/issues/19637) |
| 32 | + * Jika Anda tertarik, silakan lihat [The future vision of Ruby Parser](https://rubykaigi.org/2023/presentations/spikeolaf.html) |
| 33 | + * Internal *parser* dari Lrama digantikan dengan LR yang dihasilkan oleh Racc untuk *maintainability* |
| 34 | + * *Parameterizing Rule* `(?, *, +)` didukung, ini akan digunakan di Ruby parse.y |
| 35 | + |
| 36 | +## RJIT |
| 37 | + |
| 38 | +* Memperkenalkan sebuah *pure-Ruby* JIT *compiler* dan menggantikan MJIT. |
| 39 | + * RJIT hanya mendukung arsitektur x86-64 pada *platform Unix*. |
| 40 | + * Berbeda dengan MJIT, RJIT tidak memerlukan sebuah *compiler* C saat *runtime*. |
| 41 | +* RJIT ada hanya untuk tujuan eksperimen. |
| 42 | + * Anda seharusnya tetap menggunakan YJIT pada *production*. |
| 43 | +* Jika Anda tertarik untuk mengembangkan JIT pada Ruby, silakan cek [k0kubun's presentation on Day 3 of RubyKaigi](https://rubykaigi.org/2023/presentations/k0kubun.html#day3). |
| 44 | + |
| 45 | +## YJIT |
| 46 | + |
| 47 | +* Peningkatan performa yang signifikan dibanding Ruby 3.2 |
| 48 | + * Dukungan *splat* dan *rest argument* telah ditingkatkan. |
| 49 | + * *Register* dialokasikan untuk operasi *stack* dari *virtual machine*. |
| 50 | + * Pemanggilan dengan *optional argument* dikompilasi. |
| 51 | + * *Exception handler* juga dikompilasi. |
| 52 | + * *Instant variable* tidak lagi keluar ke *intepreter* dengan *Object Shapes* |
| 53 | + yang sangat besar. |
| 54 | + * *Call type* yang tidak didukung tidak lagi keluar ke *interpreter*. |
| 55 | + * `Integer#!=`, `String#!=`, `Kernel#block_given?`, `Kernel#is_a?`, |
| 56 | + `Kernel#instance_of?`, `Module#===` dioptimisasi. |
| 57 | + * Sekarang 3x lebih cepat dibanding *interpreter* pada optcarrot! |
| 58 | +* Peningkatan penggunakan *memory* secara signifikan |
| 59 | + * *Metadata* dari kode yang dikompilasi menggunakan *memory* lebih sedikit. |
| 60 | + * Peningkatan *code generation* pada ARM64 |
| 61 | +* Kecepatan kompilasi sedikit lebih cepat dibanding Ruby 3.2 |
| 62 | +* Menambahkan `RubyVM::YJIT.enable` untuk mengaktifkan YJIT saat *run-time* |
| 63 | + * Anda dapat menjalankan YJIT tanpa memodifikasi argumen *command-line* atau *environment variable* |
| 64 | + * Ini dapat digunakan untuk mengaktifkan YJIT saat aplikasi Anda selesai *booting*. |
| 65 | + `--yjit-disable` dapat digunakan jika Anda tidak ingin mengaktifkan YJIT |
| 66 | + ketika aplikasi *booting*. |
| 67 | +* Opsi untuk menonaktifkan kode GC dan memperlakukan `--yjit-exec-mem-size` sebagai sebuah batas keras |
| 68 | + * Dapat menghasilkan perilaku *copy-on-write* lebih baik pada *server* yang menggunakan unicorn dan *forking* |
| 69 | +* `ratio_in_yjit` yang dihasilkan oleh `--yjit-stats` sekarang tersedia pada |
| 70 | + rilis *build*, data khusus atau dev *build* tidak lagi diperlukan. |
| 71 | +* Opsi *exit tracing* sekarang mendukung *sampling* |
| 72 | + * `--trace-exits-sample-rate=N` |
| 73 | +* `--yjit-perf` ditambahkan untuk memfasilitasi *profiling* dengan Linux perf. |
| 74 | +* Pengujian lebih saksama dan perbaikan beberapa *bug* |
| 75 | + |
| 76 | +### M:N thread scheduler |
| 77 | + |
| 78 | +* M:N *thread scheduler* diperkenalkan. [[Feature #19842]](https://bugs.ruby-lang.org/issues/19842) |
| 79 | + * M Ruby *thread* diatur oleh N *native thread* (OS *thread*) sehingga pembuatan *thread* dan |
| 80 | + manajemen berkurang. |
| 81 | + * Ini dapat merusak kompatibilitas dengan C-*extension* sehingga M:N *thread* dinonaktifkan |
| 82 | + pada *main* dari Ractor secara *default*. |
| 83 | + * *Environment variable* `RUBY_MN_THREADS=1` mengaktifkan M:N *thread* pada *main* dari Ractor. |
| 84 | + * M:N *thread* diaktifkan pada selain *main* dari Ractor. |
| 85 | + * *Environment variable* `RUBY_MAX_CPU=n` menetapkan jumlah maksimum dari `N` (jumlah maksimum dari *native thread*). Nilai *default* adalah 8. |
| 86 | + * Karena hanya ada satu Ruby *thread* untuk setiap Ractor yang dapat berjalan bersamaan, |
| 87 | + jumlah *native thread* yang digunakan, yang mana lebih kecil dari jumlah yang dispesifikasikan pada |
| 88 | + `RUBY_MAX_CPU` dan jumlah dari Ractor yang sedang berjalan. Sehingga, aplikasi Ractor tunggal (mayoritas aplikasi) |
| 89 | + akan menggunakan satu *native thread*. |
| 90 | + * Untuk mendukung operasi *blocking*, lebih dari `N` *native thread* dapat digunakan. |
| 91 | + |
| 92 | +## Fitur Penting Lainnya |
| 93 | + |
| 94 | + |
| 95 | + |
| 96 | +### Bahasa |
| 97 | + |
| 98 | + |
| 99 | + |
| 100 | +## Perbaikan performa |
| 101 | + |
| 102 | +* `defined?(@ivar)` dioptimisasi dengan *Object Shapes*. |
| 103 | +* *Name resolution* seperti `Socket.getaddrinfo` sekarang dapat diinterupsi (pada *environment* di mana pthread tersedia). [Feature #19965](https://bugs.ruby-lang.org/issues/19965) |
| 104 | + * Untuk tujuan ini, sebuah pthread sekarang dibuat setiap kali ada pemanggilan getaddrinfo atau getnameinfo. |
| 105 | + Ini menimbulkan *overhead* pada *name resolution* (sekitar 2.5x pada eksperimen kami). |
| 106 | + Kami tidak mengharapkan *overhead* menjadi sebuah masalah pada kebanyakan aplikasi, namun jika Anda menemui atau |
| 107 | + melihat hasil yang tidak diharapkan karena perubahan tersebut, mohon laporkan. |
| 108 | +* *Environment variable* `RUBY_GC_HEAP_REMEMBERED_WB_UNPROTECTED_OBJECTS_LIMIT_RATIO` telah ditambahkan. [Feature #19571](https://bugs.ruby-lang.org/issues/19571) |
| 109 | +* *Children* dari *object* lama tidak lagi dipromosikan ke generasi lama pada *garbage collector*. [Feature #19678](https://bugs.ruby-lang.org/issues/19678) |
| 110 | +* Dukungan untuk *weak reference* telah ditambahkan pada *garbage collector*. [Feature #19783](https://bugs.ruby-lang.org/issues/19783) |
| 111 | + |
| 112 | +## Perubahan penting lainnya sejak 3.2 |
| 113 | + |
| 114 | +### IRB |
| 115 | + |
| 116 | +IRB mendapatkan beberapa peningkatan berikut, namun tidak terbatas pada: |
| 117 | + |
| 118 | +- Integrasi `irb:rdbg` yang menyediakan pengalaman *deugging* setara dengan `pry-byebug` ([doc](https://github.com/ruby/irb#debugging-with-irb)). |
| 119 | +- Dukungan *pager* untuk perintah, seperti `ls`, `show_source`, dan `show_cmds`. |
| 120 | +- Menyediakan informasi yang lebih akurat dan membantu dengan perintah `ls` dan `show_source`. |
| 121 | +- Eksperimen *autocompletion* menggunakan *type analysis* ([doc](https://github.com/ruby/irb#type-based-completion)). |
| 122 | +- Sekarang memungkinkan untuk mengubah warna dan gaya *font* pada *completion dialog* dengan mengenalkan *class* Reline::Face ([doc](https://github.com/ruby/ruby/blob/master/doc/reline/face.md)) |
| 123 | + |
| 124 | +Sebagai tambahan, IRB telah menjalani *refactoring* yang ekstensif dan menerima |
| 125 | +perbaikan *bug* untuk memfasilitasi peningkatan ke depan dengan lebih mudah. |
| 126 | + |
| 127 | +## Isu kompatibilitas |
| 128 | + |
| 129 | +Catatan: Tidak termasuk perbaikan *bug* dari fitur. |
| 130 | + |
| 131 | +### Constant terhapus |
| 132 | + |
| 133 | +Berikut ini adalah *constant* yang telah dihapus. |
| 134 | + |
| 135 | + |
| 136 | + |
| 137 | +### Method terhapus |
| 138 | + |
| 139 | +Berikut ini adalah *method* yang telah dihapus. |
| 140 | + |
| 141 | +### Environment variable terhapus |
| 142 | + |
| 143 | +Berikut adalah *environment variable* yang telah dihapus. |
| 144 | + |
| 145 | +* *Environment variable* `RUBY_GC_HEAP_INIT_SLOTS` tidak digunakan lagi. Mohon gunakan `RUBY_GC_HEAP_{0,1,2,3,4}_INIT_SLOTS`. [Feature #19785](https://bugs.ruby-lang.org/issues/19785) |
| 146 | + |
| 147 | +## Isu kompatibilitas Stdlib |
| 148 | + |
| 149 | +### `ext/readline` dipensiunkan |
| 150 | + |
| 151 | +* Kami memiliki `reline` yang merupakan implementasi Ruby murni dan kompatibel |
| 152 | + dengan `ext/readline` API. Kami bergantung pada `reline` di masa depan. Jika |
| 153 | + Anda perlu untuk menggunakan `ext/readline`, Anda dapat memasang `ext/readline` |
| 154 | + melalui rubygems.org dengan `gem install readline-ext`. |
| 155 | +* Kami tidak lagi memasang pustaka, seperti `libreadline` atau `libedit`. |
| 156 | + |
| 157 | +## Pembaruan C API |
| 158 | + |
| 159 | +### C API diperbarui |
| 160 | + |
| 161 | +Berikut adalah API yang telah diperbarui. |
| 162 | + |
| 163 | + |
| 164 | + |
| 165 | +### C API terhapus |
| 166 | + |
| 167 | +Berikut adalah API yang telah dihapus. |
| 168 | + |
| 169 | + |
| 170 | + |
| 171 | +## Pembaruan pustaka standar |
| 172 | + |
| 173 | +RubyGems dan Bundler memperingatkan jika pengguna membutuhkan *gem* yang dijadwalkan |
| 174 | +akan menjadi *bundled gem* pada Ruby versi berikutnya. |
| 175 | + |
| 176 | +Pustaka yang ditargetkan: |
| 177 | + * abbrev |
| 178 | + * base64 |
| 179 | + * bigdecimal |
| 180 | + * csv |
| 181 | + * drb |
| 182 | + * getoptlong |
| 183 | + * mutex_m |
| 184 | + * nkf |
| 185 | + * observer |
| 186 | + * racc |
| 187 | + * resolv-replace |
| 188 | + * rinda |
| 189 | + * syslog |
| 190 | + |
| 191 | +Berikut adalah *default gem* yang telah ditambahkan. |
| 192 | + |
| 193 | +* prism 0.15.1 |
| 194 | + |
| 195 | +Berikut adalah *default gem* yang telah diperbarui. |
| 196 | + |
| 197 | +* RubyGems 3.5.0.dev |
| 198 | +* base64 0.2.0 |
| 199 | +* benchmark 0.3.0 |
| 200 | +* bigdecimal 3.1.5 |
| 201 | +* bundler 2.5.0.dev |
| 202 | +* cgi 0.4.0 |
| 203 | +* csv 3.2.8 |
| 204 | +* date 3.3.4 |
| 205 | +* delegate 0.3.1 |
| 206 | +* drb 2.2.0 |
| 207 | +* english 0.8.0 |
| 208 | +* erb 4.0.3 |
| 209 | +* etc 1.4.3.dev.1 |
| 210 | +* fcntl 1.1.0 |
| 211 | +* fiddle 1.1.2 |
| 212 | +* fileutils 1.7.2 |
| 213 | +* find 0.2.0 |
| 214 | +* getoptlong 0.2.1 |
| 215 | +* io-console 0.6.1.dev |
| 216 | +* irb 1.8.3 |
| 217 | +* logger 1.6.0 |
| 218 | +* mutex_m 0.2.0 |
| 219 | +* net-http 0.4.0 |
| 220 | +* net-protocol 0.2.2 |
| 221 | +* nkf 0.1.3 |
| 222 | +* observer 0.1.2 |
| 223 | +* open-uri 0.4.0 |
| 224 | +* open3 0.2.0 |
| 225 | +* openssl 3.2.0 |
| 226 | +* optparse 0.4.0 |
| 227 | +* ostruct 0.6.0 |
| 228 | +* pathname 0.3.0 |
| 229 | +* pp 0.5.0 |
| 230 | +* prettyprint 0.2.0 |
| 231 | +* pstore 0.1.3 |
| 232 | +* psych 5.1.1.1 |
| 233 | +* rdoc 6.6.0 |
| 234 | +* reline 0.3.9 |
| 235 | +* rinda 0.2.0 |
| 236 | +* securerandom 0.3.0 |
| 237 | +* shellwords 0.2.0 |
| 238 | +* singleton 0.2.0 |
| 239 | +* stringio 3.0.9 |
| 240 | +* strscan 3.0.7 |
| 241 | +* syntax_suggest 1.1.0 |
| 242 | +* tempfile 0.2.0 |
| 243 | +* time 0.3.0 |
| 244 | +* timeout 0.4.1 |
| 245 | +* tmpdir 0.2.0 |
| 246 | +* tsort 0.2.0 |
| 247 | +* un 0.3.0 |
| 248 | +* uri 0.13.0 |
| 249 | +* weakref 0.1.3 |
| 250 | +* win32ole 1.8.10 |
| 251 | +* yaml 0.3.0 |
| 252 | +* zlib 3.1.0 |
| 253 | + |
| 254 | +Berikut adalah *bundled gem* yang dipromosikan dari *default gem*. |
| 255 | + |
| 256 | +* racc 1.7.3 |
| 257 | + |
| 258 | +Berikut adalah *bundled gem* yang telah diperbarui. |
| 259 | + |
| 260 | +* minitest 5.20.0 |
| 261 | +* rake 13.1.0 |
| 262 | +* test-unit 3.6.1 |
| 263 | +* rexml 3.2.6 |
| 264 | +* rss 0.3.0 |
| 265 | +* net-imap 0.4.4 |
| 266 | +* net-smtp 0.4.0 |
| 267 | +* rbs 3.2.2 |
| 268 | +* typeprof 0.21.8 |
| 269 | +* debug 1.8.0 |
| 270 | + |
| 271 | +Lihat rilis GitHub, seperti [Logger](https://github.com/ruby/logger/releases) |
| 272 | +atau *changelog* untuk detail dari *default gem* atau *bundled gem*. |
| 273 | + |
| 274 | +Lihat [NEWS](https://github.com/ruby/ruby/blob/{{ release.tag }}/NEWS.md) |
| 275 | +atau [commit logs](https://github.com/ruby/ruby/compare/v3_2_0...{{ release.tag }}) |
| 276 | +untuk lebih detail. |
| 277 | + |
| 278 | +Dengan perubahan tersebut, [{{ release.stats.files_changed }} berkas berubah, {{ release.stats.insertions }} sisipan(+), {{ release.stats.deletions }} terhapus(-)](https://github.com/ruby/ruby/compare/v3_2_0...{{ release.tag }}#file_bucket) |
| 279 | +sejak Ruby 3.2.0! |
| 280 | + |
| 281 | +## Unduh |
| 282 | + |
| 283 | +* <{{ release.url.gz }}> |
| 284 | + |
| 285 | + SIZE: {{ release.size.gz }} |
| 286 | + SHA1: {{ release.sha1.gz }} |
| 287 | + SHA256: {{ release.sha256.gz }} |
| 288 | + SHA512: {{ release.sha512.gz }} |
| 289 | + |
| 290 | +* <{{ release.url.xz }}> |
| 291 | + |
| 292 | + SIZE: {{ release.size.xz }} |
| 293 | + SHA1: {{ release.sha1.xz }} |
| 294 | + SHA256: {{ release.sha256.xz }} |
| 295 | + SHA512: {{ release.sha512.xz }} |
| 296 | + |
| 297 | +* <{{ release.url.zip }}> |
| 298 | + |
| 299 | + SIZE: {{ release.size.zip }} |
| 300 | + SHA1: {{ release.sha1.zip }} |
| 301 | + SHA256: {{ release.sha256.zip }} |
| 302 | + SHA512: {{ release.sha512.zip }} |
| 303 | + |
| 304 | +## Apa itu Ruby |
| 305 | + |
| 306 | +Ruby pertama kali dikembangkan oleh Matz (Yukihiro Matsumoto) pada 1993 |
| 307 | +dan sekarang dikembangkan sebagai *Open Source*. Ruby berjalan pada berbagai |
| 308 | +*platform* dan digunakan di seluruh dunia, khususnya pengembangan *web*. |
0 commit comments