חזרה
פרויקט Valhalla: עשור של עבודה מגיע ל-JDK 28 — מה משנה JEP 401
SiTech AI Team3 წთ. საკითხავი

פרויקט Valhalla: עשור של עבודה מגיע ל-JDK 28 — מה משנה JEP 401

המהנדסת של אורקל לויס פולטן אישרה ב-15 ביוני כי JEP 401 נכנס למאגר הראשי של OpenJDK ומיועד ל-JDK 28. התכונה מגיעה בתצוגה מקדימה, והיא רק החלק הראשון של פרויקט Valhalla.

JEP 401 (Value Classes and Objects) שולב במאגר הראשי של OpenJDK ומיועד ל-JDK 28 — כך אישרה ב-15 ביוני המהנדסת של אורקל, לויס פולטן. השינוי גדול כל כך, שמפתחים אחרים התבקשו להימנע מקומיטים גדולים בזמן השילוב: בקשת המיזוג לבדה מוסיפה יותר מ-197 אלף שורות קוד ב-1,816 קבצים.

התכונה מגיעה בתצוגה מקדימה, כבויה כברירת מחדל, כך שהיא תפעל רק עם הדגל --enable-preview. בריאן גץ, שסיקר את ה-JEP, מיהר למתן ציפיות וכינה זאת ״רק החלק הראשון של Valhalla״.

הבעיה: הכול הוא הפניה

הסלוגן של Valhalla מאז ומתמיד הוא ״נכתב כמו מחלקה, עובד כמו int״. בג'אווה, למעט שמונת הטיפוסים הפרימיטיביים, כל ערך הוא הפניה: המשתנה מחזיק מצביע לאובייקט בערימה, לכל אובייקט יש כותרת משלו, וכל אובייקט צריך להיות מוקצה ובהמשך להיאסף על ידי ה-GC. מערך של מיליון נקודות הוא למעשה מיליון מצביעים למיליון קופסאות מפוזרות בזיכרון — פריסה שבריאן גץ כינה ״נפוחה״.

הצפיפות חשובה כי החומרה השתנתה מהר יותר מהשפה: המעבד קורא זיכרון בשורות מטמון של 64 בייט, כך שנתונים רציפים מגיעים כמה ערכים בבת אחת, בעוד מרדף אחרי מצביעים מסכן בהחמצות מטמון שעלולות להיות איטיות פי מאה.

מה מביא JDK 28

JEP 401 מציג מושג חדש אחד: value class, הנכתב עם המודיפייר value, שהמופעים שלו הם אובייקטי value ללא זהות. שני אובייקטי value שנוצרו בנפרד עם אותם שדות ניתנים להחלפה, ולכן == הופך לבדיקת החלפה ולא להשוואת כתובות, ו-synchronized על טיפוס כזה זורק IdentityException. מחלקות value הן סופיות כברירת מחדל, השדות שלהן סופיים באופן מרומז ואסור לסנכרן את המתודות שלהן; ובכל זאת הן עדיין יכולות להיות null, כי טיפוסים ללא null הם JEP נפרד ומאוחר יותר.

ה-JVM מקבל שתי אופטימיזציות. סקלריזציה מאפשרת ל-JIT לפרק אובייקט value לשדותיו ולוותר על ההקצאה, ושטיחה בערימה כותבת את הערך ישירות לשדה או לתא במערך. נתונים שטוחים חייבים להיקרא ולהיכתב באטומיות, וכיום המשמעות היא כ-64 ביט כולל דגל ה-null, כך שחלק מהמחלקות הקטנות עדיין יגיעו לערימה. כשהתצוגה המקדימה דלוקה, מחלקות העטיפה של ה-JDK עצמו, כמו Integer, הופכות למחלקות value, מה שאמור להוזיל משמעותית את ה-boxing.

מה עדיין חסר

ג'נריקות מיוחדות אינן חלק מ-JDK 28. בגלל מחיקת הטיפוסים, אובייקט value בתוך אוסף ג'נרי עדיין ממומש בערימה, כך ש-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 בתהליכי עבודה אמיתיים. יש לכם פרויקט או שאלה? נשמח לעזור.