Adopting JVM languages April 05, 2009 23:25 about 1 year ago
Java er en superstærk platform. Java som programmeringssprog er derimod ved at være rigtig godt slidt. Sun er klar over at deres bedste “cash cow” er ved at løbe tør for fodre, måske derfor de kalder den JDK7 og ikke Java7.
Men et er sikkert, Java’s økosystem er en attraktiv platform og den vil overleve i bedste velgående. På denne solide platform kan hostes en masse nye og smarte sprogvariationer som alle har det tilfælles at de kan eksekveres i en Java Virtuel Maskine(JVM). Disse nye sprog åbner op for en masse nye muligheder for vækst mens tidligere investering i platform og infrastruktur kan bevares.
Nu er det muligt at vælge platform og programmeringssprog uafhængigt af hinanden og man kan lade applikationens specielle krav om ydelse, hastighed eller samtidighed indgå i valg af programmeringssprog.
- Development speed (websites, business)
- Parallel computing (mathematical finance)
- High volumen applications (twitter, flickr, finance)
Ovenikøbet kan de forskellige programmeringssprog kombineres, fx kan man bruge ruby for at speede den daglige udvikling og benytte jruby til at overføre ruby koden til JVM’en for at hente en ydelsesmæssige fordel. Ruby on Rails applikationer kan også bruges som glaslagsapplikationer der ikke kræver ændringer af en eksisterende Java-baserede infrastruktur. Produktive teams kan bruge denne fremgansmåde for at minimere teknisk “friktion” i processerne men også for at opnå de ydelsesmæssige fordele af JVM’en. Twtter applikationer benytter RubyOnRails til UI og Scala til de mest betydningsfulde programdele for at kunne lade dem skalere til maximum. De enkelte dele er løs koblede og kan skaleres og deployes efter specielle egenskaber.
Enhvert moderne programmeringssprog bør som minimum have en read-eval-print loop (REPL) hvori man kan skrive evolutionary kode. Om sproget er dynamiske eller statisk, objektorienteret eller funktionelt betyder ikke så meget men de bør være udformet som scriptsprog.
Herefter løber vandende hver sin vej hvad angår enkelthed og indlæringskurve. Nogle af de nye sprog tager udgangspunkt i enkelthed og at “de gør som man forventer” mens andre er designede til at undgå sideeffekter for samtidig eksekvering mens andre igen understøtter fx metaprogramming.
Ting man kunne klassificere et sprog efter:
- Interoperability: Hvordan sameksistere med Java platformen.
- Programmringsparadigme: Objekt eller funktionel model.
- Trends: Hvilken core egenskab har programmeringssproget.
- Integrated: Hvordan integreres med XML, SQL, DSL osv.
- Stability: Hvordan er stabiliteten.
- Performance: Hvordan er hastigheden i programmeringssproget.
- Adoption: Hvor stejl er indlæringskurven
- Tool support: Hvad med IDE ’s, kode dækning osv.
- Deployment : Hvordan fungere det med build, deploy og udrulning
En af de sjove ting som skiller sig ud, er tanken om at bidrage med nye ideer og former til programmørene. Java verden lever med den absurde tanke at framework løser alle dine problemer uden man behøver at forstå alle tankerne bagved enhver problematik. Heldigvis finder der en form for udvikling sted. Nogle af de nye “ideer” i de enkelt sprog kan være af stor værdi for udviklingsprojekterne eller/og selve platformen.
JRuby
JRuby er nok det mest populære alternativ til et JVM sprog. JRuby drives i høj grad af interesse i Ruby og Ruby on Rails miljøet. Ruby’s programmeringsmodel og objektmodel er lidt anderledes end Java. Det er nemt at kalde Jruby fra Java og også omvend gennem JSR 223 scripting interface. JRuby kan kompiler ruby kode til Java-bytecode.
Ruby’s objekt model understøtter mixin moduler som har samme adfærd som Java interfaces men med implementation. JRuby har også closures, en meget ønsket funktion som der ikke er med i JDK7. Med closures kan man opnå en række functional-style iterative operationer som mapping, filtering, og reducing/folding. Ruby har åbne klasser gennem virtual class og man kan tilføre en metode til en enkelt instans af en klasse. Ruby understøtter ikke funktionel programmering og giver ikke ekstra til samtidigheds problematikken. Ruby er dynamisk og kan udnytte metaprogramming faciliteter.
Ruby tillader nem adgang til XML og databaser. Ruby on Rails er legendarisk for at forbedre produktiviteten i web portaler og lettere applikationer. Ruby er et af de bedste sprog til definition af "Intern DSL”. JRuby er stabilt og meget brugt i produktionsmiljø og JRuby menes at være den beste performing ruby platform, bedre end selv Metz native. Ruby syntaks er under forandringer med version 1.9 men migration ikke er nogen udfordring for et åbent sprog.
Ruby er let at lære, superb til undervisning og studier. Ruby vil udbygge ens viden om objektorienteret tankgang. Anvendelse af avancerede teknikker såsom metaprogramming kræve dog lidt mere tid. Rubys specelle idioms er lette at forstå og er ret veldokumenteret. Ruby oplever en enorm vækst i nye værktøjer fra fx IntelliJ, NetBeans og Eclipse der alle arbejder på Ruby support og JRuby brugere kan udnytte mange eksisterende Java-værktøjer. Kode analyse og test værktøjer (TDD and BDD) er langt bedre end Java’s. JRuby applikationer, og selv Ruby on Rails applikationer, kan indpakkes og deploy som jar eller war arkiver og kræver ikke ændringer af den eksisterende Java-baserede infrastruktur. JRuby er java-bytecode på runtime og kan derfor debugges med JMX osv.
Groovy
Groovy er et objektorienteret sprog for JVM’en og er et godt alternativ til Java sproget. Groovy er designet specielt til interoperabilitet med Java. Det vil appellere til teams, der ønsker en dynamisk-skrevet sprog, der er tættere på Java end Ruby. Med web frameworket grails, har man en kombination som er sammenlignelig med Ruby on Rails. Groovy er dynamisk typed med egenskaber som ellers findes i python, ruby, perl og smaltalk. Groovy kan bruges som et scriptsprog for Java med en Java li “curly bracket” syntaks der bliver dynamisk kompileret til bytecode og fungere gnidningsfrit med anden Java kode og Java biblioteker. Groovy kompilere kan generer standard bytecode, altså class filer som kan bruges af rene Java projekter. Det mest Java kode er også valid groovy kode. Groovy sproget er stor set et subset af Java. Faktisk kan man omdøbe en .java fil til .groovy fil og den vil med få undtagelser virker.
Groovy har en række supercool features som Java ikke kan håndterer. Indlæringkurven for Java programmører er næsten nul, eller nil om man vil. Java folk kan uden videre gå i gang med at lære en mængde nye ting som gør hverdagen meget nemmere. Det er både statiske og dynamiske syntaks, fx metode definitionen def, closures, operator, overloading og native list og associative arrays, maps. Groovy kan gøres langt mere kompakt end Java.
Groovy supportere en mængde forskellige integrations komponenter som markup, XML, dom der kan manipulere mange typer af hetrogene data struktureret på en koncis måde. Groovy er fuldt ud stabilt og alle nye landvindinger synes ikke at være et problem idet sprogkernen ligger fast og nye ting berøre kun bibliotekerne. Clojure også har de færreste kendte produktion implementeringer. Performance er i top men kræver et udviklingsteam som kan lide Lisp. Hvis dette tilfældet kan projektledelsen regne med høj produktivitet. Lisp er kendt for at være simpelt sprog, hvor den egentlige læring kommer i at forstå, hvordan man bruger det effektivt!
Scala
Scala er et statisk-skrevet sprog som understøtter en forbedret objekt model med fuld mixin mekanisme og fuld støtte til funktionel programmering. Scala navnet er en sammentrækning af “skalerbare sprog”. Syntaksen ligner en krydsning mellem Ruby (metode definitioner starter med def) og Java (krøllede parenteser). Type inferencing og andre syntaktisk konventioner betydeligt reducere “cluuter”, såsom antallet af eksplicitte type erklæringer “annotationer” i forhold til Java. Scala syntaks er meget kortfattet, undertiden endnu mere end ruby! Scala og Java passer godt samme pga “static typing” og “closed” klasser. Det er trivielt at importere og bruger Java API. Direkte API-kald fra Java til Scala understøttes også. Udvikleren har behov for at vide, hvordan navnene på Scala metoder kodning i byte kode. fx Scala metoder kan have “operatør” navne, som “+”. I byte-kode, er det “$ plus”.
Scala’s objekt model extends Java’s model med traits, som er flexble mixin composition, samme som moduler i ruby. Traits opfører sig som interfaces med implementation. Scala objekt model bidrager med avancerede funktioner til opbygning af "skalerbare” applikationer. Scala understøtter funktionel programmering til JVM, herunder first-class funktion og closures. Andre aspekter af funktionel programmering, som immutable variabler uden side-effekter. Dog er Scala ikke et rent funktionelt sprog.
Funktionel programmering er meget effektiv strategi for at skrive treads-safe-programmer der kan håndtere mange samtidige processer. Scala benytter Actor Pattern fra Erlang der er en besked-baserede concurrency model. Actor modellen er nok den bedste general-purpose tilgang til concurrency med multi-threaded processer som skal eksekvere samtidigt. Scala har meget god støtte til opbygning af interne DSL ’s, men det er ikke helt så god som Ruby. Scala har et “combinator parser” bibliotek der gør, at man kan konstruere eksterne DSL forholdsvis let. Scala tilbyder også på nogle innovative API ’s for XML forarbejdning og Swing udvikling.
Scala er over 5 år gamle og er meget stabilt. API og syntaks udvikle sig men alle ændringer sker i biblioteker og ikke det sproget grammatik. Der er nogle velkendte “big load” applikationer fx Twitter der benytter Scala for high performance og volumen.
Scala giver sammenlignelige resultater til Java, da det er meget tæt “strukturelt” til Java-kode på byte-kode niveau. Derfor Scala kan udnytte JVM optimeringer, der ikke er tilgængelige til dynamisk-typed sprog. Men Scala vil også drage fordel af planlagte forbedringer for at støtte dynamisk-skrevet sprog, såsom hale-call optimeringer. Derfor har Scala sandsynligvis en marginalt bedre ydeevne end JRuby. Hvis det er sandt, Scala kan være mere tiltrækkende end JRuby som generelt sprog hvor udførelsen er kritisk.
Scala er sværere at lære end JRuby fordi det er et mere omfattende sprog. Ikke kun pga af en sofistikeret objekt model men også fordi der understøttes funktionel programmering, type inferencing osv. Efter min mening er den ekstra indsats vil blive belønnet med en højere produktivitet. Også, fordi det er tættere på Java end JRuby og Clojure vil nye brugere vil være i stand til at begynde at bruge det hurtigt som et “bedre objektorienterede Java”, mens de fortsætter med at lære de mere avancerede funktioner, som f.eks funktionel programmering, som vil fremskynde deres produktivitet på lang sigt.
Scala IDE findes ikke endnu men der er gode plugins. Maven og ANT er almindeligt anvendt som bygge redskab til Scala applikationer ligesom der er adskillige fremragende TDD og BDD biblioteker tilgængelige. Scala applikationer pakkets og installeres ligesom Java-programmer. En Scala runtime jar er påkrævet.
Lift er et helt nyt imponerede og elegant framework til webenabling af højtydende applikationer. Lift er bygget omkring vigtigheden af sikkerhed, vedligehold, skalerbart og høj ydeevne. Derudover har Lift stor fokus på høj udviklingsproduktivitet. Lift låner fra de bedste eksisterede frameworks som fx. Seaside og andre egenskaber fra som time to market, CRUD, templates osv. Lift er skrevet i Scala kan man benytte alle Java’s API mens deployment og udrulning er lig Java.
Clojure
Clojure er den af de nye sprogversioner der mindst minder om Java. Sproget bliver kaldt Lisp 2 på grund af sin lisp syntaks og innovative “programmerings model”. Clojure er et rent functional sprog uden side effekter. Der findes kun immutable data strukture. Clojure har dynamisk kode fortolkning men er meget hurtigt.
Det er den nyskabende og spændende nye JVM sprog syntaks som gør Clojure interessant for mange mennesker. Clojure interop med Java-kode, men skal bliver betragtet som et funktionel programmeringsprog og supportere ikke object-orienteret programming. I stedet beror Clojure på mekanismer som multi-metoder og makroer til at behandle design problemer.
Clojure er bygget med transaktions memory der bruger en database-stil transaktion styring til samtidige ændringer af in-memory ændringer. STM. Clojure har også andre innovative metoder til at støtte “principfast” modifikation af mutable data samtidig med at brugen af immutable data. Disse funktioner med STM er grundlaget for Clojure’s tilgang til robust concurrency. Clojure har gennemført flere kompiler optimeringer der er vigtige for funktionel programmering, såsom optimering “tail call recursion”.
Clojure kan nemt sameksistere med Java men det er svært at kalde fra Clojure til Java, der må man lave proxyies på Clojure siden for at generere den bytecode som Java kræver. Clojure største bedrift er at bringe functional programming med en smart List syntaks til JVM’en med multi-methods, metaprogramming og sikker concurrency. Clojure’s kortfattede syntaks og indbygget i biblioteker gøre forarbejdning af XML kortfattede og effektivt ligesom DSL støttes af lisp mekanismer.
Clojure er den nyeste scriptsprog på JVM’en men er fuldt ud stabilt og alle nye landvindinger synes ikke at være et problem idet sprogkernen ligger fast og nye ting berøre kun bibliotekerne. Clojure også har de færreste kendte produktion implementeringer. Performents er i top men kræver et udviklingsteam som kan lide Lisp. Hvis dette tilfældet kan projektledelsen regne med høj produktivitet. Lisp er kendt for at være simpelt sprog, hvor den egentlige læring kommer i at forstå, hvordan man bruger det effektivt!
Mange Java-værktøjer kan anvendes sammen med Clojure men typisk arbejder man med Emacs som har fremragende lisp støtte. Clojure deployering synes at være så ligetil som for de andre sprog. En Clojure runtime jar er påkrævet.
Lidt fra hver
Alle sprog kan let kaldes fra eksistere Java kode men det er lidt mere omstændig at kalde fra de respektive sprog til Java. Tættes på er Scala med en objekt model der ser ud som ruby/java layout. Naturligivs gør ruby’s dynamiske giver sproget karakter. Begge extends Java objekt model med mixin komposition gennem modules og traits. Clojure er helt anderledes, med en vægt på funktionel programmering og ikke direkte støtte til objektorienteret programmering.
JRuby bringer produktivitet og effekter af et dynamisk-skrevet sprog til JVM, ligesom Groovy. JRuby har også nogle funktionelle idiomer. Scala og Clojure har fuld støtte til funktionel programmering. Scala har en komplet Actor model for concurrency implementeret som bibliotek. Clojure har software transaktionshåndtering af hukommelse og andre nyskabelser som ganranteret robust samtidighed i applikationer. JRuby og Ruby ikke tilføje noget specifikt for concurrency. JRuby og Ruby er specielt god til at skrive interne DSL’s. Scala er også meget god og Clojure har fordelene fra lisp’s til DSL oprettelse.
Alle sprog implementeringer er af høj kvalitet med Scala som den mest modne mens JRuby er mest adopteret i produktion. Performance bør være sammenlignelige for alle, men JRuby og Clojure har at gøre med en vis ineffektivitet ved at eksekvere dynamiske sprog på JVM. Undgå “tidligt optimering”, når de skal vælge et nyt sprog. Ofte er team produktivitet og “time to market” langt vigtigere end rå ydeevne.
Scala har den laveste barriere for adoption fordi det er det sprog, der mest ligner Java “filosofisk”, med statisk typing og vægt på objektorienteret programmering. Nye tilkommer kan starte med Scala som et “bedre Java” og gradvist lære de avancerede funktioner som mixin og funktionel programmering.
Scala vil appellere til de fleste teams der foretrækker statisk-skrevet sprog men alligevel ønsker nogle af fordelene ved dynamisk-skrevet sprog, og gerne en kortfattet syntaks. Men Scala er det mest komplekse af de tre sprog, mens Clojure kræver det største begrebsmæssige spring fra Java.
Clojure vil appellere til hold som er villige til at udforske mere gennemgribende afvigelser fra det de gør nu. Implementering er nemt med alle tre sprog. Scala er som Java hvor man kompilere koden til class-filer. JRuby og Clojure koden kan fortolkes på kørselstidspunktet eller blive kompileret.
Alle udviklingsteams der vil noget mere kan drage fordel af et eller flere moderne sprog men alligevel fuldt ud udnytte de eksisterende investeringer i Java platform. Efter min mening er Groovy er det sejeste sprog ovenpå Java og tilbyder en lang række cool stuff.
Scala er måske det nemmeste at vende sig til. JRuby bringer den pulserende Ruby verden til JVM. Clojure tilbyder den mest innovative tilgang til JVM’en.
Men der findes et par interessante variationer til:
- Fan – En hybrid af den objektorienterede og funktionelle verden. Mange lighedspunkter med Scala, føles ligesom et scripting-sprog. Har en helt anden indgangsvinkel til deling af state og låsning af fælles resources. De fleste andre performance sprog undgår sideeffekter ved at ikke dele state overhoved men FAN er mere som Java hvor flere processer kan dele resourcer og som følge deraf må man låse adgang til dissse resourcer. FAN har Mixins og protype, functions og closures. FAN er hverken statisk eller dynamisk typed, men et sted derimellem. Sproget er ideelt for deklarativ programmering.
- Ioke – Et innovativt sprog udviklet af Ola Bini med kæmpe potentiale. Ioke er et stærkt typed dynamisk, prototype baseret objektorienterede sprog. Ioke er bygget med indflydelse fra er Io, Smalltalk, Self, Ruby og Lisp. Sproget eksekveres på en JVM men Ola regner med at kompilere det til JavaScript V8 inden længe. Sproget er specielt udformet til at kunne håndtere “Intern DSL”. Programringssproget skal komme mindst muligt i vejen men også være kraftfuldt nok til at udføre opgaver på højt niveau. Nogle vil måske finde makro-systemet vanvittigt og Ioke er sikkert for udfordrende for gennemsnittet af Java udviklere.
- Fortress – Et sprog tænkt som en erstatning for højperformante FORTRAN til industrielle og akademiske “number crunching”. og videnskablig ingeniørkunst. Fortress ligner mest Scala Standard ML og Haskell. Sproget er designet til parallelitet med rig funktionalitet i biblioteker.
By Frank Vilhelmsen - 5 tags: java scala groovy clojure ioke - Add comment