
Project Valhalla: on yıllık çalışma JDK 28'e geliyor — JEP 401 ne değiştiriyor
Oracle mühendisi Lois Foltan 15 Haziran'da JEP 401'in OpenJDK'nın ana deposuna girdiğini ve JDK 28'i hedeflediğini doğruladı. Özellik önizleme olarak geliyor ve Valhalla projesinin yalnızca ilk kısmı.
JEP 401 (Value Classes and Objects), OpenJDK'nın ana deposuna entegre edildi ve JDK 28'i hedefliyor; bunu 15 Haziran'da Oracle mühendisi Lois Foltan doğruladı. Değişiklik o kadar büyük ki, diğer committer'lardan entegrasyon sırasında büyük commit'lerden kaçınmaları istendi: yalnızca pull request, 1.816 dosyada 197 binden fazla satır kod ekliyor.
Özellik önizleme olarak geliyor ve varsayılan olarak kapalı, yani yalnızca --enable-preview bayrağıyla çalışacak. JEP'i inceleyen Brian Goetz beklentileri hemen dengeledi ve bunu "Valhalla'nın yalnızca ilk kısmı" olarak nitelendirdi.
Sorun: her şey bir referans
Valhalla'nın baştan beri sloganı şu: "sınıf gibi kodlanır, int gibi çalışır." Java'da sekiz ilkel tip dışında her değer bir referanstır: değişken, yığın üzerindeki bir nesneye işaretçi tutar, her nesnenin kendi başlığı vardır ve her nesne önce ayrılmalı, sonra çöp toplayıcı tarafından temizlenmelidir. Bir milyon noktadan oluşan bir dizi, pratikte belleğe dağılmış bir milyon kutuya işaret eden bir milyon işaretçidir — Brian Goetz'in "şişkin" dediği yerleşim.
Yoğunluk önemli, çünkü donanım dilden hızlı değişti: işlemci belleği 64 baytlık önbellek satırları hâlinde okur, böylece bitişik veri bir seferde birkaç değer getirir; işaretçi kovalamak ise isabetten yüz kat yavaş olabilen önbellek ıskalamaları riskini taşır.
JDK 28 ne getiriyor
JEP 401 tek bir yeni kavram getiriyor: value değiştiricisiyle bildirilen value class ve onun kimliksiz value nesneleri. Aynı alanlara sahip, ayrı ayrı oluşturulmuş iki value nesnesi birbirinin yerine geçebilir; bu yüzden == artık adres karşılaştırması değil, ikame edilebilirlik testidir ve böyle bir tipte synchronized bir IdentityException fırlatır. Value sınıflar varsayılan olarak finaldir, alanları örtük olarak finaldir ve metotları senkronize edilemez; yine de null olabilirler, çünkü null'suz tipler ayrı ve daha sonraki bir JEP'tir.
JVM iki optimizasyon kazanıyor. Skalarizasyon, JIT'in bir value nesnesini alanlarına ayırıp ayırmayı tümden ortadan kaldırmasını sağlar; yığın düzleştirme ise değeri doğrudan bir alana ya da dizi hücresine yazar. Düzleştirilmiş veriler atomik olarak okunup yazılmalıdır; bu bugün null bayrağı dâhil yaklaşık 64 bit demektir, dolayısıyla bazı küçük sınıflar yine yığında kalır. Önizleme açıkken JDK'nın Integer gibi kendi sarmalayıcı sınıfları value sınıfı hâline gelir ve bu, boxing maliyetini belirgin biçimde düşürmelidir.
Hâlâ eksik olanlar
Özelleşmiş jenerikler JDK 28'in parçası değil. Tip silme yüzünden, jenerik bir koleksiyona konan value nesnesi yine yığında somutlaşır, yani noktaların ArrayList'i düz olmayacak; düzleştirme doğrudan value tipindeki alanlar ve diziler için çalışıyor. Null'suz tipler, 128 bitlik kodlamalar ve gelişmiş ilkel boxing üzerine JEP 402'nin tam olgun sürümü de gelecekteki işler arasında.
Projenin kendisi 2014'e uzanıyor — James Gosling o dönem bunu "tek düğümde bağlanmış altı doktora" diye tanımlamıştı — ve bugünkü biçimine ulaşmadan önce beş prototipten geçti. JDK 28 uzun vadeli destek sürümü değil: Mart 2027 için planlanıyor ve bir sonraki LTS'in Eylül 2027'de JDK 29 olması bekleniyor. Erken erişim derlemeleri jdk.java.net/valhalla adresinde hazır.
SiTech — AI destekli web geliştirme
Hızlı ve modern web siteleri kuruyor, AI'yı gerçek iş akışlarına taşıyoruz. Projeniz veya sorunuz mu var? Yardımcı olmaktan mutluluk duyarız.