Ruby 4.0.0
(ruby-lang.org)- Ruby 4.0.0 telah dirilis, memperkenalkan Ruby Box dan ZJIT serta mencakup banyak peningkatan performa dan bahasa
- Ruby Box adalah fitur eksperimental yang memungkinkan eksekusi terisolasi untuk kelas, modul, variabel global, dan definisi library native/Ruby
- ZJIT adalah kompiler JIT generasi berikutnya berbasis Rust, secara struktural lebih mudah diperluas dibanding YJIT dan memudahkan kontribusi eksternal
- Model eksekusi paralel Ractor ditingkatkan dari sisi stabilitas dan performa, dan status eksperimentalnya direncanakan akan dicabut di masa mendatang
- Pembaruan menyeluruh pada kelas inti, pustaka standar, C API, GC, JIT, dan lainnya memperkuat performa dan skalabilitas ekosistem Ruby
Gambaran umum Ruby 4.0
- Ruby 4.0.0 adalah versi pembaruan besar yang berfokus pada Ruby Box dan ZJIT
- Mencakup peningkatan di berbagai area seperti eksekusi paralel, sintaks bahasa, pustaka standar, GC, dan JIT
- Unduhan tersedia dalam format
.tar.gz,.tar.xz, dan.zip
Ruby Box
- Ruby Box adalah fitur eksperimental yang menyediakan isolasi definisi
- Diaktifkan dengan mengatur variabel lingkungan
RUBY_BOX=1, dan kelasnya adalahRuby::Box - Definisi yang dimuat di dalam box terisolasi dari luar, sehingga monkey patch, variabel global/kelas, definisi kelas/modul, dan perubahan library tidak memengaruhi box lain
- Diaktifkan dengan mengatur variabel lingkungan
- Contoh penggunaan utama
- Eksekusi terisolasi antar test case
- Menjalankan web app paralel untuk deployment blue-green
- Eksekusi paralel untuk memverifikasi pembaruan dependensi
- Ke depannya akan dimanfaatkan sebagai API dasar untuk implementasi “package API” tingkat tinggi
ZJIT
- ZJIT adalah kompiler JIT baru yang dikembangkan sebagai versi generasi berikutnya dari YJIT
- Memerlukan Rust 1.85.0 atau lebih tinggi, diaktifkan dengan opsi
--zjit - Mendukung unit kompilasi yang lebih besar berbasis SSA IR dan memiliki struktur yang mendorong kontribusi eksternal
- Memerlukan Rust 1.85.0 atau lebih tinggi, diaktifkan dengan opsi
- Saat ini lebih cepat daripada interpreter, tetapi lebih lambat daripada YJIT
- Penggunaan di produksi belum direkomendasikan, dan peningkatan performa direncanakan pada Ruby 4.1
Peningkatan Ractor
- Penambahan kelas Ractor::Port menyelesaikan masalah pengiriman dan penerimaan pesan
Ractor.shareable_procmemudahkan berbagi objek Proc antar Ractor- Perbaikan struktur data internal mengurangi kontensi global lock dan meningkatkan paralelisme
- Status eksperimental Ractor direncanakan akan dicabut tahun depan
Perubahan bahasa
*niltidak lagi memanggilnil.to_a(berperilaku sama seperti**nil)- Operator logika (
||,&&,and,or) kini mendukung sintaks line continuation (dot chaining) - Meningkatkan keterbacaan dan konsistensi kode
Pembaruan kelas inti
- Array:
Array#rfind,Array#findditambahkan untuk pencarian yang lebih efisien - Binding: pengecualian numbered parameter dan penambahan method terkait
implicit_parameters - Enumerator: argumen kata kunci
size:ditambahkan keproduce - ErrorHighlight: saat
ArgumentErrorterjadi, menampilkan cuplikan kode pemanggil dan lokasi definisi - Fiber/Fiber::Scheduler: penambahan
raise(cause:),fiber_interrupt,yield, dan lainnya - File: dukungan
File::Stat#birthtimedi Linux - IO: mengizinkan timeout
Float::INFINITY, menghapus pembuatan proses berbasis pipe - Kernel:
#inspectkini dapat dikustomisasi, pembuatan pipe padaKernel#opendihapus - Math: penambahan
log1p,expm1 - Pathname: dipromosikan dari default gem menjadi kelas inti
- Proc: format output parameter anonim diseragamkan
- Ractor: struktur komunikasi diubah ke basis
Ractor::Port,Ractor.yielddan lainnya dihapus - Set: dipromosikan menjadi kelas inti, format
inspectdisederhanakan - Socket: argumen
open_timeoutditambahkan, exception timeout diseragamkan - String: dukungan Unicode 17.0.0, Emoji 17.0, perluasan method keluarga
strip - Thread: dukungan argumen
raise(cause:)
Pembaruan pustaka standar (Stdlib)
- Dipromosikan menjadi default gem:
ostruct,pstore,benchmark,logger,rdoc,win32ole,irb,reline,fiddle, dan lainnya - Default gem baru:
win32-registry 0.1.2 - Pembaruan default gem:
RubyGems 4.0.3,bundler 4.0.3,openssl 4.0.0,json 2.18.0, dan lainnya - Pembaruan bundled gem:
minitest 6.0.0,rake 13.3.1,rbs 3.10.0,debug 1.11.1, dan lainnya - Menyertakan RubyGems/Bundler 4
Dukungan platform
- Windows: menghentikan dukungan untuk versi di bawah MSVC 14.0 (memerlukan Visual Studio 2015 atau lebih baru)
Perubahan kompatibilitas
Ractor.yield,Ractor#take,Ractor#close_incoming,Ractor#close_outgoingdihapusObjectSpace._id2reftidak digunakan lagiProcess::Status#&,#>>dihapus- Output internal frame (backtrace) disederhanakan
- Pada backtrace
ArgumentError, nama kelas/modul receiver kini ditampilkan
Kompatibilitas pustaka standar
- Library CGI dihapus, hanya
cgi/escapeyang dipertahankan - Karena
Setdipromosikan ke inti,SortedSetkini memerlukan instalasi gem terpisah - Pengaturan otomatis header
Content-TypepadaNet::HTTPdihapus
Pembaruan C API
rb_thread_fd_closedinonaktifkan dan disarankan menggunakanrb_io_closerb_thread_call_with_gvlkini bekerja terlepas dari ada atau tidaknya GVL- Penambahan C API untuk Set (
rb_set_new,rb_set_add,rb_set_delete, dll.)
Peningkatan implementasi dan performa
- Kecepatan pemanggilan
Class#newditingkatkan, terutama saat menggunakan argumen kata kunci - Penggunaan memori berkurang berkat pertumbuhan independen GC heap pool
- Kecepatan sweeping objek besar ditingkatkan
- Optimasi pada perhitungan
object_id,hash, dan akses instance variable - Peningkatan performa Ractor
- Struktur hash tanpa lock, pengurangan kontensi cache, optimasi alokasi objek
- Perbaikan bug terkait deadlock, encoding, dan GC
Terkait JIT
- ZJIT: JIT berbasis method, memerlukan Rust 1.85.0 atau lebih tinggi, diaktifkan dengan
--zjitatauRubyVM::ZJIT.enable - YJIT: perubahan pada opsi statistik, penambahan
mem_size:dancall_threshold: - RJIT:
--rjitdihapus, dipindahkan ke repositori terpisah
Skala perubahan
- Dibanding Ruby 3.4.0, terdapat 3.889 file berubah, 230.769 baris ditambahkan, dan 297.003 baris dihapus
- Ruby 4.0 adalah rilis mayor yang secara signifikan memperkuat performa, paralelisme, dan konsistensi bahasa
Unduhan
- Tersedia dalam format
ruby-4.0.0.tar.gz,ruby-4.0.0.tar.xz,ruby-4.0.0.zip - Nilai hash SHA1, SHA256, SHA512 untuk masing-masing file dicantumkan
Tentang Ruby
- Ruby adalah bahasa open-source yang dikembangkan oleh Yukihiro Matsumoto (Matz) pada 1993
- Berjalan di berbagai platform, dan terutama digunakan secara luas di seluruh dunia dalam pengembangan web
1 komentar
Opini Hacker News
Selamat ulang tahun, Ruby!
Orang sering bilang, “mereka meninggalkan Ruby karena tidak punya typing,” tetapi sekarang RBS sedang mulai menjadi standar. Sorbet juga mendukungnya, dan sekarang ada inline notation untuk menuliskan tipe langsung di samping kode.
Lalu anggapan bahwa “Ruby lemah dalam LSP” juga sudah jadi cerita lama. ruby-lsp sudah menjadi standar, dan juga mendukung “go to definition”. Berkat arsitektur plugin, berbagai tool bisa memakai ulang AST yang sama.
Paralelisme juga banyak membaik berkat Ractor, dan sekarang sepertinya tinggal GC yang perlu sedikit dipoles agar benar-benar keluar dari tahap eksperimen.
Ada juga fitur baru seperti ZJIT dan Box, tetapi masih belum direkomendasikan untuk production. Meski begitu, arahnya terus membaik.
Saya juga menganggap bagus bahwa sintaksnya tidak berubah drastis
Saat Natal harus selalu ada versi Ruby baru.
Kali ini ruby::box terasa menarik. Fitur ini memungkinkan rollout fitur dengan dua versi berjalan bersamaan.
Dan kemampuan menulis
if condition1 && condition2di beberapa baris juga cukup kerenif condition1 && condition2dalam beberapa baris, dan selalu berjalan baik. Saya tidak tahu apa bedanya sintaks baru iniSaya senang Ruby 4.0 dirilis, tetapi pada 2025 saya sudah sepenuhnya beralih ke Python.
Claude Code mengubah proyek Ruby saya secara otomatis 100% menjadi Python, dan sejak itu tidak ada lagi alasan bagi saya untuk memakai Ruby.
Saya mencintai Ruby selama lebih dari 10 tahun dan bahkan menulis buku tentangnya, tetapi sekarang fastapi, pytorch, langchain, dan streamlit membuat Python menang. Meski begitu, saya masih menganggap sintaks Ruby yang paling indah
Saat Natal memang rasanya tidak lengkap tanpa versi Ruby baru. Terima kasih untuk Matz dan tim
Adakah materi terbaru yang layak direkomendasikan untuk orang yang ingin belajar Ruby pada 2025~26? Selain dokumentasi resmi, saya penasaran apakah ada buku yang bagus
Kursus Ruby on Rails Pragmatic Studio
Ruby benar-benar bahasa yang luar biasa. Baru-baru ini saya membuat layer di atas Rails yang menghasilkan API hanya dari satu file Markdown, dan jika melakukan hal yang sama di Python akan jauh lebih rumit. Dengan JavaScript mungkin akan lebih mengerikan lagi. Kemampuan metaprogramming Ruby memang benar-benar tak tertandingi
Senang melihat stack trace internal sudah dirapikan. Akan bagus kalau suatu hari nanti juga mendukung path relatif. Dan menyenangkan juga bahwa Set akhirnya diperlakukan dengan layak
Sekarang saya bekerja di perusahaan yang tidak memakai Ruby, tetapi saya masih sangat mencintainya. Terima kasih untuk rilis kali ini, dan semoga saya mendapat kesempatan memakainya lagi
Dulu saya pernah mendengar bahwa fitur Ruby::Box (namespace) menyebabkan penurunan performa yang serius, jadi saya penasaran apakah itu sudah diperbaiki kali ini
Saya ingin tahu apakah tooling-nya sudah membaik. Saya masih belum pernah berhasil menjalankan LSP dengan baik di Windows