1 puan yazan GN⁺ 2023-12-26 | 1 yorum | WhatsApp'ta paylaş

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

 
GN⁺ 2023-12-26
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.

    • YJIT teknolojisi, nesne şekilleri ve GC optimizasyonları gibi yenilikler sayesinde Ruby'nin performansı büyük ölçüde iyileşti.
    • Shopify gibi Ruby'yi yoğun kullanan büyük şirketler Ruby 3.3'ün performans iyileştirmelerini deneyimliyor.
    • Ruby'nin geleceği konusunda kişisel olarak oldukça heyecanlı olduğunu ve Ruby 3.3'ü müşterilerin production sitelerinde kullanmayı dört gözle beklediğini belirtiyor.
  • 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.

    • Prism, Lrama, IRB gibi çeşitli özellikler önceki Hacker News gönderilerinde tartışıldı.
    • Ractor, M:N thread scheduler, Fibre ve Async gibi özelliklerin Rails bağlamında yeterince konuşulmadığı, bunları production'da kullanan kişilerin deneyimlerini duymak istediği belirtiliyor.
  • 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.getaddrinfo gibi ad çözümlemesi kesintiye uğrayabilir. Ad çözümlemesi gerektiğinde bir worker pthread oluşturulup getaddrinfo(3) çalıştırılıyor.

    • Diğer dil runtime'larının da benzer bir şey yapıp yapmadığı soruluyor. Thread oluşturma ağır gelebilir ama benchmark'lara göre ek yük minimum düzeyde.
  • Prism ilgi çekici bulunuyor. Ruby kod analiz araçlarında Prism kullanımına dair örnek olup olmadığı soruluyor.

  • RUBY_MAX_CPU=n ortam değişkeni native thread'lerin azami sayısını belirliyor. Varsayılan değer 8.

    • Varsayılanın, Rust'ın Tokio'su ve diğer birçok M:N runtime'da olduğu gibi mantıksal çekirdek sayısına eşit olması gerekip gerekmediği sorgulanıyor.
  • 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.