lørdag den 4. oktober 2008

Scala i praksis

Jeg har brugt en del tid på det seneste på at kigge på sproget Scala, som er et spændende forsøg på at lave et multiparadigme sprog baseret på JVM'en. Jeg valgte Scala af en række grunde:

Vigtigst af alt, så oversætter Scala kode til JVM class-filer, og andre JVM klasser kan nemt integreres. Som Java kyndig brænder man altså ingen broer - man kan stadig bruge alt det, som allerede findes på platformen, og man kan flette ny Scala kode sammen med sin eksisterende Java.

Der er en ganske hæderlig typeinferens. Typeinferens ligner på overfladen "duck typing", men nedenunder findes et stærkt statisk typecheck. Det er en meget stor behagelighed, når man koder, for hvis typen kan regnes ud af sammenhængen, så klarer compileren det som hovedregel fint. Man undgår med andre ord at skulle gentage sig selv igen og igen overfor noget som virker som en meget tungnem compiler.

På den anden side, så kommer compileren en gang imellem og brokker sig over inkompatible typer. Hver gang har jeg tænkt, at her var den godt nok noget fatsvag, men hvergang har jeg modstræbende måtte erkende, at her havde den altså ret: Jeg havde ikke styr på, hvad jeg lavede og jeg var ved at blande fisk og cykler. Mine to mest almindelige fejl var, at jeg ikke var helt fortrolig med syntaksen for delvist anvendte funktioner (partial applied function), og når der havde sneget sig en anden resultattype ind (så funktionens resultat blev den fælles supertype i stedet for den første resultattype) .

Den tredje grund til at vælge Scala var, at det understøtter et funktionelt paradigme - det er nyt for mig, for jeg har stort set kun programmeret i imparative (procedurale og objekt-orienterede) sprog - med SQL som en mærkbar deklarativ undtagelse. Jeg har stadig meget svært ved at tænke funktionelt (Scala-kode kan også laves imparativt), men det er en stor lettelse for mig, at funktionen nu igen har fået en fornem placering i sproget - i Pascal var den nogenlunde med, men i Java har man holdt den objekt-orienterede fane så højt, at funktionen blev sat godt og grundigt i skammekrogen; det har gjort det nødvendigt for os at lave store og grimme krumspring undervejs for at omgå begrænsningerne. Da Scala er et funktionelt programmeringssprog, så har jeg pludselig fået nogle nye og spændende muligheder, som jeg ikke har set før, og som jeg virkelig kan se et stor potential i (mumle, mumle, golden hammer, mumle, mumle...)

Jeg tror nok, at det var Kung-fu-tze, der engang sagde noget i retning af:
"Læsning skaber en oplyst mand, overvejelse en vis mand - men kun handling den fuldkomne mand".
Jeg har læst, og jeg har overvejet ... og nu har jeg også prøvet at skrive mit første ikke-trivielle program i Scala. Det var egentlig en skrivebordsøvelse og baserer sig på ideen om, at skal man lave et godt hold, så skal man ikke finde folk, som er gode til de samme ting, men derimod folk som kan supplere hinanden.

Jeg havde den første prototype kørende på kun 14 liniers kode! Den havde godt nok hardkodet input, og kun en variant af klassifikationen, men ellers var der ikke snydt; den var fuldt funktionsdygtigt, og viste at princippet fungerede. Den baserede sig på lister, tupler, int og string - og derfor havde jeg tit svært ved at holde tungen lige i munden.

Efterfølgende er ansvaret blevet fordelt ud over diverse klasser, og alle klassifikationsregler blev implementeret. Herved steg antallet af kodelinier til det 10-dobbelte; det er en solid stigning, men stadig imponerede lidt problemstillingen taget i betragtning.

Lige nu er programmet oppe på ca. 230 linier, men så er der også parsning af input i løst formatteret tekstformat og pæn sortering, klassificering og formattering af output. Jeg tror, at et Java program til at det samme nemt kunne være løbet op i det 3-dobbelte antal kodelinier.

Et sprog, som kan spænde over at lave en kompakt teknologi-mockup og direkte op til et fuldt program - og gøre det godt hele vejen - det er da vist ikke helt skørt?

En ting, som jeg har bemærket undervejs, er funktionel programmering hele tiden får en til at overveje muligheden for generaliseringer - det er ikke mindst forklaringen på, hvorfor at koden bliver så kompakt - det ender med at blive noget som næsten ligner one-liners uden at det udarter sig til at blive Perl; man ender med kode præcis som man tænker.

En generalisering, som jeg stadig har til gode, er at eksternalisere kategorierne og klassifikationsreglerne. Jeg har sådan set allerede lavet det grundlæggende arbejde, for selvom de er hardkodet, så er det lister af instanser af nogle få kategoriklasser og nogle få meta-klassifikations-funktioner. Derfor kan programmet godt ende med at blive mindre igen, samtidig med at det bliver mere generelt.

6 kommentarer:

Anonym sagde ...

Hvor arbejder du Bjarne?

Unknown sagde ...

Kære Hr./Fru Anonym,

nu er det med fuldt overlæg, at jeg ikke nævner min nuværende arbejdsgiver ifm. denne blog - ikke fordi, at jeg synes, at der er noget at være flov over - mere for at understrege, at det, som jeg skriver her, er mine personlige meninger.

Hvis du er nysgerrig nok, så kan du, ved at søge på mit fulde navn, google dig frem til min profil på linkedin - og den er dekoreret med samme billede, som der står ude til højre på blog-forsiden under "om mig" (hvis du sammenligner, så vil du vide, om du har ramt rigtigt).

Og nærmere kommer vi det ikke i denne sammenhæng. :-)

Anonym sagde ...

Du skriver, at der let bliver til mange kodelinjer i Java. Det har altid undret mig, hvor mange IT-medarbejdere der er i nogle IT-firmaer.

Nu arbejder jeg selv med Dynamics Nav, hvor 1 eller få medarbejdere i en kortere periode kan stå for en brancheløsning eller en skræddersyet virksomhedstilpasning, hvor der godt kan være fx 100 kundespecifikke tabeller og 100 kundespecifikke rapporter udover hvad der er i standard Nav.

Tror du, at der stadigvæk er en IT-boble med alt for mange medarbejdere, sådan at forstå, at resourcekrævende systemer som Cobol og Java med tiden bliver til omkostningseffektive Nav løsninger
med få medarbejdere i takt med, at der kommer mere CPU power på en PC.

Unknown sagde ...

Det korte svar er "nej" - det tror jeg ikke.

Men lad mig lige først lave den afstikker, at jeg bestemt vil give dig ret: Er man i stand til at arbejde målrettet og på det, som jeg tidligere har hørt omtalt som "på værktøjets præmisser", så kan man virkelig nå langt på kort tid. Jeg har tidligere set store løsningerne opstå tilsyneladende ud af ingenting og på ingen tid, med Oracles daværende - og lad os bare sige det, med bagklogskabens overlegenhed - mangelfulde værktøjer. Men når man fik lov at bruge værktøjerne på deres egne præmisser, og til det, som de er gode til, så sker der virkelig noget.

Dengang var Delphi helt nyt, og vi kunne også hurtigt banke applikationer sammen i det værktøj. Endnu højere produktivitet ser man i dag med Ruby on Rails o.lign. frameworks.

Meeen - og der er et "men" - alt for ofte lader man sig ikke nøje med det, som kan ske på værktøjets præmisser - man vil pludselig have den ene eller den anden ting, som kun vanskeligt lader sig realisere. Og der begynder det virkeligt at koste.

Jeg kan bestemt se behovet for støtte til hurtige "prototyper" - og i virkeligheden er der efter min mening mange applikationer, som ikke burde være bragt længere - de fungerer glimrende, som de er. Faren er bare, om man er villig til at bortkaste "prototypen", når kravene vokser, og værktøjet bliver en belastning fremfor en gevinst? Det sker alt for sjældent efter min mening, og så ender man med år efter år, at smide gode penge efter dårlige - man skulle i stedet have glædet sig over at have fået en god og solid afprøvning af ens reelle behov, og så i øvrigt ikke kigge sig yderligere tilbage.

Og for så endeligt at svare på dit spørgsmål, så tror jeg slet ikke at grænsen er nået for, hvad vi kan computerunderstøtte; Derfor vil der i lang tid fremover blive brug for alle de ressourcer, som vi som samfund kan afse - både mandskabsmæssigt og hardwaremæssigt. 640KB RAM er ikke nok for alle!

Anonym sagde ...

Er SCALA et gratis program?

Unknown sagde ...

Nu er "gratis" og "fri" jo ord, som giver anledning til lange og til tider meget emotionelle debatter - og ikke mindst, når man snakker om software ... men det korte svar på dit spørgsmål er "ja".

Du kan læse meget mere på www.scala-lang.org. Her kan du også læse licensen, som de selv betegner som "BSD-lignende" - og du kan downloade det, som man for Suns Java ville kalde et SDK.

Understøttelsen i diverse udviklingsmiljøer lader (stadig!) en del tilbage at ønske, så jeg udvikler mest med en alm. teksteditor - det er også en glimrende måde på at lære et nyt sprog godt at kende ;-).

PS: Bare for en god ordens skyld: Scala er et sprog, og ikke et program :-).