<?xml version="1.0" encoding="UTF-8"?>
<posts type="array">
  <post>
    <body>Java er en superst&#230;rk platform. Java som programmeringssprog er derimod ved at v&#230;re rigtig godt slidt. Sun er klar over at deres bedste &#8220;cash cow&#8221; er ved at l&#248;be t&#248;r for fodre, m&#229;ske derfor de kalder den JDK7 og ikke Java7.

Men et er sikkert, Java&#8217;s &#248;kosystem er en attraktiv platform og den vil overleve i bedste velg&#229;ende. P&#229; denne solide platform kan hostes en masse nye og smarte sprogvariationer som alle har det tilf&#230;lles at de kan eksekveres i en Java Virtuel Maskine(JVM). Disse nye sprog &#229;bner op for en masse nye muligheder for v&#230;kst mens tidligere investering i platform og infrastruktur kan bevares.

Nu er det muligt at v&#230;lge platform og programmeringssprog uafh&#230;ngigt af hinanden og man kan lade applikationens specielle krav om ydelse, hastighed eller samtidighed indg&#229; i valg af programmeringssprog.

# Development speed (websites, business)
# Parallel computing (mathematical finance)
# High volumen applications (twitter, flickr, finance)

Ovenik&#248;bet kan de forskellige programmeringssprog kombineres, fx kan man bruge ruby for at speede den daglige udvikling og benytte jruby til at overf&#248;re ruby koden til JVM&#8217;en for at hente en ydelsesm&#230;ssige fordel. Ruby on Rails applikationer kan ogs&#229; bruges som glaslagsapplikationer der ikke kr&#230;ver &#230;ndringer af en eksisterende Java-baserede infrastruktur. Produktive teams kan bruge denne fremgansm&#229;de for at minimere teknisk &quot;friktion&quot; i processerne men ogs&#229; for at opn&#229; de ydelsesm&#230;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&#248;s koblede og kan skaleres og deployes efter specielle egenskaber. 

Enhvert moderne programmeringssprog b&#248;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&#229; meget men de b&#248;r v&#230;re udformet som scriptsprog. 

Herefter l&#248;ber vandende hver sin vej hvad ang&#229;r enkelthed og indl&#230;ringskurve. Nogle af de nye sprog tager udgangspunkt i enkelthed og at &quot;de g&#248;r som man forventer&quot; mens andre er designede til at undg&#229; sideeffekter for samtidig eksekvering mens andre igen underst&#248;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&#230;ringskurven
# Tool support: Hvad med IDE 's, kode d&#230;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&#248;rene. Java verden lever med den absurde tanke at framework l&#248;ser alle dine problemer uden man beh&#248;ver at forst&#229; alle tankerne bagved enhver problematik. Heldigvis finder der en form for udvikling sted. Nogle af de nye &#8220;ideer&#8221; i de enkelt sprog kan v&#230;re af stor v&#230;rdi for udviklingsprojekterne eller/og selve platformen.

JRuby

JRuby er nok det mest popul&#230;re alternativ til et JVM sprog. JRuby drives i h&#248;j grad af interesse i Ruby og Ruby on Rails milj&#248;et. Ruby's programmeringsmodel og objektmodel er lidt anderledes end Java. Det er nemt at kalde Jruby fra Java og ogs&#229; omvend gennem JSR 223 scripting interface. JRuby kan kompiler ruby kode til Java-bytecode.

Ruby&#8217;s objekt model underst&#248;tter mixin moduler som har samme adf&#230;rd som Java interfaces men med implementation. JRuby har ogs&#229; closures, en meget &#248;nsket funktion som der ikke er med i JDK7. Med closures kan man opn&#229; en r&#230;kke functional-style iterative operationer som mapping, filtering, og reducing/folding. Ruby har &#229;bne klasser gennem virtual class og man kan tilf&#248;re en metode til en enkelt instans af en klasse. Ruby underst&#248;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 &quot;Intern DSL&#8221;. JRuby er stabilt og meget brugt i produktionsmilj&#248; og JRuby menes at v&#230;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 &#229;bent sprog.

Ruby er let at l&#230;re, superb til undervisning og studier. Ruby vil udbygge ens viden om objektorienteret tankgang. Anvendelse af avancerede teknikker s&#229;som metaprogramming kr&#230;ve dog lidt mere tid. Rubys specelle idioms er lette at forst&#229; og er ret veldokumenteret. Ruby oplever en enorm v&#230;kst i nye v&#230;rkt&#248;jer fra fx IntelliJ, NetBeans og Eclipse der alle arbejder p&#229; Ruby support og JRuby brugere kan udnytte mange eksisterende Java-v&#230;rkt&#248;jer. Kode analyse og test v&#230;rkt&#248;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&#230;ver ikke &#230;ndringer af den eksisterende Java-baserede infrastruktur. JRuby er java-bytecode p&#229; 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 &#248;nsker en dynamisk-skrevet sprog, der er t&#230;ttere p&#229; 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 &quot;curly bracket&quot; syntaks der bliver dynamisk kompileret til bytecode og fungere gnidningsfrit med anden Java kode og Java biblioteker. Groovy kompilere kan generer standard bytecode, alts&#229; class filer som kan bruges af rene Java projekter. Det mest Java kode er ogs&#229; valid groovy kode. Groovy sproget er stor set et subset af Java. Faktisk kan man omd&#248;be en .java fil til .groovy fil og den vil med f&#229; undtagelser virker.

Groovy har en r&#230;kke supercool features som Java ikke kan h&#229;ndterer. Indl&#230;ringkurven for Java programm&#248;rer er n&#230;sten nul, eller nil om man vil. Java folk kan uden videre g&#229; i gang med at l&#230;re en m&#230;ngde nye ting som g&#248;r hverdagen meget nemmere. Det er b&#229;de statiske og dynamiske syntaks, fx metode definitionen def, closures, operator, overloading og native list og associative arrays, maps. Groovy kan g&#248;res langt mere kompakt end Java.

Groovy supportere en m&#230;ngde forskellige integrations komponenter som markup, XML, dom der kan manipulere mange typer af hetrogene data struktureret p&#229; en koncis m&#229;de. Groovy er fuldt ud stabilt og alle nye landvindinger synes ikke at v&#230;re et problem idet sprogkernen ligger fast og nye ting ber&#248;re kun bibliotekerne. Clojure ogs&#229; har de f&#230;rreste kendte produktion implementeringer. Performance er i top men kr&#230;ver et udviklingsteam som kan lide Lisp. Hvis dette tilf&#230;ldet kan projektledelsen regne med h&#248;j produktivitet. Lisp er kendt for at v&#230;re simpelt sprog, hvor den egentlige l&#230;ring kommer i at forst&#229;, hvordan man bruger det effektivt!

Scala

Scala er et statisk-skrevet sprog som underst&#248;tter en forbedret objekt model med fuld mixin mekanisme og fuld st&#248;tte til funktionel programmering. Scala navnet er en sammentr&#230;kning af &quot;skalerbare sprog&quot;. Syntaksen ligner en krydsning mellem Ruby (metode definitioner starter med def) og Java (kr&#248;llede parenteser). Type inferencing og andre syntaktisk konventioner betydeligt reducere &quot;cluuter&quot;, s&#229;som antallet af eksplicitte type erkl&#230;ringer &quot;annotationer&quot; i forhold til Java. Scala syntaks er meget kortfattet, undertiden endnu mere end ruby! Scala og Java passer godt samme pga &#8220;static typing&#8221; og &#8220;closed&#8221; klasser. Det er trivielt at importere og bruger Java API. Direkte API-kald fra Java til Scala underst&#248;ttes ogs&#229;. Udvikleren har behov for at vide, hvordan navnene p&#229; Scala metoder kodning i byte kode. fx Scala metoder kan have &quot;operat&#248;r&quot; navne, som &quot;+&quot;. I byte-kode, er det &quot;$ plus&quot;.

Scala's objekt model extends Java's model med traits, som er flexble mixin composition, samme som moduler i ruby. Traits opf&#248;rer sig som interfaces med implementation. Scala objekt model bidrager med avancerede funktioner til opbygning af &quot;skalerbare&#8221; applikationer. Scala underst&#248;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&#229;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&#248;tte til opbygning af interne DSL 's, men det er ikke helt s&#229; god som Ruby. Scala har et &#8220;combinator parser&#8221; bibliotek der g&#248;r, at man kan konstruere eksterne DSL forholdsvis let. Scala tilbyder ogs&#229; p&#229; nogle innovative API 's for XML forarbejdning og Swing udvikling.

Scala er over 5 &#229;r gamle og er meget stabilt. API og syntaks udvikle sig men alle &#230;ndringer sker i biblioteker og ikke det sproget grammatik. Der er nogle velkendte &#8220;big load&#8221; applikationer fx Twitter der benytter Scala for high performance og volumen.

Scala giver sammenlignelige resultater til Java, da det er meget t&#230;t &quot;strukturelt&quot; til Java-kode p&#229; byte-kode niveau. Derfor Scala kan udnytte JVM optimeringer, der ikke er tilg&#230;ngelige til dynamisk-typed sprog. Men Scala vil ogs&#229; drage fordel af planlagte forbedringer for at st&#248;tte dynamisk-skrevet sprog, s&#229;som hale-call optimeringer. Derfor har Scala sandsynligvis en marginalt bedre ydeevne end JRuby. Hvis det er sandt, Scala kan v&#230;re mere tiltr&#230;kkende end JRuby som generelt sprog hvor udf&#248;relsen er kritisk.

Scala er sv&#230;rere at l&#230;re end JRuby fordi det er et mere omfattende sprog. Ikke kun pga af en sofistikeret objekt model men ogs&#229; fordi der underst&#248;ttes funktionel programmering, type inferencing osv. Efter min mening er den ekstra indsats vil blive bel&#248;nnet med en h&#248;jere produktivitet. Ogs&#229;, fordi det er t&#230;ttere p&#229; Java end JRuby og Clojure vil nye brugere vil v&#230;re i stand til at begynde at bruge det hurtigt som et &quot;bedre objektorienterede Java&quot;, mens de forts&#230;tter med at l&#230;re de mere avancerede funktioner, som f.eks funktionel programmering, som vil fremskynde deres produktivitet p&#229; 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&#230;ngelige. Scala applikationer pakkets og installeres ligesom Java-programmer. En Scala runtime jar er p&#229;kr&#230;vet.

Lift er et helt nyt imponerede og elegant framework til webenabling af h&#248;jtydende applikationer. Lift er bygget omkring vigtigheden af sikkerhed, vedligehold, skalerbart og h&#248;j ydeevne. Derudover har Lift stor fokus p&#229; h&#248;j udviklingsproduktivitet. Lift l&#229;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&#229; grund af sin lisp syntaks og innovative &quot;programmerings model&quot;. 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&#230;ndende nye JVM sprog syntaks som g&#248;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&#229; 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 &#230;ndringer af in-memory &#230;ndringer. STM. Clojure har ogs&#229; andre innovative metoder til at st&#248;tte &quot;principfast&quot; 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&#248;rt flere kompiler optimeringer der er vigtige for funktionel programmering, s&#229;som optimering &#8220;tail call recursion&#8221;.

Clojure kan nemt sameksistere med Java men det er sv&#230;rt at kalde fra Clojure til Java, der m&#229; man lave proxyies p&#229; Clojure siden for at generere den bytecode som Java kr&#230;ver. Clojure st&#248;rste bedrift er at bringe functional programming med en smart List syntaks til JVM&#8217;en med multi-methods, metaprogramming og sikker concurrency. Clojure's kortfattede syntaks og indbygget i biblioteker g&#248;re forarbejdning af XML kortfattede og effektivt ligesom DSL st&#248;ttes af lisp mekanismer.

Clojure er den nyeste scriptsprog p&#229; JVM&#8217;en men er fuldt ud stabilt og alle nye landvindinger synes ikke at v&#230;re et problem idet sprogkernen ligger fast og nye ting ber&#248;re kun bibliotekerne. Clojure ogs&#229; har de f&#230;rreste kendte produktion implementeringer. Performents er i top men kr&#230;ver et udviklingsteam som kan lide Lisp. Hvis dette tilf&#230;ldet kan projektledelsen regne med h&#248;j produktivitet. Lisp er kendt for at v&#230;re simpelt sprog, hvor den egentlige l&#230;ring kommer i at forst&#229;, hvordan man bruger det effektivt!

Mange Java-v&#230;rkt&#248;jer kan anvendes sammen med Clojure men typisk arbejder man med Emacs som har fremragende lisp st&#248;tte. Clojure deployering synes at v&#230;re s&#229; ligetil som for de andre sprog. En Clojure runtime jar er p&#229;kr&#230;vet.


Lidt fra hver

Alle sprog kan let kaldes fra eksistere Java kode men det er lidt mere omst&#230;ndig at kalde fra de respektive sprog til Java. T&#230;ttes p&#229; er Scala med en objekt model der ser ud som ruby/java layout. Naturligivs g&#248;r ruby&#8217;s dynamiske giver sproget karakter. Begge extends Java objekt model med mixin komposition gennem modules og traits. Clojure er helt anderledes, med en v&#230;gt p&#229; funktionel programmering og ikke direkte st&#248;tte til objektorienteret programmering.

JRuby bringer produktivitet og effekter af et dynamisk-skrevet sprog til JVM, ligesom Groovy. JRuby har ogs&#229; nogle funktionelle idiomer. Scala og Clojure har fuld st&#248;tte til funktionel programmering. Scala har en komplet Actor model for concurrency implementeret som bibliotek. Clojure har software transaktionsh&#229;ndtering af hukommelse og andre nyskabelser som ganranteret robust samtidighed i applikationer. JRuby og Ruby ikke tilf&#248;je noget specifikt for concurrency. JRuby og Ruby er specielt god til at skrive interne DSL's. Scala er ogs&#229; meget god og Clojure har fordelene fra lisp's til DSL oprettelse.

Alle sprog implementeringer er af h&#248;j kvalitet med Scala som den mest modne mens JRuby er mest adopteret i produktion. Performance b&#248;r v&#230;re sammenlignelige for alle, men JRuby og Clojure har at g&#248;re med en vis ineffektivitet ved at eksekvere dynamiske sprog p&#229; JVM. Undg&#229; &quot;tidligt optimering&quot;, n&#229;r de skal v&#230;lge et nyt sprog. Ofte er team produktivitet og &quot;time to market&quot; langt vigtigere end r&#229; ydeevne.

Scala har den laveste barriere for adoption fordi det er det sprog, der mest ligner Java &quot;filosofisk&quot;, med statisk typing og v&#230;gt p&#229; objektorienteret programmering. Nye tilkommer kan starte med Scala som et &quot;bedre Java&quot; og gradvist l&#230;re de avancerede funktioner som mixin og funktionel programmering.

Scala vil appellere til de fleste teams der foretr&#230;kker statisk-skrevet sprog men alligevel &#248;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&#230;ver det st&#248;rste begrebsm&#230;ssige spring fra Java.

Clojure vil appellere til hold som er villige til at udforske mere gennemgribende afvigelser fra det de g&#248;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&#229; k&#248;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&#229; Java og tilbyder en lang r&#230;kke cool stuff.

Scala er m&#229;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 &#8211; En hybrid af den objektorienterede og funktionelle verden. Mange lighedspunkter med Scala, f&#248;les ligesom et scripting-sprog. Har en helt anden indgangsvinkel til deling af state og l&#229;sning af f&#230;lles resources. De fleste andre performance sprog undg&#229;r sideeffekter ved at ikke dele state overhoved men FAN er mere som Java hvor flere processer kan dele resourcer og som f&#248;lge deraf m&#229; man l&#229;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 &#8211; Et innovativt sprog udviklet af Ola Bini med k&#230;mpe potentiale. Ioke er et st&#230;rkt typed dynamisk, prototype baseret objektorienterede sprog. Ioke er bygget med indflydelse fra er Io, Smalltalk, Self, Ruby og Lisp. Sproget eksekveres p&#229; en JVM men Ola regner med at kompilere det til JavaScript V8 inden l&#230;nge. Sproget er specielt udformet til at kunne h&#229;ndtere &#8220;Intern DSL&#8221;. Programringssproget skal komme mindst muligt i vejen men ogs&#229; v&#230;re kraftfuldt nok til at udf&#248;re opgaver p&#229; h&#248;jt niveau. Nogle vil m&#229;ske finde makro-systemet vanvittigt og Ioke er sikkert for udfordrende for gennemsnittet af Java udviklere.
# Fortress &#8211; Et sprog t&#230;nkt som en erstatning for h&#248;jperformante FORTRAN til industrielle og akademiske &quot;number crunching&quot;. og videnskablig ingeni&#248;rkunst. Fortress ligner mest Scala Standard ML og Haskell. Sproget er designet til parallelitet med rig funktionalitet i biblioteker.

</body>
    <category-id type="integer" nil="true"></category-id>
    <created-at type="datetime">2009-04-05T23:25:05Z</created-at>
    <id type="integer">138</id>
    <post-id type="NilClass">138</post-id>
    <published type="boolean">true</published>
    <tag-id type="NilClass">52</tag-id>
    <title>Adopting JVM languages</title>
    <updated-at type="datetime">2009-04-10T23:17:29Z</updated-at>
  </post>
</posts>
