Java Valhalla Project

1. Áttekintés

Ebben a cikkben a Project Valhalla-t fogjuk megvizsgálni - annak történelmi okait, a fejlesztés jelenlegi állapotát és azt, hogy mit hoz az asztalra a napi Java-fejlesztő a megjelenés után.

2. A Valhalla-projekt motivációja és okai

Az egyik beszélgetésében Brian Goetz, az Oracle Java nyelvi építésze elmondta, hogy a Valhalla Project egyik fő motivációja az a vágy, hogy adaptálja a Java nyelvet és futási időt a modern hardverekhez. Amikor a Java nyelvet megfogalmazták (nagyjából 25 évvel ezelőtt az írás idején), a memórialetöltés és a számtani művelet költsége nagyjából megegyezett.

Manapság ez elmozdult, a memórialetöltési műveletek 200-ról 1000-szer drágábbak, mint a számtani műveletek. A nyelvtervezés szempontjából ez azt jelenti, hogy a mutatóhíváshoz vezető indirekciók káros hatással vannak az általános teljesítményre.

Mivel a legtöbb Java adatstruktúra egy objektum, objektumnak tekinthetjük a Java-t (bár általában nem látjuk és nem manipuláljuk őket közvetlenül). Az objektumok ezen mutatóalapú megvalósítását az objektumidentitás engedélyezésére használják, amely maga is kihasználja azokat a nyelvi jellemzőket, mint a polimorfizmus, a mutabilitás és a zárolás. Ezek a funkciók alapértelmezés szerint minden objektumra vonatkoznak, függetlenül attól, hogy valóban szükség van-e rájuk vagy sem.

A mutatókhoz vezető indirektek és az indirekcióhoz vezető mutatók láncolatát követve, a teljesítmény hátrányokkal járó indirekciókkal logikus következtetés az, hogy eltávolítjuk azokat az adatstruktúrákat, amelyekre nincs szükség rájuk. Itt jönnek létre az értéktípusok.

3. Értéktípusok

Az értéktípusok ötlete az, hogy tiszta adat-összesítéseket jelentenek. Ez a szokásos objektumok jellemzőinek elvetésével jár. Tehát tiszta adatokkal rendelkezünk, identitás nélkül. Ez természetesen azt jelenti, hogy elveszítjük azokat a funkciókat is, amelyeket az objektum-identitás használatával megvalósíthatunk. Ennek következtében az egyenlőség összehasonlítása csak állapot alapján történhet meg. Így nem használhatunk reprezentációs polimorfizmust, és nem használhatunk megváltoztathatatlan vagy nem nullázható objektumokat.

Mivel már nincs objektumidentitásunk, lemondhatunk a mutatókról és megváltoztathatjuk az értéktípusok általános memóriaelrendezését, összehasonlítva egy objektummal. Nézzük meg a memória elrendezésének összehasonlítását az osztály között Pont és a hozzá tartozó értéktípus Pont.

A szabály és a megfelelő memória elrendezése Pont osztály a következő lenne:

végső osztály Pont {final int x; végső int y; }

Másrészt az értéktípus kódja és a hozzá tartozó memória elrendezés Pont lenne:

értékosztály Pont {int x; int y}

Ez lehetővé teszi a JVM számára, hogy az értéktípusokat tömbökbe és objektumokba, valamint más értéktípusokba simítsa. A következő ábrán a indirekciók negatív hatását mutatjuk be, amikor a Pont osztály egy tömbben:

Másrészt itt egy értéktípus megfelelő memóriaszerkezetét látjuk Pont[]:

Lehetővé teszi továbbá a JVM számára, hogy értéktípusokat adjon át a veremben ahelyett, hogy kiosztaná őket a kupacban. Végül ez azt jelenti, hogy olyan adatösszesítéseket kapunk, amelyek futásidejű viselkedése hasonló a Java primitívekhez, mint pl int vagy úszó.

De a primitívektől eltérően az értéktípusoknak lehetnek módszereik és mezők. Felületeket is megvalósíthatunk és általános típusként használhatunk. Tehát kétféle szempontból tekinthetjük meg az értéktípusokat:

  • Gyorsabb tárgyak
  • A felhasználó által meghatározott primitívek

További habként a tortán értéktípusokat használhatunk általános típusként bokszolás nélkül. Ez közvetlenül a másik nagy projekt Valhalla funkcióhoz vezet: a speciális generikus gyógyszerekhez.

4. Speciális generikusok

Amikor nyelvi primitíveket akarunk generálni, jelenleg dobozos típusokat használunk, mint pl Egész szám mert int vagy Úszó mert úszó. Ez az ökölvívás további indirekciós réteget hoz létre, ezáltal elsõsorban kiküszöbölve a primitívek teljesítménynövelési célját.

Ezért számos dedikált specializációt látunk a primitív típusok számára a meglévő keretrendszerekben és könyvtárakban IntStream vagy ToIntFunction. Ennek célja a primitívek teljesítményének javítása.

Tehát a speciális generikus gyógyszerek arra törekszenek, hogy megszüntessék ezeknek a „csapkodásoknak” az igényeit. Ehelyett a Java nyelv arra törekszik, hogy alapvetően mindenhez engedélyezze az általános típusokat: objektumhivatkozások, primitívek, értéktípusok és talán még üres.

5. Következtetés

Pillantást vetettünk azokra a változásokra, amelyeket a Project Valhalla a Java nyelvében meg fog hozni. A két fő cél a fokozott teljesítmény és a kevésbé szivárgó absztrakciók.

A teljesítménynöveléseket az objektumgrafikonok ellapításával és a bekerülések eltávolításával lehet megoldani. Ez hatékonyabb memóriaelrendezéshez, kevesebb kiosztáshoz és szemétszállításhoz vezet.

A jobb absztrakció olyan primitívekkel és tárgyakkal jár, amelyek hasonlóbb viselkedéssel bírnak, ha általános típusként használják.

A Valhalla Project egy korai prototípusa, amely értéktípusokat vezet be a meglévő típusú rendszerbe, LW1 kódnévvel rendelkezik.

További információt találhatunk a Valhalla projektről a megfelelő projektoldalon és a JEP-ekről:

  • Valhalla projekt
  • JEP 169: Értékobjektumok
  • JEP 218: Generikusok a primitív típusok felett