Java Valhalla-projekt

1. Oversigt

I denne artikel vil vi se på Project Valhalla - de historiske grunde til det, den aktuelle udviklingstilstand og hvad det bringer til bordet for den daglige Java-udvikler, når den først er frigivet.

2. Motivation og grunde til Valhalla-projektet

I en af ​​sine foredrag sagde Brian Goetz, Java-sprogarkitekt hos Oracle, at en af ​​hovedmotiverne for Valhalla-projektet er ønsket om at tilpasse Java-sprog og runtime til moderne hardware. Da Java-sproget blev udtænkt (for cirka 25 år siden i skrivende stund), omkostningerne ved en hukommelseshentning og en aritmetisk operation var nogenlunde de samme.

I dag er dette skiftet, hvor hukommelseshentningsoperationer er fra 200 til 1.000 gange dyrere end aritmetiske operationer. Med hensyn til sprogdesign betyder dette, at omdirigeringer, der fører til markørhentninger, har en skadelig virkning på den samlede præstation.

Da de fleste Java-datastrukturer i en applikation er objekter, kan vi betragte Java som et tungt sprog (selvom vi normalt ikke ser eller manipulerer dem direkte). Denne pointerbaserede implementering af objekter bruges til at muliggøre objektidentitet, som i sig selv er udnyttet til sprogfunktioner som polymorfisme, mutabilitet og låsning. Disse funktioner kommer som standard for hvert objekt, uanset om det virkelig er nødvendigt eller ej.

Efter kæden af ​​identitet, der fører til pegepinde og pegepunkter, der fører til indirektioner, med indirektioner med præstationsnedsættelser, er en logisk konklusion at fjerne dem til datastrukturer, der ikke har noget behov for dem. Det er her, værdityper spiller ind.

3. Værdityper

Idéen med værdityper er at repræsenterer rene dataggregater. Dette kommer med at droppe funktionerne i almindelige objekter. Så vi har rene data uden identitet. Dette betyder selvfølgelig, at vi også mister funktioner, vi kan implementere ved hjælp af objektidentitet. Som følge heraf lighedssammenligning kan kun ske baseret på stat. Således kan vi ikke bruge repræsentativ polymorfisme, og vi kan ikke bruge uforanderlige eller ikke-ugyldige objekter.

Da vi ikke længere har objektidentitet, kan vi opgive pegepinde og ændre det generelle hukommelseslayout for værdityper sammenlignet med et objekt. Lad os se på en sammenligning af hukommelseslayoutet mellem klassen Punkt og den tilsvarende værditype Punkt.

Koden og det tilsvarende hukommelseslayout for en almindelig Punkt klasse ville være:

sidste klasse Punkt {endelig int x; endelig int y; }

På den anden side koden og det tilsvarende hukommelseslayout af en værditype Punkt ville være:

værdiklasse Punkt {int x; int y}

Dette gør det muligt for JVM at flade værdityper ind i arrays og objekter såvel som i andre værdityper. I det følgende diagram præsenterer vi den negative effekt af indirektioner, når vi bruger Punkt klasse i en matrix:

På den anden side ser vi den tilsvarende hukommelsesstruktur af en værditype Punkt[]:

Det gør det også muligt for JVM at videregive værdityper på stakken i stedet for at skulle allokere dem på bunken. I sidste ende betyder det, at vi får dataaggregater, der har runtime-opførsel svarende til Java primitiver, såsom int eller flyde.

Men i modsætning til primitiver kan værdityper have metoder og felter. Vi kan også implementere grænseflader og bruge dem som generiske typer. Så vi kan se på værdityperne fra to forskellige vinkler:

  • Hurtigere genstande
  • Brugerdefinerede primitiver

Som ekstra prikken over i'et kan vi bruge værdityper som generiske typer uden boksning. Dette fører os direkte til den anden store Project Valhalla-funktion: specialiserede generika.

4. Specialiserede generika

Når vi vil generere over sprogprimitiver, bruger vi i øjeblikket boksede typer, f.eks Heltal til int eller Flyde til flyde. Denne boksning skaber et ekstra lag af indirektion, hvorved formålet med at bruge primitiver til præstationsforbedring i første omgang besejres.

Derfor ser vi mange dedikerede specialiseringer til primitive typer i eksisterende rammer og biblioteker, som f.eks IntStream eller ToIntFunction. Dette gøres for at holde præstationsforbedringen ved brug af primitiver.

Så specialiserede generika er et forsøg på at fjerne behovene for disse "hacks". I stedet stræber Java-sproget efter at aktivere generiske typer til stort set alt: objektreferencer, primitiver, værdityper og måske endda ugyldig.

5. Konklusion

Vi har fået et glimt af de ændringer, som Project Valhalla vil bringe til Java-sproget. To af hovedmålene er forbedret ydeevne og mindre utætte abstraktioner.

Ydelsesforbedringerne tackles ved at udflade objektgrafer og fjerne indirektioner. Dette fører til mere effektive hukommelseslayouts og færre allokeringer og affaldssamlinger.

Jo bedre abstraktion kommer med primitiver og objekter, der har en mere lignende adfærd, når de bruges som generiske typer.

En tidlig prototype af Project Valhalla, der introducerer værdityper i det eksisterende typesystem, har kodenavnet LW1.

Vi kan finde mere information om Project Valhalla på den tilsvarende projektside og JEP'er:

  • Projekt Valhalla
  • JEP 169: Værdiobjekter
  • JEP 218: Generics over primitive typer

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