Ditulis oleh naruse tanggal 2023-11-12
Diterjemahkan oleh meisyal
Kami dengan senang hati mengumumkan rilis dari Ruby 3.3.0-preview3. Ruby 3.3 menambahkan sebuah parser baru yang bernama Prism, menggunakan Lrama sebagai parser generator, menambahkan pure-Ruby JIT compiler baru yang bernama RJIT, dan memperbaiki performa khususnya YJIT.
Prism
- Memperkenalkan the Prism parser sebagai default gem
- Prism adalah sebuah parser yang portable, error tolerant, dan maintainable recursive descent untuk Ruby
- Prism siap digunakan di production dan aktif dirawat, Anda dapat menggunakannya sebagai pengganti Ripper
- Ada extensive documentation untuk menggunakan Prism
- Prism adalah sebuah pustaka bahasa C yang digunakan secara internal oleh CRuby dan sebuah Ruby gem yang digunakan untuk mem-parse kode Ruby
- Beberapa method penting pada Prism API:
Prism.parse(source)
yang mengembalikan AST sebagai bagian dari ParseResultPrism.dump(source)
yang mengembalikan serialized AST sebagai sebuah StringPrism.parse_comments(source)
yang mengembalikan komentar pada kode
- Anda dapat membuat pull request atau melaporkan isu secara langsung pada the Prism repository jika Anda tertarik untuk berkontribusi
Menggunakan Lrama ketimbang Bison
- Mengganti Bison dengan Lrama LALR parser generator Feature #19637
- Jika Anda tertarik, silakan lihat The future vision of Ruby Parser
- Internal parser dari Lrama digantikan dengan LR yang dihasilkan oleh Racc untuk maintainability
- Parameterizing Rule
(?, *, +)
didukung, ini akan digunakan di Ruby parse.y
RJIT
- Memperkenalkan sebuah pure-Ruby JIT compiler dan menggantikan MJIT.
- RJIT hanya mendukung arsitektur x86-64 pada platform Unix.
- Berbeda dengan MJIT, RJIT tidak memerlukan sebuah compiler C saat runtime.
- RJIT ada hanya untuk tujuan eksperimen.
- Anda seharusnya tetap menggunakan YJIT pada production.
- Jika Anda tertarik untuk mengembangkan JIT pada Ruby, silakan cek k0kubun’s presentation on Day 3 of RubyKaigi.
YJIT
- Peningkatan performa yang signifikan dibanding Ruby 3.2
- Dukungan splat dan rest argument telah ditingkatkan.
- Register dialokasikan untuk operasi stack dari virtual machine.
- Pemanggilan dengan optional argument dikompilasi.
- Exception handler juga dikompilasi.
- Instant variable tidak lagi keluar ke intepreter dengan Object Shapes yang sangat besar.
- Call type yang tidak didukung tidak lagi keluar ke interpreter.
Integer#!=
,String#!=
,Kernel#block_given?
,Kernel#is_a?
,Kernel#instance_of?
,Module#===
dioptimisasi.- Sekarang 3x lebih cepat dibanding interpreter pada optcarrot!
- Peningkatan penggunakan memory secara signifikan
- Metadata dari kode yang dikompilasi menggunakan memory lebih sedikit.
- Peningkatan code generation pada ARM64
- Kecepatan kompilasi sedikit lebih cepat dibanding Ruby 3.2
- Menambahkan
RubyVM::YJIT.enable
untuk mengaktifkan YJIT saat run-time- Anda dapat menjalankan YJIT tanpa memodifikasi argumen command-line atau environment variable
- Ini dapat digunakan untuk mengaktifkan YJIT saat aplikasi Anda selesai booting.
--yjit-disable
dapat digunakan jika Anda tidak ingin mengaktifkan YJIT ketika aplikasi booting.
- Opsi untuk menonaktifkan kode GC dan memperlakukan
--yjit-exec-mem-size
sebagai sebuah batas keras- Dapat menghasilkan perilaku copy-on-write lebih baik pada server yang menggunakan unicorn dan forking
ratio_in_yjit
yang dihasilkan oleh--yjit-stats
sekarang tersedia pada rilis build, data khusus atau dev build tidak lagi diperlukan.- Opsi exit tracing sekarang mendukung sampling
--trace-exits-sample-rate=N
--yjit-perf
ditambahkan untuk memfasilitasi profiling dengan Linux perf.- Pengujian lebih saksama dan perbaikan beberapa bug
M:N thread scheduler
- M:N thread scheduler diperkenalkan. [Feature #19842]
- M Ruby thread diatur oleh N native thread (OS thread) sehingga pembuatan thread dan manajemen berkurang.
- Ini dapat merusak kompatibilitas dengan C-extension sehingga M:N thread dinonaktifkan
pada main dari Ractor secara default.
* Environment variable
RUBY_MN_THREADS=1
mengaktifkan M:N thread pada main dari Ractor. * M:N thread diaktifkan pada selain main dari Ractor. - Environment variable
RUBY_MAX_CPU=n
menetapkan jumlah maksimum dariN
(jumlah maksimum dari native thread). Nilai default adalah 8. * Karena hanya ada satu Ruby thread untuk setiap Ractor yang dapat berjalan bersamaan, jumlah native thread yang digunakan, yang mana lebih kecil dari jumlah yang dispesifikasikan padaRUBY_MAX_CPU
dan jumlah dari Ractor yang sedang berjalan. Sehingga, aplikasi Ractor tunggal (mayoritas aplikasi) akan menggunakan satu native thread. * Untuk mendukung operasi blocking, lebih dariN
native thread dapat digunakan.
Fitur Penting Lainnya
Bahasa
Perbaikan performa
defined?(@ivar)
dioptimisasi dengan Object Shapes.- Name resolution seperti
Socket.getaddrinfo
sekarang dapat diinterupsi (pada environment di mana pthread tersedia). Feature #19965- Untuk tujuan ini, sebuah pthread sekarang dibuat setiap kali ada pemanggilan getaddrinfo atau getnameinfo. Ini menimbulkan overhead pada name resolution (sekitar 2.5x pada eksperimen kami). Kami tidak mengharapkan overhead menjadi sebuah masalah pada kebanyakan aplikasi, namun jika Anda menemui atau melihat hasil yang tidak diharapkan karena perubahan tersebut, mohon laporkan.
- Environment variable
RUBY_GC_HEAP_REMEMBERED_WB_UNPROTECTED_OBJECTS_LIMIT_RATIO
telah ditambahkan. Feature #19571 - Children dari object lama tidak lagi dipromosikan ke generasi lama pada garbage collector. Feature #19678
- Dukungan untuk weak reference telah ditambahkan pada garbage collector. Feature #19783
Perubahan penting lainnya sejak 3.2
IRB
IRB mendapatkan beberapa peningkatan berikut, namun tidak terbatas pada:
- Integrasi
irb:rdbg
yang menyediakan pengalaman deugging setara denganpry-byebug
(doc). - Dukungan pager untuk perintah, seperti
ls
,show_source
, danshow_cmds
. - Menyediakan informasi yang lebih akurat dan membantu dengan perintah
ls
danshow_source
. - Eksperimen autocompletion menggunakan type analysis (doc).
- Sekarang memungkinkan untuk mengubah warna dan gaya font pada completion dialog dengan mengenalkan class Reline::Face (doc)
Sebagai tambahan, IRB telah menjalani refactoring yang ekstensif dan menerima perbaikan bug untuk memfasilitasi peningkatan ke depan dengan lebih mudah.
Isu kompatibilitas
Catatan: Tidak termasuk perbaikan bug dari fitur.
Constant terhapus
Berikut ini adalah constant yang telah dihapus.
Method terhapus
Berikut ini adalah method yang telah dihapus.
Environment variable terhapus
Berikut adalah environment variable yang telah dihapus.
- Environment variable
RUBY_GC_HEAP_INIT_SLOTS
tidak digunakan lagi. Mohon gunakanRUBY_GC_HEAP_{0,1,2,3,4}_INIT_SLOTS
. Feature #19785
Isu kompatibilitas Stdlib
ext/readline
dipensiunkan
- Kami memiliki
reline
yang merupakan implementasi Ruby murni dan kompatibel denganext/readline
API. Kami bergantung padareline
di masa depan. Jika Anda perlu untuk menggunakanext/readline
, Anda dapat memasangext/readline
melalui rubygems.org dengangem install readline-ext
. - Kami tidak lagi memasang pustaka, seperti
libreadline
ataulibedit
.
Pembaruan C API
C API diperbarui
Berikut adalah API yang telah diperbarui.
C API terhapus
Berikut adalah API yang telah dihapus.
Pembaruan pustaka standar
RubyGems dan Bundler memperingatkan jika pengguna membutuhkan gem yang dijadwalkan akan menjadi bundled gem pada Ruby versi berikutnya.
Pustaka yang ditargetkan:
- abbrev
- base64
- bigdecimal
- csv
- drb
- getoptlong
- mutex_m
- nkf
- observer
- racc
- resolv-replace
- rinda
- syslog
Berikut adalah default gem yang telah ditambahkan.
- prism 0.15.1
Berikut adalah default gem yang telah diperbarui.
- RubyGems 3.5.0.dev
- base64 0.2.0
- benchmark 0.3.0
- bigdecimal 3.1.5
- bundler 2.5.0.dev
- cgi 0.4.0
- csv 3.2.8
- date 3.3.4
- delegate 0.3.1
- drb 2.2.0
- english 0.8.0
- erb 4.0.3
- etc 1.4.3.dev.1
- fcntl 1.1.0
- fiddle 1.1.2
- fileutils 1.7.2
- find 0.2.0
- getoptlong 0.2.1
- io-console 0.6.1.dev
- irb 1.8.3
- logger 1.6.0
- mutex_m 0.2.0
- net-http 0.4.0
- net-protocol 0.2.2
- nkf 0.1.3
- observer 0.1.2
- open-uri 0.4.0
- open3 0.2.0
- openssl 3.2.0
- optparse 0.4.0
- ostruct 0.6.0
- pathname 0.3.0
- pp 0.5.0
- prettyprint 0.2.0
- pstore 0.1.3
- psych 5.1.1.1
- rdoc 6.6.0
- reline 0.3.9
- rinda 0.2.0
- securerandom 0.3.0
- shellwords 0.2.0
- singleton 0.2.0
- stringio 3.0.9
- strscan 3.0.7
- syntax_suggest 1.1.0
- tempfile 0.2.0
- time 0.3.0
- timeout 0.4.1
- tmpdir 0.2.0
- tsort 0.2.0
- un 0.3.0
- uri 0.13.0
- weakref 0.1.3
- win32ole 1.8.10
- yaml 0.3.0
- zlib 3.1.0
Berikut adalah bundled gem yang dipromosikan dari default gem.
- racc 1.7.3
Berikut adalah bundled gem yang telah diperbarui.
- minitest 5.20.0
- rake 13.1.0
- test-unit 3.6.1
- rexml 3.2.6
- rss 0.3.0
- net-imap 0.4.4
- net-smtp 0.4.0
- rbs 3.2.2
- typeprof 0.21.8
- debug 1.8.0
Lihat rilis GitHub, seperti Logger atau changelog untuk detail dari default gem atau bundled gem.
Lihat NEWS atau commit logs untuk lebih detail.
Dengan perubahan tersebut, 5207 berkas berubah, 284820 sisipan(+), 174773 terhapus(-) sejak Ruby 3.2.0!
Unduh
-
https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0-preview3.tar.gz
SIZE: 21550473 SHA1: 2811f191d66dffee0206771873bd990857ae4ed6 SHA256: 0969141be92e67e0edb84a8fb354acc98f01bd78e602a23a0f136045c82f4809 SHA512: 94db07a6958c09809b2e5b597fa55a121074e8bacb3bf588c83cf0d35b07a8b070172035a49d1abf0d8ee364a9ace824f34e677f7327ffe1acdbab0938ac49c4
-
https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0-preview3.tar.xz
SIZE: 15970144 SHA1: 496600612605f8ebeb955255e98bac73a4cbc045 SHA256: f79afcf122dc7d04fe26cfa4436b9c488b21766fc54b0d2dfb2ba41cd0cdd355 SHA512: d7ab0d703e7884efd31045933409cd68fac1d9941963537ccc8e309ca7c8bee8500a68182135acba22cbdbf4a8ae99f39bf7f0925273eb4fbc3728c0c1ba0c19
-
https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0-preview3.zip
SIZE: 26618303 SHA1: 6a13e08c7e484d42037c1e2c87c5d0e220f893a0 SHA256: c35bf637a647c2f60148368ffb374db5c258570911794f46b6dfdb98ebfe95d9 SHA512: c4ef2cdcdadeb85ad1d42aedc97f9f3d609b3b01eea2319451cf92c81bd31ae8129b7c91fc68571469dd888c01ea0f48f73234b965db17f6a87404ca382f7794
Apa itu Ruby
Ruby pertama kali dikembangkan oleh Matz (Yukihiro Matsumoto) pada 1993 dan sekarang dikembangkan sebagai Open Source. Ruby berjalan pada berbagai platform dan digunakan di seluruh dunia, khususnya pengembangan web.