Java Valhalla-prosjekt

1. Oversikt

I denne artikkelen vil vi se på Project Valhalla - de historiske årsakene til det, den nåværende utviklingen og hva den bringer til bordet for den daglige Java-utvikleren når den er utgitt.

2. Motivasjon og årsaker til Valhalla-prosjektet

I en av samtalene sa Brian Goetz, Java-språkarkitekt hos Oracle, at en av hovedmotivasjonene for Valhalla-prosjektet er ønsket om å tilpasse Java-språket og kjøretiden til moderne maskinvare. Da Java-språket ble unnfanget (for omtrent 25 år siden i skrivende stund), kostnadene for en hukommelse og en regning var omtrent den samme.

I dag har dette skiftet, med minnehentingsoperasjoner som er fra 200 til 1000 ganger dyrere enn aritmetiske operasjoner. Når det gjelder språkdesign, betyr dette at indireksjoner som fører til pekerehenter, har en skadelig effekt på den generelle ytelsen.

Siden de fleste Java-datastrukturer i et program er objekter, kan vi betrakte Java som et pekepungt språk (selv om vi vanligvis ikke ser eller manipulerer dem direkte). Denne pekerbaserte implementeringen av objekter brukes til å muliggjøre objektidentitet, som i seg selv er utnyttet for språkfunksjoner som polymorfisme, mutabilitet og låsing. Disse funksjonene kommer som standard for hvert objekt, uansett om de virkelig er nødvendige eller ikke.

Etter kjeden av identitet som fører til pekere og pekere som fører til indireksjoner, med indireksjoner som har ytelsesmessige ulemper, er en logisk konklusjon å fjerne dem for datastrukturer som ikke har behov for dem. Det er her verdityper spiller inn.

3. Verdityper

Ideen med verdityper er å representerer rene dataggregater. Dette kommer med å slippe funksjonene til vanlige gjenstander. Så vi har rene data uten identitet. Dette betyr selvfølgelig at vi også mister funksjoner vi kan implementere ved hjelp av objektidentitet. Følgelig, likestilling sammenligning kan bare skje basert på stat. Dermed kan vi ikke bruke representativ polymorfisme, og vi kan ikke bruke uforanderlige eller ikke-nullbare gjenstander.

Siden vi ikke har objektidentitet lenger, kan vi gi opp pekere og endre det generelle minneoppsettet for verdityper, sammenlignet med et objekt. La oss se på en sammenligning av minneoppsettet mellom klassen Punkt og tilsvarende verditype Punkt.

Koden og tilhørende minneoppsett for en vanlig Punkt klasse ville være:

sluttklasse Poeng {final int x; siste int y; }

På den annen side, koden og tilsvarende minneoppsett av en verditype Punkt ville vært:

verdiklasse Punkt {int x; int y}

Dette gjør at JVM kan flate verdityper til matriser og objekter, så vel som til andre verdityper. I det følgende diagrammet presenterer vi den negative effekten av retninger når vi bruker Punkt klasse i en matrise:

På den annen side ser vi den tilsvarende minnestrukturen av en verditype Punkt[]:

Det gjør det også mulig for JVM å overføre verdityper på bunken i stedet for å måtte tildele dem på bunken. Til slutt betyr dette at vi får dataaggregater som har kjøretidsoppførsel som ligner på Java primitiver, for eksempel int eller flyte.

Men i motsetning til primitiver kan verdityper ha metoder og felt. Vi kan også implementere grensesnitt og bruke dem som generiske typer. Så vi kan se på verdityper fra to forskjellige vinkler:

  • Raskere gjenstander
  • Brukerdefinerte primitiver

Som ekstra prikken over i-en kan vi bruke verdityper som generiske typer uten boksing. Dette fører oss direkte til den andre store Project Valhalla-funksjonen: spesialiserte generika.

4. Spesialiserte generika

Når vi ønsker å generere over språkprimitiver, bruker vi for tiden boksede typer, for eksempel Heltall til int eller Flyte til flyte. Denne boksen skaper et ekstra lag med indireksjon, og ødelegger dermed formålet med å bruke primitiver for ytelsesforbedring i utgangspunktet.

Derfor ser vi mange dedikerte spesialiseringer for primitive typer i eksisterende rammer og biblioteker, som IntStream eller ToIntFunction. Dette er gjort for å opprettholde ytelsesforbedringen ved bruk av primitiver.

Så spesialiserte generiske legemidler er et forsøk på å fjerne behovene for disse "hackene". I stedet forsøker Java-språket å aktivere generiske typer for i utgangspunktet alt: objektreferanser, primitiver, verdityper og kanskje til og med tomrom.

5. Konklusjon

Vi har fått et glimt av endringene som Project Valhalla vil bringe til Java-språket. To av hovedmålene er forbedret ytelse og mindre utett abstraksjoner.

Ytelsesforbedringene takles ved å flate objektgrafer og fjerne indireksjoner. Dette fører til mer effektive minnelayouter og færre tildelinger og søppelsamling.

Bedre abstraksjon kommer med primitive og objekter som har en mer lignende oppførsel når de brukes som generiske typer.

En tidlig prototype av Project Valhalla, som introduserer verdityper i det eksisterende typesystemet, har kodenavnet LW1.

Vi finner mer informasjon om Prosjekt Valhalla på tilsvarende prosjektside og JEP:

  • Prosjekt Valhalla
  • JEP 169: Verdiobjekter
  • JEP 218: Generics over primitive typer

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