Ruby 3.3 Dirilis
(ruby-lang.org)- YJIT meningkatkan performa dan penggunaan memori secara signifikan dibanding Ruby 3.2, dan menjadi lebih dari 3 kali lebih cepat daripada interpreter pada Optcarrot
- Code GC pada YJIT dinonaktifkan secara default, dan
--yjit-exec-mem-sizeberfungsi sebagai hard limit yang menghentikan kompilasi kode baru - Dengan penambahan
RubyVM::YJIT.enable, YJIT dapat diaktifkan saat runtime tanpa mengubah argumen command-line atau variabel lingkungan - Parser Prism ditambahkan sebagai gem default, dan API
Prism.parse(source),Prism.parse_comments(source),Prism.parse_success?(source)dapat digunakan - Compiler Prism dapat dicoba dengan
ruby --parser=prismatauRUBYOPT="--parser=prism", tetapi flag tersebut hanya untuk debugging - Generator parser diganti dari Bison ke Lrama, dan parser internal Lrama diganti dengan parser LR yang dihasilkan Racc demi kemudahan pemeliharaan
- Compiler JIT pure-Ruby RJIT menggantikan MJIT, tetapi hanya mendukung arsitektur x86-64 di Unix dan terbatas untuk tujuan eksperimental
- M:N thread scheduler diperkenalkan, sehingga M thread Ruby dikelola oleh N thread native, tetapi dinonaktifkan secara default pada main Ractor karena dapat merusak kompatibilitas ekstensi C
- Cara
itdipanggil tanpa argumen dan digunakan dalam blok yang tidak memiliki parameter biasa akan dihentikan dukungannya (deprecation), dan pada Ruby 3.4 akan menjadi referensi ke parameter blok pertama Regexp::newhanya mengizinkan maksimal 2 argumen, menggantikan pemanggilan 3 argumen yang telah dihentikan dukungannya pada Ruby 3.2ext/readlinedipensiunkan, dan ke depannya akan bergantung padareline, implementasi pure Ruby yang kompatibel dengan APIext/readline- Jika
ext/readlinediperlukan, ia dapat diinstal dari rubygems.org dengangem install readline-ext, dan instalasi library sepertilibreadlineataulibedittidak lagi diperlukan - RubyGems dan Bundler akan memberi peringatan jika beberapa gem di-
requiretanpa menambahkannya ke Gemfile atau gemspec, dan gem-gem ini akan menjadi bundled gem pada versi Ruby mendatang - Saat menggunakan gem bootsnap, peringatan tersebut ditekan; karena keterbatasan versi ini, disarankan menjalankan aplikasi setidaknya sekali dengan variabel lingkungan
DISABLE_BOOTSNAP=1 prism 0.19.0ditambahkan sebagai gem default, danracc 1.7.3dipromosikan dari default gem menjadi bundled gem
1 komentar
Komentar Hacker News
Menurut saya, dengan Ruby 3.3, Ruby benar-benar bangkit kembali. Bahasa yang berfokus pada kebahagiaan developer tetapi sering diejek karena lambat, kini tidak lagi lambat
YJIT adalah teknologi yang luar biasa, dan bersama object shape serta berbagai optimisasi garbage collection, Ruby menjadi cukup cepat. Pengguna Ruby berskala besar seperti Shopify juga melaporkan peningkatan performa dua digit dalam persen saat menjalankan pra-rilis 3.3 dengan YJIT aktif di produksi
Secara pribadi saya sangat antusias dengan Ruby dan masa depannya, dan ingin bekerja dengan Ruby 3.3 lalu menerapkannya ke situs produksi pelanggan
https://railsatscale.com/2023-09-18-ruby-3-3-s-yjit-runs-sho...
Saya bahkan pernah memakainya untuk kode perekat antara penyimpanan record DNS berbasis Redis dan PowerDNS, dan seluruh stack memproses 500 juta query per bulan di 14 VPS kecil tanpa terlihat di htop. Saya memakai PowerDNS bukan karena performa, melainkan karena biasanya bukan ide bagus mengimplementasikan sendiri hal-hal seperti kriptografi, HTTP, atau DNS yang terekspos ke internet publik
Ironi web masa kini adalah web app yang dibuat dengan Ruby yang “lambat” dan server-side rendering justru memuat halaman lebih cepat daripada database eventually consistent yang memang lambat dan web app frontend yang membengkak. Di web modern, terlalu sering melihat loading spinner bahkan untuk hal-hal sepele
Setelah membuka tautannya, ternyata itu peningkatan belasan persen. Rasanya ini tidak banyak mengubah anggapan bahwa Ruby kira-kira 50~200 kali lebih lambat daripada bahasa yang dianggap “cepat” seperti Rust, Java, Go, atau C++
Ruby 3.3 tampaknya menjadi salah satu rilis Ruby paling penting dan paling kaya fitur dalam 10 tahun terakhir. Saya tidak menyangka ia akan menghadirkan JIT yang siap produksi lebih dulu daripada Python, dan ada juga Prism, Lrama, serta IRB
Namun yang belum cukup dibahas adalah Ractor, scheduler thread M:N, Fiber, dan Async. Khususnya dalam konteks Rails, saya ingin mendengar apakah ada orang yang memakai fitur-fitur ini di lingkungan produksi
Meski begitu, Ractor memang layak mendapat lebih banyak sorotan. Itu fitur yang sangat besar
Mungkin di dalam perusahaan ada ribuan solusi kustom privat berbasis RabbitMQ atau Redis
Setiap Natal, Ruby Lang merilis versi baru setepat jam
Tersedia di Heroku: https://devcenter.heroku.com/changelog-items/2772
Kelihatannya bagus. IRB baru adalah interpreter Ruby interaktif dengan autocomplete dan debugging yang lebih baik. Sebagian besar perubahan di Ruby 3.3 tampaknya akan bermuara pada perbaikan alat developer
API bahasanya sebagian besar tetap konsisten dengan rilis sebelumnya. Saya menulis panduan pembaruan Ruby 3.3 yang memuat catatan untuk berbagai version manager: https://mac.install.guide/ruby/update.html
Saya penasaran version manager mana yang layak direkomendasikan. Sebelumnya saya merekomendasikan asdf, frum, dan chruby
Name resolution seperti
Socket.getaddrinfosekarang bisa diinterupsi, dan setiap kali name resolution diperlukan, Ruby akan membuat worker pthread lalu menjalankangetaddrinfo(3)di dalamnyaSaya penasaran apakah runtime bahasa lain juga melakukan hal serupa. Membuat thread tampak terlalu berat, tetapi mungkin dalam praktiknya bukan masalah besar. Bahkan menurut benchmark internal mereka sendiri, overhead-nya kecil tetapi bukan nol
10000.times { Addrinfo.getaddrinfo("www.ruby-lang.org", 80) }memakan 2.3 detik sebelum patch dan 3.0 detik sesudah patch, sedangkan100.times { URI.open("https://www.ruby-lang.org").read }memakan 3.36 detik sebelum patch dan 3.40 detik sesudah patchKesannya bukan seperti Python yang mengimplementasikan ulang operasi yang sama dalam “warna” async, melainkan semuanya pada dasarnya dipindahkan ke mode asynchronous. Saya tidak yakin apakah pemahaman itu benar
Bertanya-tanya apakah Ruby layak dipelajari jika sudah mengenal Python dan NodeJS. Ruby terasa menarik, tetapi juga sulit
Jika sudah mahir dengan Node dan Python, mempelajarinya akan cukup mudah. Kekurangannya adalah, jika sudah tahu bahasa-bahasa itu, Ruby pada dasarnya tidak memberi hal yang benar-benar baru. Kelebihannya terutama bersifat estetis: Ruby menyediakan dan mendorong cara mengekspresikan kode yang benar-benar indah, dan menyenangkan untuk mengalaminya
Saya terutama bekerja di codebase TypeScript, tetapi sering memakai Ruby saat menangani data log atau teks semi-terstruktur, atau ketika melakukan penulisan ulang berbasis regex di banyak file. Ruby sangat menyenangkan, dan mungkin bahasa paling menyenangkan di antara yang saya pakai secara rutin, jadi itu sendiri sudah jadi ganjaran
Contoh terbesarnya adalah Ruby sangat menyukai block. Itu ada di seluruh standard library, ada banyak sugar sintaks, dan tak terhitung banyaknya DSL yang berpusat pada block. Fitur-fitur fungsional yang standar juga sudah lama ada di standard library, sehingga gaya fungsional bisa dipakai dengan mulus dan tetap enak dibaca
Secara teknis sebagian besar itu juga bisa dilakukan di Python, tetapi terasa jauh lebih canggung untuk ditulis dan dibaca. Python memang punya lambda, tetapi kesannya tidak terlalu disukai untuk penggunaan lebih dari hal-hal sepele, dan sebagai gantinya fungsi dipakai sebagai nilai kelas satu di mana-mana
Orang-orang yang peka terhadap teknologi terbaru sedang beralih ke pengembangan berorientasi API berbasis node.js dan AngularJS yang jauh lebih cepat daripada yang dibuat dengan RoR. Pada 2013, pendekatan standar RoR masih monolitik, dan terlihat menua karena tidak berhasil beralih dengan baik ke paradigma baru pemisahan frontend/backend
Alasan saya panjang lebar membahas framework yang dibuat dengan Ruby, bukan Ruby itu sendiri, adalah karena bahkan sekarang pun rasanya 95% pengembangan Ruby adalah aplikasi Rails. Ruby menjadi terkenal sebagian besar berkat Ruby on Rails, dan jika RoR sedang menurun, maka Ruby tampaknya akan mengikuti arus yang sama sampai menyusut menjadi komunitas kecil yang fanatik seperti Perl
Jika hanya melihat bahasanya sendiri, saya tidak terpikir alasan untuk memilih Ruby ketimbang Python atau TypeScript. Baik dari sisi bahasa maupun platform, Ruby tampaknya tidak punya sesuatu yang lebih baik daripada para pesaing yang sudah jauh lebih mapan
Prism terlihat menarik. Penasaran apakah ada alat analisis kode Ruby yang menggunakannya. Saya sedang mencari cara menganalisis kode di perusahaan
Katanya variabel lingkungan
RUBY_MAX_CPU=nmengatur maksimum N, yaitu jumlah maksimum native thread, dan nilai bawaan adalah 8Rasanya nilai bawaannya seharusnya jumlah core logis seperti Tokio di Rust atau banyak runtime M:N lainnya
init()ataumain()Saya berharap Ruby 4.0 mengizinkan import eksplisit, alih-alih cara sekarang yang implisit dan memasukkan gem ke namespace global
Ada juga diskusi tentang fitur “namespace on read” yang masih tahap perkiraan: https://bugs.ruby-lang.org/issues/19744
Fakta bahwa namespace global hanya mendukung tepat satu versi dari tiap gem juga mendorong budaya sehat yang menekankan ABI yang stabil dan masa tenggang deprecation. Dibandingkan dengan beberapa ekosistem bahasa lain, itu seperti lingkungan impian
Atau mungkin saya sepenuhnya salah bicara
https://youtu.be/4MM5b2F9zrM?si=UT3aUbD6p_uBZehS&t=2347