På tide med nytt programmeringsspråk?

Det har de siste årene vært mye snakk om nye programmeringsspråk på eksisterende plattformer. For eksempel F# og IronPython som alternativer til C# på .NET og Scala, JRuby og Groovy som alternativer til Java på JVM. I og med at C# er et mer oppdatert språk enn Java (noen eksempel) er det kanskje på JVM en ser størst behov for å vurdere alternative språk. Denne artikkelen tar for seg noen av de mest sentrale språkene på JVM-plattformen, og hvilken rolle jeg tror de kommer til å spille i tiden fremover. Mye av dette er basert på min masteroppgave fra 2010 hvor jeg sammenlignet JVM språk med tanke på utvikling av domene-spesifikke språk.

NB! Jeg skriver ingen kodeeksempel i denne posten. For et kjapt inntrykk av hvordan språkene ser ut kan du se på min post om Closures i Java 8 og alternativene.

Oversikt over JVM språk

Bildet viser en oversikt over språk som er tilgjengelige på JVM i følge Wikipedia.

 

Hva er problemet med Java?

Java-språket har helt fra starten av vært fokusert på å være stabilt og bakoverkompatibelt. Man har hele tiden vært restriktive på hva man ønsker å legge til av nye egenskaper i språket. Den største endringen vi har sett så langt var i 2004 da Java 5 ble lansert, med egenskaper som generics, annotations, enum, vararg, autoboxing, static imports og en mer kompakt for-loop. Dette var store og sårt tiltrengte forbedringer på Java-språket. Dessverre har vi omtrent ikke sett nye språk-egenskaper de siste 7 årene, og Java blir i dag av mange oppfattet som utdatert og alt for ordrikt (eng: verbose – man skriver mye tekst for å uttrykke lite). Det kommer noen mindre endringer i Java 7 (planlagt utgivelse i år – 2011), og noe mer i Java 8 (planlagt sent 2012). Den største endringen man venter på er støtte for lambda uttrykk (populært omtalt som closures) i Java 8, noe C# har hatt siden versjon 3 (2007) og mange andre språk har hatt helt fra starten av. Dette vil være viktig for Java, men er det nok til at man ikke burde vurdere alternative språk? Er vi villige til å vente enda 2 år på en enkel utgave av noe man har kunnet gjort i andre språk lenge? Jeg mener vi i langt større grad burde vurdere alternative språk som tilbyr en rekke egenskaper man ikke har, og aldri kommer til å få, i Java. De neste avsnittene tar for seg hvert av disse språkene og forklarer med enkle eksempel hvorfor de kan være bedre enn Java. Alle språkene er 100% kompatible med Java, og kjører på JVM plattformen hvor de i stor grad kan bruke eksisterende biblioteker og verktøy.

Scala

Scala er et statisk typet og kompilert språk, akkurat som Java. Første versjon ble utgitt i 2003, men det er først de siste årene populariteten virkelig har økt. Scala er et såkalt multi-paradigme språk, hvor målet er å kombinere både objekt-orientert og funksjonell programmering. På den objekt-orienterte siden har Scala mange egenskaper som ikke finnes i Java; disse inkluderer traits (omtrent som interfaces med implementasjon), singleton objekter, klasse-parametre, virtuelle typer og høyere-ordens type-parametre (generics). I tillegg har man mange egenskaper som kommer fra funksjonell programmering; typisk høyere-ordens funksjoner, pattern matching, type inference, implicit conversion, currying/partial functions, late datastrukturer og et ekstremt avansert typesystem. Alt i alt fører disse egenskapene til at man i mange tilfeller kun trenger en tredjedel så mye kode som man ville hatt i Java for å uttrykke det samme. Scala er i tillegg skrevet for å gjøre det enklere å programmere for flere tråder uten å innføre synkroniseringsfeil e.l. man ofte støter på i Java.

Scala er et språk vi har stor tro på i BEKK. Vi har en egen faggruppe som heter “Scala & JVM” som fokuserer på alternative JVM-språk med Scala i spissen, og vi har både interne og kunde-drevne prosjekter basert på Scala. Vi kommer til å kjøre en serie med artikler her på BEKK Open fremover for å eksemplifisere hvorfor vi mener Scala er en god erstatter for Java.

Groovy

Groovy er et dynamisk typet språk først utgitt i 2003 (men versjon 1.0 først i 2007). Som alle dynamiske språk har det kompakt syntaks pga. at man ikke trenger å skrive noe type-informasjon i koden. I tillegg har Groovy veldig god integrasjon med Java, også på kodenivå. Man kan putte Javakode direkte inn i en Groovy-fil og kjøre. Dette gjør det veldig greit å komme i gang med for Javautviklere.

I BEKK har jeg sett Groovy brukt på noen forskjellige måter:

  • Sammen med Grails rammeverket – Et rammeverk som virkelig utnytter de dynamiske egenskapene til Groovy sammen med anerkjente Java-rammeverk for å skape en svært konsis syntaks for å lage webapplikasjoner.
  • I test-sammenheng for å lage test-objekter/manipulere collections på en enklere måte – Nyttig for å få kortere og mer konsis test-kode. Her tror jeg dog man like godt kunne brukt Scala og fått kompilator-støtte i tillegg.
  • Med byggeverktøyet Gradle – Se Ole-Martins glimrende post om temaet.
  • Som rent scripting-verktøy på JVM.

Groovy er et tøft språk med svært konsis syntaks. Jeg mener at det hovedsaklig er sammen med rammeverk som utnytter de dynamiske egenskapene (som for eksempel Grails) man har glede av Groovy. Som ren Java-erstatter vil Scala være bedre egnet pga. bedre kompilator-støtte og ytelse.

JRuby

JRuby er en port av Ruby som kjører på JVM. JRuby ble først lansert i 2001, men tok ikke av i popularitet før støtten for Rails kom i 2006. Det er dynamisk typet på samme måte som Groovy, og har veldig mange av de samme egenskapene. Man har dynamisk metaprogrammering (mulighet for å legge til metoder runtime), og i tillegg en dynamisk dispatch som lar programmerer håndtere hvordan metoder med ukjent navn skal behandles. Dette er egenskaper som benyttes mye i Rails blant annet for å snakke med databasen (Eksempel: Person.findByFirstName("Eivind") vil fungere selv om man ikke har definert metoden findByFirstName direkte).

I BEKK har vi kjørt mange prosjekter basert på JRuby/Ruby med Rails. I tilfeller hvor Rails dekker behovet er dette en veldig kraftig kombinasjon for å få opp en webapplikasjon raskt. Vi har sett eksisterende Java EE-prosjekter bli portet over til JRuby on Rails hvor resultatet er en drastisk reduksjon i totalt antall kodelinjer.

Et dilemma med den dynamiske typingen i JRuby og Groovy er hvor mye man må teste. I mange tilfeller ender man opp med å skrive tester som gjør en del av jobben kompilatoren ville gjort om man jobbet med et statisk språk som Java eller Scala. Det at navnet på en metode er stavet riktig vet man egentlig ikke før man har kjørt koden. Vi ser uansett at mengden kode totalt sett blir vesentlig mindre enn Java, selv om en større andel består av testkode.

Clojure

Clojure er en Lisp som kjører på JVM, først utgitt i 2007. Det er dynamisk typet som Groovy og JRuby, men har støtte for å gi kompilatoren type hint som brukes til optimalisering.

I Clojure/Lisp er et viktig begrep at “kode er data, og data er kode”. Dette gjør det mulig å skrive kode som skriver kode (metaprogrammering) på en helt annen måte enn i andre språk. Det er dette som kalles makroer i Clojure. Makroer gjør også at man kan lage egne både data- og kontrollstrukturer helt fritt, noe som igjen gjør at Clojure veldig fort blir det språket man kan skrive den mest konsise koden i. Clojure har også en del egenskaper som gjør det enkelt å lage flertrådsprogrammer.

Jeg tror Clojure er litt for eksotisk til at vi kommer til å se mye bruk av det hos store norske kunder, men det har absolutt sitt potensiale om man ønsker et spennende språk. Det er uansett veldig lærerikt å se på Clojure, da det vil åpne for at man ser nye muligheter i de andre språkene man bruker. En fin inspirasjon om man ønsker å lese mer om Clojure på norsk er Torbjørn Marø sin blogg kjempekjekt.com.

Konklusjon

Alle de nevnte språkene er gode erstattere for Java på JVM plattformen. Groovy og JRuby er dynamisk typede varianter som gir deg svært kompakt syntaks, og ikke minst muligheter for dynamisk metaprogrammering. De vil være godt egnet om man ønsker å benytte rammeverk som Grails eller Rails hvor dynamisk metaprogrammering står sentralt. Clojure er kanskje hakket mer eksotisk for mange med sin Lisp-syntaks. Det er godt egnet om man ønsker å gjøre store utvidelser og bygge veldig skreddersydd domene-spesifikk syntaks. Makroer i Clojure kan brukes til å gjøre ting som er umulig i alle de andre språkene.

Scala er kanskje det språket som er mest likt Java i bruksmønster. Man kompilerer og pakker på nøyaktig samme måte som man ville gjort med Java. I tillegg gir statisk typing og kompilator bedre feilsjekking og ytelse. Iom. at man med Scala får nesten like kompakt syntaks som de dynamiske alternativene vil dette være en perfekt erstatter for Java. Det eneste man mangler forhold til de dynamiske alternativene er mulighet for dynamisk metaprogrammering, og det klarer man seg i mange tilfeller uten :)

  • http://erlend.oftedal.no/blog Erlend Oftedal

    Selv om lambda kom i C# 3.0, har C# gjennom anonyme metoder og delegates noe relativt likt det java kommer med siden C# 2.0 (2003):
    http://msdn.microsoft.com/en-us/library/0yw3tz5k(v=vs.80).aspx

    • http://twitter.com/eivindw Eivind B Waaler

      Ja, C# har masse greier som ikke finnes i Java. Det er snedig at mange omtaler de to språkene som omtrent identiske når man ser på hvor store forskjeller det faktisk er. Scala har masse funksjonalitet som ikke finnes i noen av dem da.. :)

      • http://erlend.oftedal.no/blog Erlend Oftedal

        Ja, Scala er veldig interessant. Jeffry Zhao fra linken din, ser ut til å være enig.

  • http://www.tfnico.com Thomas Ferris Nicolaisen

    Det var jo en meget industrirelevant masteroppgave, Eivind! Burde ikke den gå runden på DZone, InfoQ, osv?

    • http://twitter.com/eivindw Eivind B Waaler

      Takk for det. Har egentlig bare latt den ligge siden jeg var ferdig. Lærte mye av å skrive den, men er ikke så lett å se om det gir andre verdi å lese..

  • http://twitter.com/tormaroe Torbjørn Marø

    Det er veldig hyggelig å finne sitt eget navn når man sitter og leser en bra artikkel om programmeringsspråk. Takk for linken!

    • http://twitter.com/eivindw Eivind B Waaler

      Sjøl takk! Var en ivrig leser av julekalenderen din.. Ikke så mange som er interessert i Clojure, og sikkert enda færre med bakgrunn fra .NET-miljøet vil jeg tro :)

      • http://twitter.com/tormaroe Torbjørn Marø

        Jeg vet ikke det.., Clojure begynner å få litt omtale. For eksempel på NDC, som først og fremst er er Microsoft-konferanse, vil det vare flere foredrag om Clojure! Gleder meg til Uncle Bob’s foredrag “Clojure – the Last Programming Language”.