Kirjautuminen

Haku

Tehtävät

Joulukalenteri 2009: Scala

Kirjoittaja: tsuriga (12.12.2009)

Esittely

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.

Tekstin tulostus

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 ().

Fibonaccin luvut

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.

Hauska tietää

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.

Linkkejä

Tietoa sivustosta