Ruby 3.3 yayımlandı
(ruby-lang.org)- YJIT, Ruby 3.2’ye kıyasla performansı ve bellek kullanımını önemli ölçüde iyileştirdi; Optcarrot’ta yorumlayıcıdan 3 kattan fazla hızlı hale geldi
- YJIT’in Code GC’si varsayılan olarak devre dışı bırakıldı;
--yjit-exec-mem-size, yeni kod derlemeyi durduran katı bir sınır olarak çalışıyor RubyVM::YJIT.enableeklendi; komut satırı argümanlarını veya ortam değişkenlerini değiştirmeden çalışma zamanında YJIT’i etkinleştirmek mümkün- Varsayılan gem olarak Prism ayrıştırıcısı eklendi;
Prism.parse(source),Prism.parse_comments(source),Prism.parse_success?(source)API’leri kullanılabiliyor - Prism derleyicisi
ruby --parser=prismveyaRUBYOPT="--parser=prism"ile denenebiliyor; ancak bu bayrak yalnızca hata ayıklama amaçlı - Ayrıştırıcı üreteci Bison’dan Lrama’ya değiştirildi; Lrama’nın dahili ayrıştırıcısı da bakım kolaylığı için Racc tarafından üretilen LR ayrıştırıcısıyla değiştirildi
- Pure-Ruby JIT derleyicisi RJIT, MJIT’in yerini alıyor; ancak yalnızca Unix’te x86-64 mimarisini destekliyor ve deneysel amaçlarla sınırlı
- M:N thread scheduler getirildi; M adet Ruby iş parçacığını N adet yerel iş parçacığı yönetiyor, ancak C eklentileriyle uyumluluğu bozabileceği için main Ractor’da varsayılan olarak devre dışı
it’in argümansız çağrılıp normal parametresi olmayan bloklarda kullanılması destekten kaldırılıyor (deprecation); Ruby 3.4’te ilk blok parametresine referans haline gelmesi planlanıyorRegexp::new, Ruby 3.2’de destekten kaldırılan 3 argümanlı çağrı yerine en fazla 2 argümana izin veriyorext/readlineemekliye ayrıldı; gelecekteext/readlineAPI’siyle uyumlu pure Ruby uygulaması olanreline’a bağlı olacakext/readlinegerektiğinde rubygems.org’dangem install readline-extile kurulabilir;libreadlineveyalibeditgibi kütüphanelerin kurulması artık gerekmiyor- RubyGems ve Bundler, bazı gem’ler Gemfile veya gemspec’e eklenmeden
requireedilirse uyarı veriyor; bu gem’ler gelecekteki Ruby sürümlerinde bundled gem olacak - bootsnap gem kullanılırken bu uyarı bastırılıyor; bu sürümdeki sınırlama nedeniyle uygulamanın en az bir kez
DISABLE_BOOTSNAP=1ortam değişkeniyle çalıştırılması öneriliyor - Varsayılan gem olarak
prism 0.19.0eklendi;racc 1.7.3ise default gem’den bundled gem’e yükseltildi
1 yorum
Hacker News yorumları
Ruby 3.3 ile Ruby’nin büyük bir dönüş yaptığını düşünüyorum. Geliştirici mutluluğuna odaklanan ama yavaş diye alaya alınan dil artık yavaş değil
YJIT şaşırtıcı bir teknoloji; nesne shape’leri ve çeşitli çöp toplama optimizasyonlarıyla birlikte Ruby epey hızlanıyor. Shopify gibi büyük Ruby kullanıcıları da 3.3 ön sürümünde YJIT’yi açıp üretimde çalıştırarak çift haneli yüzde performans iyileşmeleri bildirdi
Kişisel olarak Ruby ve geleceği konusunda gerçekten heyecanlıyım; Ruby 3.3 ile çalışıp bunu müşterilerin üretimdeki sitelerine uygulamayı denemek istiyorum
https://railsatscale.com/2023-09-18-ruby-3-3-s-yjit-runs-sho...
Redis tabanlı DNS kaydı deposu ile PowerDNS arasındaki yapıştırıcı kodda da kullandım; tüm yığın, 14 küçük VPS üzerinde ayda 500 milyon sorguyu işlerken htop’ta kendini belli bile etmiyordu. PowerDNS’i performans yüzünden kullanmadım; herkese açık internete maruz kalan şifreleme, HTTP, DNS gibi şeyleri doğrudan uygulamak genelde iyi bir fikir olmadığı için kullandım
Günümüz web’inin ironisi şu: “yavaş” Ruby ve sunucu tarafı render ile yapılmış bir web uygulaması, gerçekten yavaş olan nihai tutarlılıklı veritabanlarından ve şişkin frontend web uygulamalarından sayfaları daha hızlı yüklüyor. Modern web’de önemsiz bir iş yaparken bile yükleme spinner’larını çok sık görüyorum
Bağlantıya tıklayınca bunun %10’lar seviyesinde bir iyileşme olduğunu gördüm. Ruby’nin Rust, Java, Go, C++ gibi “hızlı” dillere göre kabaca 50–200 kat daha yavaş olduğu algısını pek değiştirecek gibi görünmüyor
Ruby 3.3, son 10 yılın en önemli ve en zengin özellikli Ruby sürümlerinden biri gibi görünüyor. Python’dan önce üretime hazır bir JIT çıkaracaklarını beklemiyordum; ayrıca Prism, Lrama ve IRB de var
Ama yeterince ele alınmayan şeyler Ractor, M:N thread zamanlayıcısı, Fiber ve Async. Özellikle Rails bağlamında bu özellikleri üretim ortamında kullanan biri var mı, düşünceleri duymak isterim
Yine de Ractor daha çok öne çıkarılmayı hak ediyor. Muazzam büyük bir özellik
Muhtemelen şirketlerin içinde RabbitMQ ya da Redis tabanlı binlerce özel, şirket içi çözüm vardır
Her yıl Noel’de saat gibi Ruby Lang yeni bir sürüm çıkarıyor
Heroku’da kullanılabilir: https://devcenter.heroku.com/changelog-items/2772
İyi görünüyor. Yeni IRB, otomatik tamamlama ve hata ayıklaması iyileştirilmiş etkileşimli Ruby yorumlayıcısı. Ruby 3.3’teki değişikliklerin çoğu geliştirici araçlarında iyileşmeye dönüşecek gibi
Dil API’si genel olarak önceki sürümlerle tutarlı kalıyor. Çeşitli sürüm yöneticilerine ilişkin notları içeren bir Ruby 3.3 güncelleme rehberi yazdım: https://mac.install.guide/ruby/update.html
Merak ediyorum, hangi sürüm yöneticisini önermek gerekir bilmiyorum. Daha önce asdf, frum, chruby önermiştim
Socket.getaddrinfogibi ad çözümleme işlemleri artık kesintiye uğratılabiliyor; ad çözümleme gerektiğinde her seferinde bir worker pthread oluşturup onun içindegetaddrinfo(3)çalıştırdığı söyleniyorDiğer dil runtime’ları da benzerini yapıyor mu merak ediyorum. Thread oluşturmak çok ağır görünüyor ama pratikte büyük bir sorun olmayabilir. Kendi benchmark’larına göre de ek yük küçük ama sıfır değil
10000.times { Addrinfo.getaddrinfo("www.ruby-lang.org", 80) }yamadan önce 2,3 saniye, yamadan sonra 3,0 saniyeydi;100.times { URI.open("https://www.ruby-lang.org").read }ise yamadan önce 3,36 saniye, yamadan sonra 3,40 saniyeydiPython’daki gibi aynı işlemin async “renkli” bir sürümünü yeniden uygulamak yerine, her şeyin varsayılan olarak asenkrona taşındığı izlenimini aldım; doğru mu bilmiyorum
Zaten Python ve NodeJS biliyorsanız Ruby öğrenmeye değip değmeyeceğini merak ediyorum. Ruby ilginç ama zor görünüyor
Node ve Python’da yetkinseniz öğrenmesi epey kolay olacaktır. Dezavantajı, o dilleri zaten biliyorsanız temelde yeni bir şey sunmaması. Avantajı daha çok estetik tarafında; Ruby kodu gerçekten güzel ifade etmenin yollarını sunar ve teşvik eder, bunu deneyimlemek de keyiflidir
Çoğunlukla TypeScript kod tabanlarında çalışıyorum ama log verileri ya da yarı yapılandırılmış metinlerle uğraşırken veya birden çok dosyada regex tabanlı yeniden yazımlar yaparken Ruby’yi sık sık çıkarıp kullanıyorum. Ruby çok eğlenceli; düzenli kullandığım diller arasında muhtemelen en eğlencelisi, bu da başlı başına bir ödül
En büyük örnek, Ruby’nin blokları gerçekten sevmesi. Standart kütüphanenin her yerindeler, bolca sözdizim şekeri var ve bloklar etrafında kurulmuş sayısız DSL bulunuyor. Standart işlevsel özellikler de uzun zamandır standart kütüphanede yer aldığı için işlevsel stili akıcı ve okunabilir şekilde kullanmak mümkün
Python’da da teknik olarak bunların çoğu yapılabilir, ama yazması ve okuması çok daha hantal görünür. Python’da lambda var, ancak basit kullanımların ötesinde pek sevilmiyor gibi; bunun yerine fonksiyonlar her yerde birinci sınıf değer olarak kullanılıyor
Yeni teknolojilere duyarlı kişiler, RoR ile yapılanlardan çok daha hızlı olan node.js ve AngularJS tabanlı API odaklı geliştirmeye geçiyordu. 2013’te RoR’un standart yaklaşımı hâlâ monolitikti ve frontend/backend ayrımı şeklindeki yeni paradigmaya iyi uyum sağlayamadığı için yaşlı görünüyordu
Ruby’nin kendisinden değil de Ruby ile yapılmış framework’ten uzun uzun bahsetmemin nedeni, bugün bile Ruby geliştirmesinin %95’inin Rails uygulamaları olduğunu sanmam. Ruby’nin ünlenmesi büyük ölçüde Ruby on Rails sayesinde oldu; RoR düşüşteyse Ruby de Perl gibi küçük ama tutkulu bir topluluğa küçülene kadar aynı yolu izleyecek gibi
Sadece dilin kendisine bakınca Python veya TypeScript yerine Ruby seçmek için bir neden aklıma gelmiyor. Dil ya da platform açısından Ruby’nin, zaten daha iyi yerleşmiş rakiplerinden daha iyi yaptığı bir şey yok gibi görünüyor
Prism ilginç. Bunu kullanan Ruby kod analiz araçları var mı merak ediyorum. Şirket kodunu analiz etmenin bir yolunu arıyordum
RUBY_MAX_CPU=nortam değişkeninin en fazla N, yani en fazla yerel thread sayısını belirlediği ve varsayılan değerin 8 olduğu söyleniyorVarsayılanın Rust’ın Tokio’su veya pek çok M:N runtime’da olduğu gibi mantıksal çekirdek sayısı olması gerekmez mi diye düşünüyorum
init()veyamain()içinde GO_MAX_PROCS ayarladığımı hatırlıyorumRuby 4.0’da, gem’leri şu anki gibi örtük biçimde ve global namespace’e almak yerine açık importa izin verilse iyi olur
Varsayım aşamasındaki “namespace on read” özelliği tartışması da var: https://bugs.ruby-lang.org/issues/19744
Global namespace’in her gem’in tam olarak tek bir sürümünü desteklemesi, kararlı ABI ve kullanımdan kaldırma için geçiş süresi önemseyen sağlıklı bir kültürü de teşvik ediyor. Bazı dil ekosistemleriyle karşılaştırınca rüya gibi bir ortam
Ya da tamamen yanlış konuşuyor da olabilirim
https://youtu.be/4MM5b2F9zrM?si=UT3aUbD6p_uBZehS&t=2347