უკან დაბრუნება
Project Valhalla: ათწლეულის მუშაობა JDK 28-ში შედის — რას ნიშნავს JEP 401
SiTech AI Team2 წთ. საკითხავი

Project Valhalla: ათწლეულის მუშაობა JDK 28-ში შედის — რას ნიშნავს JEP 401

Oracle-ის ინჟინერმა ლოის ფოლთანმა 15 ივნისს დაადასტურა, რომ JEP 401 უკვე OpenJDK-ის მთავარ რეპოზიტორიაშია და JDK 28-ს უმიზნებს. ცვლილება preview-რეჟიმში მოდის და ჯერჯერობით Valhalla-ს მხოლოდ პირველი ნაწილია.

Oracle-ის ინჟინერმა ლოის ფოლთანმა 15 ივნისს დაადასტურა, რომ JEP 401 (Value Classes and Objects) OpenJDK-ის მთავარ რეპოზიტორიაში ინტეგრირდა და JDK 28-ს უმიზნებს. ცვლილება იმდენად დიდია, რომ სხვა კომიტერებს ინტეგრაციის დროს დიდი commit-ებისგან თავის შეკავება სთხოვეს: მხოლოდ pull request 1 816 ფაილში 197 ათასზე მეტ სტრიქონს ამატებს.

ფუნქცია preview-რეჟიმში მოდის და ნაგულისხმევად გამორთულია, ანუ იმუშავებს მხოლოდ --enable-preview დროშით. ბრაიან გიოტცი, რომელმაც JEP განიხილა, მაშინვე აკორდა მოლოდინებს და მას „Valhalla-ს მხოლოდ პირველი ნაწილი" უწოდა.

პრობლემა: ყველაფერი მითითებაა

Valhalla-ს დევიზი თავიდანვე ასე ჟღერს: „კოდირდება როგორც კლასი, მუშაობს როგორც int". Java-ში, რვა პრიმიტივის გარდა, ყველა მნიშვნელობა მითითებაა: ცვლადი heap-ზე მდებარე ობიექტის მაჩვენებელს ინახავს, თითოეულ ობიექტს საკუთარი სათაური აქვს და ყოველი ობიექტი უნდა გამოიყოს, შემდეგ კი ნაგვის შემგროვებელმა გაასუფთაოს. მილიონი წერტილის მასივი პრაქტიკაში მილიონი მაჩვენებელია მეხსიერებაში მიმოფანტული მილიონი ყუთისკენ

სიმჭიდროვე მნიშვნელოვანია, რადგან აპარატურა ენაზე უფრო სწრაფად შეიცვალა: პროცესორი მეხსიერებას 64-ბაიტიანი cache line-ებით კითხულობს, ამიტომ მიმდევრობითი მონაცემები ერთდროულად რამდენიმე მნიშვნელობას მოაქვს, მაჩვენებლებზე ხტომა კი cache miss-ის რისკს ქმნის, რაც დარტყმაზე ასჯერ ნელი შეიძლება იყოს.

რას მოაქვს JDK 28

JEP 401 ერთ ახალ ცნებას შემოაქვს: value class, რომელიც value მოდიფიკატორით ცხადდება და რომლის ეგზემპლარები იდენტობის გარეშე value-ობიექტებია. ერთი და იმავე ველებით ცალ-ცალკე შექმნილი ორი value-ობიექტი ურთიერთშემცვლელია, ამიტომ == ხდება ჩანაცვლებადობის შემოწმება და არა მისამართების შედარება, ხოლო ასეთ ტიპზე synchronized IdentityException-ს ისვრის. Value-კლასები ნაგულისხმევად final-ია, მათი ველები — იმპლიციტურად final, მეთოდების სინქრონიზაცია კი აკრძალულია; ისინი მაინც შეიძლება იყოს null — null-ის აკრძალვა ცალკე JEP-ია.

JVM ორ ოპტიმიზაციას იძენს. სკალარიზაცია JIT-ს საშუალებას აძლევს, value-ობიექტი ველებად დააშალოს და გამოყოფაზე საერთოდ უარი თქვას; heap flattening კი მნიშვნელობას პირდაპირ ველში ან მასივის უჯრაში წერს. გაბრტყელებული მონაცემები ატომურად უნდა იკითხებოდეს და იწერებოდეს, რაც დღეს null-ის დროშის ჩათვლით დაახლოებით 64 ბიტს ნიშნავს, ამიტომ ზოგი პატარა კლასი მაინც heap-ზე რჩება. Preview-ის ჩართვით JDK-ის საკუთარი მფარავი კლასები, მაგალითად Integer, value-კლასებად იქცევიან, რაც boxing-ის ღირებულებას მნიშვნელოვნად შეამცირებს.

რა ჯერ არ არის

სპეციალიზებული ჯენერიკები JDK 28-ის ნაწილი არ არის. ტიპების წაშლის გამო ჯენერიკ კოლექციაში მოთავსებული value-ობიექტი მაინც heap-ზე მატერიალიზდება, ამიტომ წერტილების ArrayList ჯერ არ იქნება ბრტყელი; გაბრტყელება პირდაპირ value-ტიპის ველებსა და მასივებზე მუშაობს. null-ის აკრძალვა, 128-ბიტიანი კოდირებები და JEP 402-ის სრულად მომწიფებული ვერსია პრიმიტივების გაუმჯობესებული boxing-ის შესახებ — ასევე მომავლის საქმეა.

თავად პროექტი 2014 წლიდან მოდის — ჯეიმს გოსლინგმა მაშინ მას „ერთ კვანძად შეკრული ექვსი დოქტორი" უწოდა — და ხუთ პროტოტიპზე გაიარა, სანამ დღევანდელ ფორმას მიაღწია. JDK 28 გრძელვადიანი მხარდაჭერის გამოშვება არ არის: ის 2027 წლის მარტისთვისაა დაგეგმილი, შემდეგი LTS კი, სავარაუდოდ, JDK 29 იქნება 2027 წლის სექტემბერში. Early-access-ის ნაგებობები უკვე ხელმისაწვდომია jdk.java.net/valhalla-ზე.

SSiTech

SiTech — AI-გაძლიერებული ვებ დეველოპმენტი

ვქმნით სწრაფ, თანამედროვე ვებსაიტებს და AI-ს ვაერთიანებთ ქართული ბიზნესებისთვის. გაქვთ პროექტი ან კითხვა? სიამოვნებით დაგეხმარებით.