Projekt Java Valhalla

1. Pregled

U ovom ćemo članku pogledati projekt Valhalla - povijesne razloge za njega, trenutno stanje razvoja i ono što donosi na stol za svakodnevnog razvojnog programera Java nakon što bude objavljen.

2. Motivacija i razlozi za projekt Valhalla

U jednom od svojih razgovora, Brian Goetz, arhitekt Java jezika u Oracleu, rekao je da je jedna od glavnih motivacija za projekt Valhalla želja prilagoditi Java jezik i vrijeme izvođenja suvremenom hardveru. Kada je zamišljen jezik Java (prije otprilike 25 godina u vrijeme pisanja ovog članka), troškovi dohvaćanja memorije i aritmetičke operacije bili su približno jednaki.

U današnje vrijeme to se promijenilo, jer su operacije dohvaćanja memorije od 200 do 1.000 puta skuplje od aritmetičkih operacija. Što se tiče jezičnog dizajna, to znači da indirektne smjernice koje dovode do dohvata pokazivača štetno utječu na cjelokupnu izvedbu.

Budući da su većina Java struktura podataka u aplikaciji objekti, Java možemo smatrati jezikom teškim za pokazivače (iako ih obično ne vidimo ili ne manipuliramo izravno). Ova implementacija objekata zasnovana na pokazivaču koristi se za omogućavanje identiteta objekta, koji se sam koristi za jezične značajke kao što su polimorfizam, promjenjivost i zaključavanje. Te značajke dolaze prema zadanim postavkama za svaki objekt, bez obzira jesu li stvarno potrebne ili ne.

Slijedom lanca identiteta koji vodi do pokazivača i pokazivača koji vode do neizravnosti, s neizravnostima koje imaju nedostatke u izvedbi, logičan je zaključak ukloniti one za strukture podataka koji za njima nemaju potrebe. Tu nastupaju vrste vrijednosti.

3. Vrste vrijednosti

Ideja tipova vrijednosti je da predstavljaju čiste agregate podataka. To dolazi s ispuštanjem značajki regularnih predmeta. Dakle, imamo čiste podatke, bez identiteta. To naravno znači da gubimo i značajke koje bismo mogli implementirati pomoću identiteta objekta. Posljedično, usporedba jednakosti može se dogoditi samo na temelju stanja. Dakle, ne možemo koristiti reprezentativni polimorfizam i ne možemo koristiti nepromjenjive ili ne-poništavajuće objekte.

Budući da više nemamo identitet objekta, možemo odustati od pokazivača i promijeniti opći raspored memorije vrsta vrijednosti u usporedbi s objektom. Pogledajmo usporedbu rasporeda memorije između razreda Točka i odgovarajući tip vrijednosti Točka.

Kôd i odgovarajući raspored memorije redovitog Točka razred bi bio:

završni razred Point {final int x; konačni int y; }

S druge strane, kod i odgovarajući raspored memorije vrste vrijednosti Točka bilo bi:

razred vrijednosti Point {int x; int y}

To omogućuje JVM-u da izravna vrste vrijednosti u nizove i objekte, kao i u druge vrste vrijednosti. U slijedećem dijagramu prikazujemo negativni učinak neizravnosti kada koristimo Točka klasa u nizu:

S druge strane, ovdje vidimo odgovarajuću memorijsku strukturu vrijednosnog tipa Točka[]:

Također omogućuje JVM-u da prenosi vrste vrijednosti na stog, umjesto da ih mora dodijeliti na hrpu. Na kraju, to znači da dobivamo agregate podataka koji se ponašaju u vrijeme izvođenja slično Java primitivima, kao što je int ili plutati.

Ali za razliku od primitiva, tipovi vrijednosti mogu imati metode i polja. Također možemo implementirati sučelja i koristiti ih kao generičke tipove. Dakle, vrste vrijednosti možemo promatrati iz dva različita kuta:

  • Brži predmeti
  • Korisnički definirani primitivi

Kao dodatni šlag na torti, možemo koristiti vrijednosne vrste kao generičke vrste bez boksa. To nas izravno vodi do druge velike značajke Project Valhalle: specijaliziranih generičkih lijekova.

4. Specijalizirani generički lijekovi

Kada želimo generirati preko jezičnih primitiva, trenutačno koristimo uokvirene tipove, kao što je Cijeli broj za int ili Plutati za plutati. Ovaj boks stvara dodatni indirektni sloj, čime se poražava svrha korištenja primitivaca za poboljšanje performansi.

Stoga u postojećim okvirima i knjižnicama vidimo brojne namjenske specijalizacije za primitivne tipove IntStream ili ToIntFunction. To je učinjeno kako bi se poboljšale performanse korištenja primitiva.

Dakle, specijalizirani generički lijekovi nastoje ukloniti potrebe za tim "hakovima". Umjesto toga, jezik Java nastoji omogućiti generičke tipove za gotovo sve: reference na objekte, primitive, vrste vrijednosti, a možda čak i poništiti.

5. Zaključak

Bacili smo pogled na promjene koje će Project Valhalla unijeti u jezik Java. Dva su glavna cilja poboljšane performanse i manje propusne apstrakcije.

Poboljšanja izvedbe rješavaju se izravnavanjem grafova objekata i uklanjanjem indirektnih smjernica. To dovodi do učinkovitijih rasporeda memorije i manjeg izdvajanja i prikupljanja smeća.

Bolja apstrakcija dolazi s primitivima i objektima koji imaju sličnije ponašanje kada se koriste kao generički tipovi.

Rani prototip projekta Valhalla, koji uvodi vrste vrijednosti u postojeći sustav tipova, ima kodno ime LW1.

Više informacija o projektu Valhalla možemo pronaći na odgovarajućoj stranici projekta i JEP-ovima:

  • Projekt Valhalla
  • JEP 169: Objekti vrijednosti
  • JEP 218: Generički lijekovi nad primitivnim vrstama