
Project Valhalla. տասնամյա աշխատանքը հասնում է JDK 28 — ինչ է փոխում JEP 401-ը
Oracle-ի ինժեներ Լոիս Ֆոլթանը հունիսի 15-ին հաստատեց, որ JEP 401-ը մտել է OpenJDK-ի հիմնական ռեպոզիտորիա և նպատակաուղղված է JDK 28-ին։ Հատկությունը գալիս է preview ձևով, և սա Valhalla նախագծի միայն առաջին մասն է։
JEP 401 (Value Classes and Objects) ինտեգրվել է OpenJDK-ի հիմնական ռեպոզիտորիայում և նպատակաուղղված է JDK 28-ին. այս մասին հունիսի 15-ին հաստատեց Oracle-ի ինժեներ Լոիս Ֆոլթանը։ Փոփոխությունն այնքան մեծ է, որ մյուս կոմիտերներին խնդրել են ձեռնպահ մնալ խոշոր commit-ներից ինտեգրման ընթացքում. միայն pull request-ը 1 816 ֆայլում ավելացնում է ավելի քան 197 հազար տող կոդ։
Հատկությունը գալիս է որպես preview՝ անջատված լռելյայն, այսինքն կաշխատի միայն --enable-preview դրոշակով։ JEP-ը վերանայած Բրայան Գյոտցը անմիջապես զսպեց սպասելիքները՝ անվանելով այն «Valhalla-ի միայն առաջին մասը»։
Խնդիրը. ամեն ինչ հղում է
Valhalla-ի կարգախոսը սկզբից եղել է՝ «կոդավորվում է որպես class, աշխատում է որպես int»։ Java-ում, բացի ութ պրիմիտիվներից, ամեն արժեք հղում է. փոփոխականը պահում է ցուցիչ դեպի heap-ում գտնվող օբյեկտը, ամեն օբյեկտ ունի իր վերնագիրը, և ամեն օբյեկտ պետք է հատկացվի, ապա մաքրվի garbage collector-ի կողմից։ Միլիոն կետից բաղկացած զանգվածը գործնականում միլիոն ցուցիչ է դեպի հիշողության մեջ ցրված միլիոն տուփեր.
Խտությունը կարևոր է, որովհետև սարքավորումները փոխվել են լեզվից արագ. պրոցեսորը հիշողությունը կարդում է 64 բայթանոց cache line-երով, այնպես որ հարակից տվյալները միանգամից մի քանի արժեք են բերում, մինչդեռ ցուցիչներով թռիչքը վտանգում է cache miss-եր, որոնք կարող են հարյուր անգամ դանդաղ լինել։
Ինչ է բերում JDK 28-ը
JEP 401-ը ներկայացնում է մեկ նոր հասկացություն՝ value class, որը հայտարարվում է value մոդիֆիկատորով, իսկ դրա օրինակները value օբյեկտներ են՝ առանց ինքնության։ Նույն դաշտերով երկու առանձին ստեղծված value օբյեկտներ փոխարինելի են, այդ պատճառով ==-ը դառնում է փոխարինելիության ստուգում, ոչ թե հասցեների համեմատում, իսկ նման տիպի վրա synchronized-ը նետում է IdentityException։ Value class-ները լռելյայն final են, դրանց դաշտերը՝ ենթադրաբար final, իսկ մեթոդները չեն կարող synchronized լինել. դրանք դեռ կարող են null լինել, քանի որ null չթույլատրող տիպերը առանձին JEP են։
JVM-ը ստանում է երկու օպտիմիզացիա։ Scalarization-ը թույլ է տալիս JIT-ին քայքայել value օբյեկտը դաշտերի և ընդհանրապես հրաժարվել հատկացումից, իսկ heap flattening-ը արժեքը գրում է ուղիղ դաշտի կամ զանգվածի բջիջի մեջ։ Հարթեցված տվյալները պետք է կարդալ ու գրել ատոմար կերպով, ինչը այսօր նշանակում է մոտ 64 բիթ՝ ներառյալ null դրոշակը, այդ պատճառով որոշ փոքր class-ներ դեռ հայտնվում են heap-ում։ Preview-ի միացմամբ JDK-ի սեփական փաթաթող class-ները, օրինակ Integer-ը, դառնում են value class-ներ, ինչը պետք է էապես էժանացնի boxing-ը։
Ինչ դեռ բացակայում է
Մասնագիտացված ջեներիկները JDK 28-ի մաս չեն։ Type erasure-ի պատճառով ջեներիկ հավաքածուի մեջ դրված value օբյեկտը դեռ նյութականանում է heap-ում, այնպես որ կետերի ArrayList-ը հարթ չի լինի. հարթեցումն աշխատում է ուղիղ value տիպի դաշտերի և զանգվածների համար։ Null չթույլատրող տիպերը, 128-բիթանոց կոդավորումները և JEP 402-ի ամբողջովին հասուն տարբերակը նույնպես ապագայի աշխատանք են։
Նախագիծն ինքը սկսվել է 2014 թվականին. Ջեյմս Գոսլինգն այն ժամանակ այն նկարագրել է որպես «մեկ հանգույցում կապված վեց PhD»։ Անցել է հինգ նախատիպերով, նախքան իր ներկայիս տեսքին հասնելը։ JDK 28-ը երկարաժամկետ աջակցության թողարկում չէ. այն նախատեսված է 2027 թվականի մարտին, իսկ հաջորդ LTS-ը, հավանաբար, կլինի JDK 29-ը՝ 2027 թվականի սեպտեմբերին։ Early-access կառուցումներն արդեն հասանելի են jdk.java.net/valhalla հասցեով։
SiTech — AI-ով հզորացված վեբ մշակում
Ստեղծում ենք արագ ու ժամանակակից կայքեր և AI-ը ներդնում իրական բիզնես գործընթացներում։ Ունե՞ք նախագիծ կամ հարց։ Ուրախ կլինենք օգնել։