Java 8 vs Scala Lambdat bytecode tasolle

Java 8 julkaistiin pitkän odottelun jälkeen, ja viimein kieleen saatiin Lambda lausekkeet – sekä niitä hyödyntäviä rajapintoja aikaiseksi. Monessa muussa kielessä Lambdat ovat olleet jo pitkään, ja voidaan ehkä sanoa että Scala popularisoi ne. Jäin miettimään onko Java ja Scala lambdatoteutuksissa eroja bytecodetasolla, molemmat kun ovat käännettäviä kieliä. Törmäsin kiintoisaan artikkeliin:

 

http://www.takipiblog.com/2014/01/16/compiling-lambda-expressions-scala-vs-java-8/

 

Aikanaan kun Scala tehtiin, kieleen lisättiin monenlaisia rakenteita jotka toteutetaan aika rajulla bytecode teurastuksella. Esim. funktio ilman luokkaa ei ole Javassa ollut mahdollinen, joten Scalassa on luotu keinotekoisia luokkia jos johonkin väliin. Lopputulos on kielen osalta hieno ja innovatiivinen mutta bytecode tasolla vähän purkkaviritystä.

Java 8 toteuttaa Lambdat käyttäen Java 7:ssä lisättyä uutta bytecode tason piirrettä nimeltä invokevirtual. Näin vältetään purkkaviritykset väliin, ja funktio voidaan luoda sellaisenaan. Syntyvä bytecode on paljon mutkattomampaa. Suorituskyvystä ei artikkelissa puhuttu mutta voisin arvata että senkin suhteen Java 8 vetää pisteet kotiin.

Eli koska rakastan kovasti Scala kielellä koodailua – se tuntuu raikkaan keväiseltä hengähdykseltä – tässä toivelista Scala piirteille joita pitäisi ottaa kiinni:

– Sama optimointi: Käytetään Java 7 invokedynamic piirteitä

– Samantien voitaisiin toteuttaa vähäisemmät Java 7 Coin piirteet: binääriliteraalit, try-with-resources (AutoCloseable), alaviivat numeroiden ryhmittämiseen (tämä ei ehkä onnistu ollenkaan koska villikortti), jne.

Advertisements

Vastaa

Täytä tietosi alle tai klikkaa kuvaketta kirjautuaksesi sisään:

WordPress.com-logo

Olet kommentoimassa WordPress.com -tilin nimissä. Log Out / Muuta )

Twitter-kuva

Olet kommentoimassa Twitter -tilin nimissä. Log Out / Muuta )

Facebook-kuva

Olet kommentoimassa Facebook -tilin nimissä. Log Out / Muuta )

Google+ photo

Olet kommentoimassa Google+ -tilin nimissä. Log Out / Muuta )

Muodostetaan yhteyttä palveluun %s