Päivityshistoriaa: 18.3.08 Lisätty luku "Ohjelmoinnin aloittelijoilta kiellettyjä esimerkkejä" / 17.3.2008: Lukuun "Lisää kaikkea kivaa" lisätty Ohjelmoinnin perusteet -kurssin Pikkuvarasto-esimerkki Scalalla. / 13.3.2008: Uusi luku lisätty: "Lisää kaikkea kivaa" / Sivu perustettu 7.3.2008. Arto Wikla.

Miksi Scala?

[Huom: 20.3.2008 loin uuden kantasivun Scala-kielelle: http://www.cs.helsinki.fi/u/wikla/Scala/. Sieltä ei vielä löydy paljon muuta kuin linkki sivulle Scala-linkkejä, vaan kukapa tietää, mitä sieltä vielä vähän päästä löytyykään... ;-]

Ohjelmointikieliä on paljon, hyvin paljon. Scala on yksi uusi monien joukossa. Sillä on kuitenkin jotakin, mitä monilta puuttuu: se vaikuttaa hyvin lupaavalta, suorastaan häkellyttävän lupaavalta.

Kielen viralliset sivut ovat osoitteessa http://www.scala-lang.org/ . Tuolta löytyy mm. aloittelijan opas ja kielen spesifikaatio sekä jotakin noiden ääripäiden väliltäkin. Tekeillä olevan oppikirjan Programming in Scala "PrePrint"-versio löytyy (maksua vastaan!) kustantajan sivulta http://www.artima.com/shop/forsale . Yhtenä kirjoittajana on Scala-kielen isä Martin Odersky.

Scalalla on monia kiinnostavia ominaisuuksia. Seuraavassa on pieni ja epätäydellinen luettelo joistakin kielen ominaisuuksista. Luettelossa on muutamia sivun sisäisiä linkkejä kyseisen ominaisuuden esittelyyn.


Tämän sivun sisältöä:


Pikku ohjelman laatiminen on vaivatonta

Scalassa kirjoitusvaivaa ja erilaisia aloittelijalle käsittämättömiä "loitsuja" on paljon vähemmän kuin Javassa. Kääntäjä ei vaadi puolipistettä, jos se muutenkin osaa päätellä ilmaisujen rajat. Jos muuttujan tyyppi selviää käyttöyhteydestä, tyyppiä ei tarvitse mainita, jne., jne.

Esimerkki 1: Ohjelma laskee syöttölukujen keskiarvon. Lukumäärä pyydetään.

Esimerkki 2: Myös olioiden kanssa askartelu on Javaa paljon vaivattomampaa. Seuraavassa peruskurssin "ensimmäinen olio"

Scala-ohjelman suorittamisen tapoja

  1. Scalaa voidaan suoraan sellaisenaan käyttää "laskimena", antaa ohjelmarivejä suoraan tulkille (komento scala) (käyttäjä kirjoittaa kehoitteen perään - mahdollisesti useita rivejä, jos rakenne on monirivinen - Scala vastaa ilman rivin aloitinmerkkiä; nuo "res n":t ovat arvoille generoituja tunnuksia). Tässä yksi istunto:
    scala> 1+2
    res0: Int = 3
    
    scala> println("Hoi maailma!")
    Hoi maailma!
    
    scala> var a=5
    a: Int = 5
    
    scala> while (a>0) {
         | println(a)
         | a=a-1
         | }
    5
    4
    3
    2
    1
    
    scala> def neliösumma(a:int, b:Int)=
         | a*a+b*b
    neliösumma: (int,Int)Int
    
    scala> neliösumma(3,4)
    res3: Int = 25
    
    scala> exit
    
  2. Kielen ilmauksia voidaan sellaisinaan kirjoittaa teksitiedostoksi, joka suoritetaan ilmauksella scala tiedostonimi. Tällä tavoin käytettynä Scalaa voitaisiin kutsua "skriptikieleksi". Esimerkkinä tiedosto tervehdi.ohjelma:
    println("Montako tervehdystä?")
    var lkm = readInt
    while (lkm>0) {
      println("Hoi maailma!")
      lkm = lkm-1
    }
    
    Suoritus komennolla
    scala tervehdi.ohjelma

  3. Scala-ohjelma voidaan kääntää Javan tavukoodiksi Java-virtuaalikoneella suoritettavaksi. Nyt tarvitaan pääohjelma, jotta virtuaalikone tietäisi, ketä kutsua. Scalassa ei ole "static"-kalustoa; sellaisen vastineena käytetään ns. singleton-olioita (eli "ainokaisia" Koskimiehen Kaitsun käännöksenä). Syntaksi on yksikertainen ja luonteva. Äskeinen ohjelma on muokattava muotoon
    object tervehdi {
      def main(args: Array[String]) = {
        println("Montako tervehdystä?")
        var lkm = readInt
        while (lkm>0) {
          println("Hoi maailma!")
          lkm = lkm-1
        }
      }
    }
    
    Ohjelma Javan tapaan käännetään ensin tavukoodiksi
    scalac tervehdi.scala
    ja myös suoritetaan Javan tapaan komennolla
    scala tervehdi

  4. Scalan "skripti" voidaan helposti muuttaa myös Linuxin tai Windowsin komentotulkille annettavaksi skriptiksi. Esimerkkinä edellä nähty esimerkki Linuxin skriptinä (yksinkertaistettu 11.3.08):
    #!/usr/bin/env scala
    !#
    println("Montako tervehdystä?")
    var lkm = readInt
    while (lkm>0) {
      println("Hoi maailma!")
      lkm = lkm-1
    }
    
    Ohjelma käynnistyy yksinkertaisesti tiedostonimellä. Suoritusoikeus tiedostolle on luonnollisesti annettava.

Quicksort kahdella tyylillä

  1. Pikajärjestäminen voidaan ohjelmoida tavalliseen algoritmiseen ("proseduraaliseen") tapaan:
    def sort(xs: Array[Int]) {
      def swap(i: Int, j: Int) {
        val t = xs(i); xs(i) = xs(j); xs(j) = t
      }
      def sort1(l: Int, r: Int) {
        val pivot = xs((l + r) / 2)
        var i = l; var j = r
        while (i <= j) {
          while (xs(i) < pivot) i += 1
          while (xs(j) > pivot) j -= 1
          if (i <= j) {
            swap(i, j)
            i += 1
            j -= 1
          }
        }
        if (l < j) sort1(l, j)
        if (j < r) sort1(i, r)
      }
      sort1(0, xs.length - 1)
    }
    
    Tässä huomiota kannattaa kiinnittää mm. siihen, miten Scala Algolin ja Pascalin tapaan sallii sisäkkäiset aliohjelmat meille vanhemmille tutuin näkyvyyssännöin ;-). C-pohjaisissa kielissä - Java mukaan lukien! - aliohjelmarakenne on "litteä": niissä aliohjelma ei voi sisältää omia "pikku apulaisiaan" Algolin ja Pascalin tapaan!
    Taulukon indeksoinnissa Scala käyttää kaarisulkeita tuttujen hakasulkeiden síjaan.

  2. Myös funktionaalinen tyyli Scalalla sujuu:
    def sort(xs: Array[Int]): Array[Int] =
      if (xs.length <= 1) xs
      else {
        val pivot = xs(xs.length / 2)
        Array.concat(
          sort(xs filter (pivot >)),
          xs filter (pivot ==),
          sort(xs filter (pivot <))
        )
    }
    
    Tässä huomio kannattaa kiinnittää muutamaan seikkaan: Array.concat liittää yhteen kolme osataulukkoa. ensimmäiseen suodatetaan kaikki jakoalkiota pienemmät alkiot, keskimmäiseen jakoalkion kanssa yhtä suuret ja kolmanteen suuremmat. Suodattimelle (filter) annetaan argumenttina ns. predikaattifunktio tyyliin "pivot >", mikä todellakin tarkoittaa sitä, että vertailun operaatio annetaan parametrina. Scalassa funktiot ovat arvoja siinä kuin numeeriset arvotkin, funktioita voidaan välittää parametreina, muuttujan arvona voi olla funktio, funktio voi palauttaa arvonaan funktion, käytettävissä ovat funktioliteraalit siinä kuin numeeriset literaalitkin...

Lisää kaikkea kivaa

Ohjelmoinnin aloittelijoilta kiellettyjä esimerkkejä


Visitor Counter by
Digits
(by WebCounter) (10.3.2008)