Ruby 3.3.0 yayınlandı
- Ruby 3.3.0 sürümü yayınlandı. Yeni ayrıştırıcı Prism eklendi, ayrıştırıcı üreticisi olarak Lrama kullanıldı, tamamen Ruby ile yazılmış JIT derleyicisi RJIT eklendi ve özellikle YJIT tarafında performans iyileştirmeleri yapıldı.
Prism ayrıştırıcısı
- Prism, Ruby dili için taşınabilir, hatalara dayanıklı ve bakımı kolay bir recursive descent ayrıştırıcıdır; varsayılan gem olarak sunulur.
- Prism, üretim ortamına uygundur, aktif olarak bakımı yapılmaktadır ve Ripper'ın yerine kullanılabilir.
- Prism'in kullanımıyla ilgili ayrıntılı dokümantasyon sağlanmaktadır.
- Prism, CRuby içinde kullanılan bir C kütüphanesi olmasının yanı sıra Ruby kodunu ayrıştırması gereken tüm araçlarda kullanılabilecek bir Ruby gem'idir.
- Prism API'sinin başlıca metodları arasında
Prism.parse(source), Prism.parse_comments(source), Prism.parse_success?(source) bulunur.
- Prism deposuna doğrudan pull request veya issue göndererek katkıda bulunulabilir.
- Prism derleyicisini deneysel olarak kullanmak için
ruby --parser=prism veya RUBYOPT="--parser=prism" kullanılabilir, ancak yalnızca hata ayıklama amacıyla kullanılmalıdır.
Lrama ayrıştırıcı üreticisi
- Bison, Lrama LALR ayrıştırıcı üreticisi ile değiştirildi.
- Ruby ayrıştırıcısına yönelik gelecek vizyonuna bakarak ilgilenenler daha fazla bilgi edinebilir.
- Bakım kolaylığı için dahili Lrama ayrıştırıcısı, Racc tarafından üretilen LR ayrıştırıcısı ile değiştirildi.
- Parametreli kurallar (?, *, +) desteği eklendi; Ruby parse.y içinde kullanılacak.
YJIT
- Ruby 3.2'ye kıyasla önemli performans iyileştirmeleri var.
- splat ve rest argümanlarına yönelik destek iyileştirildi.
- Sanal makinenin stack işlemleri için register ataması yapıldı.
- Opsiyonel argüman içeren daha fazla çağrı derleniyor. Exception handler'lar da derleniyor.
- Desteklenmeyen çağrı türleri ve megamorphic call site'lar artık yorumlayıcıya geri düşmüyor.
- Rails'in
#blank? ve özel #present? gibi temel metodları inline işleniyor.
Integer#*, Integer#!=, String#!=, String#getbyte, Kernel#block_given?, Kernel#is_a?, Kernel#instance_of?, Module#=== gibi yapılar özel olarak optimize edildi.
- Derleme hızı Ruby 3.2'den biraz daha hızlı.
- Optcarrot'ta yorumlayıcıdan 3 kat daha hızlı!
- Ruby 3.2'ye göre bellek kullanımı belirgin biçimde iyileştirildi.
- Derlenmiş kodun metadata'sı çok daha az bellek kullanıyor.
--yjit-call-threshold, 30'dan 40.000'den fazla ISEQ içeren uygulamalar için otomatik olarak 120'ye yükseltiliyor.
--yjit-cold-threshold eklendi ve soğuk ISEQ'lerin derlenmesi atlanıyor.
- Arm64 üzerinde daha kompakt kod üretiliyor.
- Code GC varsayılan olarak devre dışı.
--yjit-exec-mem-size, yeni kod derlemesinin durduğu kesin üst sınır olarak ele alınıyor.
- Code GC kaynaklı performans kaybı yok; ayrıca Pitchfork kullanıldığında sunucu yeniden fork ettiğinde daha iyi copy-on-write davranışı sağlıyor.
- İstenirse
--yjit-code-gc ile code GC etkinleştirilebilir.
- Çalışma zamanında YJIT'i etkinleştirmek için
RubyVM::YJIT.enable eklendi.
- Rails 7.2, varsayılan olarak YJIT'i etkinleştirmek için bu yöntemi kullanacak.
- YJIT'i yalnızca uygulama açılışını tamamladıktan sonra etkinleştirmek için bu yöntem kullanılabilir.
- Açılışta YJIT'i devre dışı bırakıp diğer YJIT seçeneklerini kullanmak için
--yjit-disable kullanılabilir.
- Varsayılan olarak daha fazla YJIT istatistiği sunuluyor.
yjit_alloc_size ve metadata ile ilgili çeşitli istatistikler varsayılan olarak sağlanıyor.
--yjit-stats tarafından üretilen ratio_in_yjit istatistiği, release build'lerde kullanılabiliyor. Artık özel istatistik veya geliştirme build'i gerekmiyor.
- Daha fazla profiling özelliği eklendi.
--yjit-perf, Linux perf ile profil çıkarmayı kolaylaştırmak için eklendi.
--yjit-trace-exits, --yjit-trace-exits-sample-rate=N ile örnekleme desteği sunuyor.
- Daha kapsamlı testler yapıldı ve çok sayıda hata düzeltildi.
RJIT
- Tamamen Ruby ile yazılmış JIT derleyicisi RJIT eklendi ve MJIT'in yerini aldı.
- RJIT yalnızca Unix platformlarında x86-64 mimarisinde destekleniyor.
- MJIT'ten farklı olarak çalışma zamanında C derleyicisi gerektirmiyor.
- RJIT yalnızca deneysel amaçlarla mevcut.
- Üretim ortamında YJIT kullanılmaya devam edilmeli.
- Ruby JIT geliştirmesiyle ilgileniliyorsa, RubyKaigi'nin 3. günündeki k0kubun sunumuna bakılması öneriliyor.
M:N thread scheduler
- M:N thread scheduler eklendi.
- M adet Ruby thread'i, N adet native thread (işletim sistemi thread'i) tarafından yönetildiği için thread oluşturma ve yönetim maliyeti azalıyor.
- M:N thread scheduler, C extension'larla uyumluluğu bozabileceği için varsayılan olarak ana Ractor'da devre dışı.
- Ana Ractor'da M:N thread'leri etkinleştirmek için
RUBY_MN_THREADS=1 ortam değişkeni kullanılabilir.
- Ana olmayan Ractor'larda M:N thread'ler her zaman etkin.
RUBY_MAX_CPU=n ortam değişkeni, N'in azami sayısını (native thread'lerin maksimum sayısını) belirler. Varsayılan değer 8'dir.
- Her Ractor başına yalnızca bir Ruby thread'i çalışabildiğinden, tek Ractor'lu uygulamalar (çoğu uygulama) yalnızca 1 native thread kullanır.
- Bloklayan işleri desteklemek için N'den fazla native thread kullanılabilir.
Performans iyileştirmeleri
defined?(@ivar), Object Shapes kullanılarak optimize edildi.
Socket.getaddrinfo gibi isim çözümlemeleri artık kesintiye uğratılabiliyor (uygun ortamlarda pthreads mevcutsa).
- Garbage collector tarafında çeşitli performans iyileştirmeleri var.
- Genç nesneler, yaşlı nesneler tarafından referanslandığında artık hemen yaşlı nesil seviyesine terfi etmiyor; bu da major GC toplama sıklığını ciddi biçimde azaltıyor.
- Major GC toplamalarını tetikleyen korunmasız nesne sayısını kontrol etmek için yeni
REMEMBERED_WB_UNPROTECTED_OBJECTS_LIMIT_RATIO ayar değişkeni eklendi. Varsayılan değer 0.01 (%1) olarak ayarlandı ve major GC toplama sıklığını önemli ölçüde azaltıyor.
- Write Barrier eksikliği olan birçok çekirdek tür için uygulama yapıldı. Bu sayede küçük GC toplama süresi ve major GC toplama sıklığı önemli ölçüde azaldı.
- Çoğu çekirdek sınıf artık Variable Width Allocation kullanıyor. Bu, bu sınıfların allocation ve deallocation işlemlerini hızlandırıyor, bellek kullanımını azaltıyor ve heap fragmentation'ı düşürüyor.
- Garbage collector'a weak reference desteği eklendi.
Diğer dikkat çekici değişiklikler
- IRB; gelişmiş irb:rdbg entegrasyonu, ls, show_source ve show_cmds komutları için pager desteği, ls ve show_source komutlarının sağladığı bilgilerin doğruluk ve kullanışlılık açısından iyileştirilmesi, tür analizi kullanan deneysel otomatik tamamlama gibi birçok geliştirme aldı.
- IRB ayrıca gelecekteki geliştirmeleri kolaylaştırmak için kapsamlı bir refactoring sürecinden geçti ve onlarca hata düzeltmesi aldı.
Uyumluluk sorunları
- Blok içinde argümansız
it çağrısı artık kullanılmıyor; Ruby 3.4'te ilk blok parametresini referans alacak.
- Kullanılmayan ortam değişkenleri kaldırıldı.
Standart kütüphane güncellemeleri
- RubyGems ve Bundler, kullanıcı Gemfile veya gemspec içine eklemeden aşağıdaki gem'leri require ederse uyarı gösterecek. Bunun nedeni, bu gem'lerin Ruby'nin gelecekteki sürümlerinde bundled gem haline gelecek olması.
- prism 0.19.0, RubyGems 3.5.3, abbrev 0.1.2 ve daha birçok temel gem eklendi veya güncellendi.
- racc 1.7.3, minitest 5.20.0 ve daha birçok bundled gem, temel gem statüsünden yükseltildi veya güncellendi.
GN⁺ görüşü
- Prism ayrıştırıcısının eklenmesi: Ruby 3.3.0'ın en önemli özelliklerinden biri yeni Prism ayrıştırıcısının eklenmesi. Ruby kodunu daha verimli ayrıştıran, hatalara dayanıklı ve bakımı kolay bir ayrıştırıcı sunarak Ruby geliştiricilerine önemli fayda sağlayacak.
- YJIT performans iyileştirmeleri: YJIT'teki başlıca performans iyileştirmeleri Ruby uygulamalarının çalışma hızını ciddi ölçüde artıracak; özellikle bellek kullanımındaki azalma ve GC optimizasyonları, büyük Ruby uygulamalarının performansı ve kararlılığı üzerinde olumlu etki yaratacak.
- M:N thread scheduler: M:N thread scheduler'ın eklenmesi, çok iş parçacıklı Ruby uygulamalarının performansını iyileştirme potansiyeli taşıyor. Thread yönetim maliyetini azaltacak ve daha verimli paralel işlemeyi mümkün kılacak.
1 yorum
Hacker News görüşleri
Ruby 3.3'ün gelişiyle, geliştirici mutluluğunu önemseyen bir dil olan Ruby, önceki yavaş imajını geride bırakıp yüksek hız sunuyor.
Ruby 3.3'ün son 10 yılın en önemli ve en zengin özellikli sürümü olduğu, Python'dan önce JIT yayımlamış olmasının şaşırtıcı olduğu ifade ediliyor.
Heroku'da Ruby 3.3 kullanılabildiği bildiriliyor.
Ruby dilinin her yıl Noel'de yeni bir sürüm çıkardığı belirtiliyor.
Python ve NodeJS zaten biliniyorsa Ruby öğrenmenin değerli olup olmadığı soruluyor. Ruby çekici ama zor geliyor.
Socket.getaddrinfogibi ad çözümlemesi kesintiye uğrayabilir. Ad çözümlemesi gerektiğinde bir worker pthread oluşturulupgetaddrinfo(3)çalıştırılıyor.Prism ilgi çekici bulunuyor. Ruby kod analiz araçlarında Prism kullanımına dair örnek olup olmadığı soruluyor.
RUBY_MAX_CPU=nortam değişkeni native thread'lerin azami sayısını belirliyor. Varsayılan değer 8.Prism kullanan iyi örnekler için bağlantı aranıyor. Sürüm sayfasında "dikkate değer API'ler" dışında pek bir şey göremediği için hayal kırıklığı ifade ediliyor.
Bunun mükemmel bir Noel hediyesi olduğu söyleniyor.