Projekt Java Valhalla

1. Prehľad

V tomto článku sa pozrieme na projekt Valhalla - jeho historické dôvody, súčasný stav vývoja a to, čo prináša tabuľka pre denného vývojára Javy po jej vydaní.

2. Motivácia a dôvody projektu Valhalla

Brian Goetz, architekt jazyka Java v spoločnosti Oracle, v jednom zo svojich vystúpení uviedol, že jednou z hlavných motivácií pre projekt Valhalla je túžba prispôsobiť jazyk Java a runtime modernému hardvéru. Keď bol vytvorený jazyk Java (zhruba pred 25 rokmi, v čase písania tohto článku), náklady na načítanie pamäte a aritmetickú operáciu boli zhruba rovnaké.

V dnešnej dobe sa to zmenilo a operácie načítania pamäte sú 200 až 1 000-krát drahšie ako aritmetické operácie. Pokiaľ ide o jazykový dizajn, znamená to, že indirecie vedúce k načítaniu ukazovateľov majú nepriaznivý vplyv na celkový výkon.

Pretože väčšina dátových štruktúr Javy v aplikácii sú objekty, môžeme považovať Javu za jazyk s ťažkým ukazovateľom (aj keď s nimi priamo priamo nevidíme alebo s nimi manipulujeme). Táto implementácia objektov založená na ukazovateľoch sa používa na povolenie identity objektu, ktorá sa sama využíva na jazykové vlastnosti, ako je polymorfizmus, premenlivosť a zamykanie. Tieto funkcie sú predvolene poskytované pre každý objekt bez ohľadu na to, či sú skutočne potrebné alebo nie.

Po reťazci identity vedúcej k ukazovateľom a smerníkom vedúcim k indirections, pričom indirections majú nevýhody výkonu, je logickým záverom ich odstránenie pre dátové štruktúry, ktoré ich nepotrebujú. Tu vstupujú do hry hodnotové typy.

3. Typy hodnôt

Myšlienka typov hodnôt je predstavujú čisté agregáty údajov. Toto prichádza s upustením od funkcií bežných objektov. Máme teda čisté údaje bez identity. To samozrejme znamená, že prichádzame aj o funkcie, ktoré by sme mohli implementovať pomocou identity objektu. Následne k rovnosti môže dôjsť iba na základe stavu. Nemôžeme teda použiť reprezentačný polymorfizmus a nemôžeme použiť nemenné alebo nullovateľné objekty.

Pretože už nemáme identitu objektu, môžeme sa vzdať ukazovateľov a zmeniť všeobecné rozloženie pamäte typov hodnôt v porovnaní s objektom. Pozrime sa na porovnanie rozloženia pamäte medzi triedou Bod a zodpovedajúci typ hodnoty Bod.

Kód a zodpovedajúce rozloženie pamäte bežného objektu Bod trieda by bola:

final class Point {final int x; konečná int y; }

Na druhej strane kód a zodpovedajúce rozloženie pamäte typu hodnoty Bod bolo by:

hodnotová trieda Bod {int x; int y}

Toto umožňuje JVM zlúčiť typy hodnôt do polí a objektov, ako aj do iných typov hodnôt. V nasledujúcom diagrame uvádzame negatívny vplyv indirection pri použití Bod trieda v poli:

Na druhej strane tu vidíme zodpovedajúcu štruktúru pamäte typu hodnoty Bod []:

Umožňuje tiež JVM odovzdávať typy hodnôt do zásobníka namiesto toho, aby ich musel alokovať na halde. Nakoniec to znamená, že dostávame dátové agregáty, ktoré majú behové správanie podobné Java primitívom, ako napr int alebo plavák.

Ale na rozdiel od primitívov, typy hodnôt môžu mať metódy a polia. Môžeme tiež implementovať rozhrania a použiť ich ako všeobecné typy. Na typy hodnôt sa teda môžeme pozrieť z dvoch rôznych uhlov pohľadu:

  • Rýchlejšie objekty
  • Používateľom definované primitívy

Ako ďalšiu čerešničku na torte môžeme použiť hodnotové typy ako generické typy bez škatuľkovania. To nás priamo vedie k ďalšej veľkej funkcii Project Valhalla: špecializovaným generikám.

4. Špecializované generiká

Keď chceme generovať nad jazykovými primitívmi, v súčasnosti používame krabicové typy, ako napr Celé číslo pre int alebo Plavák pre plavák. Tento box vytvára ďalšiu vrstvu smerovania, a tým na prvom mieste prekonáva účel použitia primitívov na zvýšenie výkonu.

Preto vidíme veľa špecializovaných špecializácií pre primitívne typy v existujúcich rámcoch a knižniciach IntStream alebo ToIntFunction. Toto sa robí kvôli udržaniu zlepšenia výkonu pri používaní primitívnych prostriedkov.

Špecializovaná generika je teda snahou odstrániť potreby týchto „hackov“. Namiesto toho sa jazyk Java snaží umožniť všeobecné typy v zásade pre všetko: odkazy na objekty, primitívy, typy hodnôt a možno aj neplatný.

5. Záver

Zahliadli sme zmeny, ktoré projekt Valhalla prinesie do jazyka Java. Dva z hlavných cieľov sú zvýšený výkon a menej deravé abstrakcie.

Vylepšenia výkonu sa riešia sploštením grafov objektov a odstránením indirectionov. To vedie k efektívnejšiemu rozloženiu pamäte a menšiemu počtu alokácií a zbierania odpadu.

Lepšia abstrakcia prichádza s primitívmi a objektmi, ktoré sa správajú podobnejšie, keď sa používajú ako generické typy.

Skorý prototyp projektu Valhalla, ktorý zavádza typy hodnôt do existujúceho systému typov, má krycie meno LW1.

Viac informácií o projekte Valhalla nájdete na príslušnej stránke projektu a JEP:

  • Projekt Valhalla
  • JEP 169: Hodnotové objekty
  • JEP 218: Generiká nad primitívnymi typmi

$config[zx-auto] not found$config[zx-overlay] not found