Java

Scala

  • 2011-07-10 18:26
  • 0 komentarzy
  • 2805 odsłon
  • Oceń ten tekst jako pierwszy
Spis treści

     1 Podstawowe informacje
     2 Cechy szczególne
          2.1 Scala - język obiektowy
               2.1.1 Traits
               2.1.2 Object
          2.2 Scala - język funkcyjny
               2.2.1 Pattern matching
     3 Powiązania


Podstawowe informacje


Scala1 jest językiem obiektowo-funkcyjnym stworzonym pod kierownictwem Martina Odersky'ego na Politechnice w Lozannie w 2001 roku. Pierwsza stabilna wersja języka ukazała się w roku 2004, a wersja druga w 2006. Obecnie język jest dostępny w wersji 2.9( podwersja .0.1 ukazała się w maju 2011) . Scala jest dostępna na platformę JVM, KVM CLDC oraz .NET (w tej wersji może być nieaktualna).
Scala jest typowana statycznie, ale kompilator potrafi wnioskować typy jeżeli nie są podane explicite.

Cechy szczególne


Scala wyróżnia się prostotą składni i jest stosunkowo łatwym do nauki językiem. Łączy w sobie cechy języków obiektowych oraz funkcyjnych. Programy w tym języku mogą być uruchamiane jako skrypty jak i skompilowane do bytecodu JVM i uruchamiane jak zwykłe programy w Javie.

Scala - język obiektowy


Scala jako język obiektowy wyróżnia się brakiem typów prymitywnych znanych z Javy. Ponad to wszystko jest traktowane jako obiekt (można zatem np. przeciążać operatory, które są traktowane jak metody). W Języku tym dziedziczenie jest możliwe, jak w Javie, tylko z pojedynczej nadklasy. Jednocześnie nie ma interfejsów w ich miejsce wprowadzono tzn. Traits. Język udostępnia też specjalne klasy - object, które są traktowane jak Singletony.

Traits


Trait jest charakterystyczną konstrukcją występującą w Scali. W najprostszym ujęciu jest to odpowiednik javowego interfejsu. Tak jak interfejs definiuje tylko listę dostępnych metod, może być implementowany przez klasy, można implementować wiele traitsów w ramach jednej klasy. Jednocześnie w przeciwieństwie do interfejsu trait może dostarczyć implementacji metod i zachowywać się jak mixin.

Przykładowy trait Ordered dostarcza metod pozwalających na porównywanie obiektów:
trait Ordered[A]{
   def compare(that: A): Int
 
  def <  (that: A): Boolean = (this compare that) <  0
  def >  (that: A): Boolean = (this compare that) >  0
  def <= (that: A): Boolean = (this compare that) <= 0
  def >= (that: A): Boolean = (this compare that) >= 0
  def compareTo(that: A): Int = compare(that)
 
}
 
class Name(first:String, last:String) extends Ordered[Name] {
 
  val firstName = first
 
  val lastName=last
 
 
  def compare(that: Name): Int = { 
   if (lastName.compareTo(that.lastName) == 0 ){
     return firstName.compareTo(that.firstName)
 
   }else{
     return lastName.compareTo(that.lastName)
   }
   0 
  }
  override def toString :String = {
    return firstName+" " +lastName
  }
}


Object


Jak już zostało wspomniane object jest to tak naprawdę Singleton, a cechę tą gwarantuje składnia języka oraz kompilator. Ponad to object jest jedyną opcją na dostarczenie głównej metody programu (w javie metoda main)
object Main {
 
  def main(args: Array[String]): Unit = {
 
    val a: Name = new Name("Adam", "Kowalski");
    val b: Name = new Name("Bartek", "Kowalski");
    val c: Name = new Name("Cezary", "Kowalski");
    val names: List[Name] = List(a, c, b);
   print( names.sort(_ < _)) ;
  }
 
}


Scala - język funkcyjny


Scala pozwala też na wykorzystanie paradygmatu programowania funkcyjnego. W znacznym uproszczeniu oznacza to, że programista definiuje CO chce uzyskać, a sposób w jaki zostanie wykonane polecenie jest przeniesiony do biblioteki języka.

// sumowanie wszystkich elementów listy
List(1,3,4,2).foldLeft(0)(_ + _)
// iloczyn wszystkich elementów listy
List(1,3,4,2).foldLeft(1)(_ * _)


Pattern matching


Jest to cecha języka, która pozwala na wykonywanie kodu w zależności od określonych kryteriów. Cecha ta jest doskonale widoczna w przypadku bloków try/catch, które w Scali wyglądają następująco:
   try { 
      // ... 
   } catch {
     case ioe: IOException => ... // more specific cases first !
     case e: Exception => ...
   }


W ten sam sposób można uwarunkować kod:

     names.foreach(_.firstName match {
      case "Adam" => println("Moje imie jest biblijne") 
      case "Bartek" => println("Moje imie to zdrobnienie, ale od którego?")
      case _ => println("Co ja tutaj robię?")
    })


Powiązania


W Scali powstał framework webowy LIft 2 .
W Scali są tworzone portale Guardian 3 oraz DSL Scalar służący do obsługi Cloud Coumputingu4

[1] http://www.scala-lang.org/
[2] http://liftweb.net/
[3] http://www.infoq.com/articles/guardian_scala
[4] http://www.jroller.com/nivanov[...]oducing_scalar_scala_based_dsl