Kirjoittaja: tsuriga (12.12.2009)
Martin Odersky Lausannen Teknillisestä korkeakoulusta lähti vuonna 2001 kehittämään käyttäjien tarpeiden mukaan kasvavaa kieltä. Tästä muodostuukin myös kielen nimi, Scala; scalable language. Kielen ensiesiintyminen nähtiin vuosien 2003 ja 2004 vaihteessa, ja vuonna 2006 julkaistiin versio 2.0.
Ajoympäristönä toimii Java Virtual Machine. Scala-koodi käännetään Javan tavoin tavukoodiksi, joka voidaankin kääntää takaisin lähes täysin toimivaksi Java-koodiksi. Scalassa voidaan yhtenevän käännösmallin ansiosta käyttää suoraan Javan tarjoamia kirjastoja.
object Hello extends Application { println("Hei, Korvatunturi!") }
tai pidemmän kaavan mukaan:
object Hello { def main(args : Array[String]) : Unit = { println("Hei, Korvatunturi!") } }
Unit on kuten useista kielistä tuttu void
, mutta sillä erotuksella, että Unitille on mahdollista antaa paluuarvo ()
.
object Fibonacci { def main(args : Array[String]): Unit = { var f = 0 var i = 1 while (f < 100) { println(f) f = fib(i) i += 1 } } /* Rekursiivinen Fibonacci-toteutus */ def fib(n: Int): Int = n match { case 0 => 0 case 1 => 1 case _ => fib(n - 1) + fib(n - 2) } }
Scalassa yhdistyvät oliopohjaisuus sekä funktionaaliset lähestymistavat. Jokainen arvo on olio, ja jokaiselle oliolle voidaan uudelleenmääritellä mm. infix- ja postfix-operaattorit. Funktioiden tuettuja ominaisuuksia ovat mm. nimeämättömyys sekä sisäkkäisyys. Scalassa on myös hieman rajapintoja vastaava ominaisuus, piirteet. Arvoja voidaan tallentaa sekä muuttumattomina val-etuliitteellä että muuttuvina var-etuliitteellä varustettuna.
object Hello { def main(args : Array[String]) : Unit = { /* Merkkijonoarvo, jota ei voida muuttaa */ val viesti = "Hei, Korvatunturi!" /* Merkkijonomuuttuja, jonka arvo voidaan muuttaa */ var tervehdys = "Hei, Korvapuntari!" /* Lista-tyyppinen muuttuja */ /* Huomatkaa ::-operaattori, jolla lisätään arvoja listaan * sekä :::-operaattori, jolla voidaan yhdistää listoja. */ var hahmot = "Tupu" :: "Hupu" :: "Lupu" :: Nil val lisahahmot = "Vertti" :: "Mortti" :: Nil val kaikki = hahmot ::: lisahahmot /* Luodaan tavallinen henkilö ja tervehditään*/ var henkilo: Henkilo = new Henkilo println(henkilo.tervehdi()) /* Luodaan vihaiset piirteet omaava henkilö ja tervehditään */ henkilo = new Henkilo with Vihainen println(henkilo.tervehdi()) } } /* Perushenkilö */ class Henkilo { def tervehdi() = "Hei" } /* Vihainen henkilöpiirre */ trait Vihainen extends Henkilo { override def tervehdi(): String = { return "Ärr! " + super.tervehdi() } }
Kielen voi nähdä tositoimissa Twitterissä, joka ilmoitti kuluvan vuoden huhtikuussa muuttaneensa suuren osan sivuston taustapalveluita pyörittävästä Ruby-koodista Scalaan. Scalalle on myös Ruby on Railsin kaltainen kehityskirjasto (framework), Lift.
Suunnitteluvaiheessa on otettu tosissaan vanha vitsi ohjelmoijien laiskuudesta. Kieleen kun on nimittäin määritelty avainsana lazy, jolla voidaan ilmoittaa, että muuttuja tarvitsee alustaa vasta tarvittaessa.