Scala

Η **Scala** είναι μια γλώσσα προγραμματισμού πολλαπλών παραδειγμάτων που σχεδιάστηκε για να ενσωματώσει χαρακτηριστικά του αντικειμενοστρεφούς προγραμματισμού και του συναρτησιακού προγραμματισμού. Το όνομα Scala προέρχεται από την αγγλική φράση "*scalable language*", που δηλώνει ότι έχει σχεδιαστεί για να μπορεί να μεγαλώνει παράλληλα με τις ανάγκες των χρηστών της.

## Πλατφόρμες και άδεια
Η Scala εκτελείται στην εικονική μηχανή της πλατφόρμας της Java και είναι συμβατή με τα υπάρχοντα προγράμμα σε Java. Μπορεί επίσης να εκτελείται σε Java Platform, Micro Edition Connected Limited Device Configuration. Υπάρχει μια εναλλακτική υλοποίηση για την πλατφόρμα .NET, αλλά δεν αναπτύσσεται ενεργά..

Η Scala έχει το ίδιο μοντέλο μεταγλώττισης με τη Java και τη C# (ξεχωριστή μεταγλώττιση, δυναμική φόρτωση κλάσεων), επομένως ο κώδικας σε Scala μπορεί να καλεί βιβλιοθήκες της Java (ή βιβλιοθήκες της πλατφόρμας .NET στην υλοποίηση για .NET).

Τα λειτουργικά χαρακτηριστικά της Scala είναι ίδια με αυτά της Java. ο μεταγλωττιστής της Scala παράγει κώδικα byte (byte code) που είναι σχεδόν ίδιος με αυτόν του μεταγλωττιστή της Java. Στην πραγματικότητα, είναι δυνατόν να απο-μεταγλωττιστεί (decompile) ο κώδικας της Scala σε ευανάγνωστο κώδικα της Java, με την εξαίρεση κάποιων λειτουργιών κατασκευαστών. Όσον αφορά την εικονική μηχανή (JVM), δε γίνεται κάποια διάκριση μεταξύ κώδικα Scala και κώδικα Java. Η μόνη διαφορά είναι μια επιπλέον βιβλιοθήκη χρόνου εκτέλεσης, η scala-library.jar.

Η διανομή λογισμικού της Scala, που περιέχει το μεταγλωττιστή και τις βιβλιοθήκες, διανέμεται κάτω από την άδεια λογισμικού BSD.

## Ιστορία
Η σχεδίαση της Scala άρχισε το 2001 στο École Polytechnique Fédérale de Lausanne (EPFL) από τον Martin Odersky, σαν συνέχεια δουλειάς πάνω στη Funnel, μια γλώσσα προγραμματισμού που συνδύαζε ιδέες από το συναρτησιακό προγραμματισμό και τα δίκτυα Petri (Petri nets). Ο Odersky είχε πιο πριν εργαστεί στην Generic Java και στον javac, τον μεταγλωττιστή της Sun για τη Java. Η Scala κυκλοφόρησε στην περίοδο τέλος του 2003 - αρχές του 2004  στην πλατφόρμα της Java, και τον Ιούνιο του 2004 στην πλατφόρμα .NET. Μια δεύτερη έκδοση της γλώσσας, η v2.0, κυκλοφόρησε το Μάρτιο του 2006.

## Αντικειμενοστρεφή χαρακτηριστικά
Η Scala είναι μια αμιγώς αντικειμενοστρεφής γλώσσα, δηλαδή κάθε τιμή είναι ένα αντικείμενο. Οι τύποι των δεδομένων και οι συμπεριφορές των αντικειμένων περιγράφονται από κλάσεις και traits. Οι αφαιρέσεις κλάσεων μπορούν να επεκταθούν με υποκλάσεις και μέσω ενός ευέλικτου μηχανισμού σύνθεσης βασισμένου στα mixins, για να αποφεύγονται τα προβλήματα της πολλαπλής κληρονομικότητας.

## Συναρτησιακός προγραμματισμός
Η Scala επίσης υποστηρίζει το συναρτησιακό προγραμματισμό. Η γλώσσα παρέχει μια ελαφριά σύνταξη για τον ορισμό ανώνυμων συναρτήσεων, υποστηρίζει συναρτήσεις ανώτερης τάξης, επιτρέπει την ένθεση συναρτήσεων και υποστηρίζει το currying (μερική εφαρμογή συναρτήσεων σε λιγότερα ορίσματα από αυτά που δέχονται). Η χρήση της δεσμευμένης λέξης "lazy" μεταθέτει την αρχικοποίηση μιας μεταβλητής μέχρι το χρόνο χρήσης της.

Ακολουθεί μια υλοποίηση του αλγόριθμου ταξινόμησης Quicksort σε συναρτησιακό στυλ, για σύγκριση με τον αντίστοιχο της Erlang:


```scala
def qsort: List[Int] => List[Int] = {
  case Nil => Nil
  case pivot :: tail =>
    val (smaller, rest) = tail.partition(_ < pivot)
    qsort(smaller) ::: pivot :: qsort(rest)
}
```


## Στατικό σύστημα τύπων
Η Scala έχει ένα εκφραστικό στατικό σύστημα τύπων που επιβάλλει την ασφαλή και συνεπή χρήση των αφαιρέσεων. Το σύστημα τύπων υποστηρίζει:
* γενικές κλάσεις (generic classes),
* variance annotations,
* άνω και κάτω όρια τύπων,
* τοπική εξαγωγή τύπων,
* κλάσεις και αφηρημένους τύπους σαν μέλη αντικειμένων,
* σύνθετους τύπους (compound types),
* ρητά τυποποιημένες αυτοαναφορές,
* views, και
* πολυμορφικές μεθόδους.

## Επεκτασιμότητα
Η σχεδίαση της Scala αναγνωρίζει το γεγονός ότι, στην πράξη, η ανάπτυξη εφαρμογών εξειδικευμένων σε κάποιο πεδίο συνήθως απαιτεί επεκτάσεις σχετικά με αυτό το πεδίο στη γλώσσα (domain-specific language extensions). Η Scala παρέχει ένα μοναδικό συνδυασμό μηχανισμών στη γλώσσα που διευκολύνουν την προσθήκη στη γλώσσα μέσω βιβλιοθηκών:

* κάθε μέθοδος μπορεί να χρησιμοποιηθεί σαν ενθεματικός ή προθεματικός τελεστής, και
* τα κλεισίματα κατασκευάζονται αυτόματα ανάλογα με τον τύπο που απαιτείται (target typing).

Η συνδυασμένη χρήση αυτών των δύο χαρακτηριστικών διευκολύνει τον ορισμό νέων εντολών χωρίς να πρέπει να επεκταθεί η σύνταξη της γλώσσας και χωρίς τη χρήση τεχνικών μακρο-προγραμματισμού ή μετα-προγραμματισμού.

## Λογισμικό που χρησιμοποιεί Scala

Το Lift είναι ελεύθερο λογισμικό για εφαρμογές διαδικτύου (web-apps) με παρόμοιους στόχους με το Ruby on Rails. Η χρήση της Scala συνεπάγεται ότι στην εκτέλεση εφαρμογών σε Lift μπορεί να χρησιμοποιηθεί κάθε υπάρχουσα βιβλιοθήκη ή Web container της Java.

Τον Απρίλιο του 2009 το Twitter ανακοίνωσε ότι μετέφεραν μεγάλα τμήματα του πίσω κώδικά τους από Ruby σε Scala με σκοπό να συνεχίσουν αυτήν τη μετατροπή και στον υπόλοιπο κώδικά τους. Επιπλέον, η Wattzon δήλωσε δημόσια ότι ολόκληρη η πλατφόρμα της γράφτηκε πάλι από την αρχή σε Scala..

Το Foursquare χρησιμοποιεί τη Scala και το Lift.

## Παράδειγμα "Hello world"
Ακολουθεί το κλασικό παράδειγμα ενός προγράμματος που εμφανίζει τη φράση "Hello world" σε Scala:


```scala
object HelloWorld extends Application {
   println("Hello, world!")
 }
```


ή


```scala
object HelloWorld {
   def main(args: Array[String]) {
     println("Hello, world!")
   }
 }
```


Το πρόγραμμα μοιάζει αρκετά με τον αντίστοιχο της Java με τη διαφορά ότι τίποτα δε δηλώνεται στατικό αλλά χρησιμοποιείται το Singleton pattern που δηλώνεται από τη δεσμευμένη λέξη **object**.

Θεωρώντας ότι το πρόγραμμα αποθηκεύτηκε σαν ένα αρχείο με το όνομα HelloWorld.scala, μπορεί να μεταγλωττιστεί με την εξής εντολή από τη γραμμή εντολών:

 > scalac HelloWorld.scala

Για να εκτελεστεί χρειάζεται η εξής εντολή:

 > scala -classpath . HelloWorld

Η παραπάνω διαδικασία είναι ανάλογη με τη διαδικασία που ακολουθείται για τη μεταγλώττιση και εκτέλεση του ίδιου προγράμματος σε Java. Το μοντέλο μεταγλώττισης και εκτέλεσης της Scala είναι ταυτόσημο με αυτό της Java, με αποτέλεσμα να υπάρχει συμβατότητα με τα εργαλεία ανάπτυξης και μεταγλώττισης της Java όπως το Ant.

Επίσης το ίδιο πρόγραμμα μπορεί να πληκτρολογηθεί κατευθείαν στο διερμηνέα της Scala, με την επιλογή **-i** (για να φορτώσει τον κώδικα από το αρχείο) και την επιλογή **-e** (για να εκτελέσει τον επιπλέον κώδικα που χρειάζεται για να κληθεί η μέθοδος του αντικειμένου του HelloWorld):

 > scala -i HelloWorld.scala -e 'HelloWorld.main(null)'

## Δοκιμή λογισμικού
Υπάρχουν αρκετοί τρόποι να ελέγξει κανείς κώδικα σε Scala:
* ScalaTest
* ScalaCheck, μια βιβλιοθήκη που μοιάζει με τη βιβλιοθήκη QuickCheck της Haskell
* specs, μια βιβλιοθήκη ανάπτυξης καθοδηγούμενης από τη συμπεριφορά, για Scala
* JUnit

## Δείτε επίσης
* Clojure

## Αναφορές


## Επιπλέον πηγές για διάβασμα
* 
* 
* 
* 
* 
* 
* 

## Εξωτερικοί σύνδεσμοι

* Η σελίδα της Scala 
* Simply Scala διαδικτυακή έκδοση της Scala - σας επιτρέπει να τη δοκιμάσετε στο φυλλομετρητή σας 
* Scala Wiki  
* Literate Programs - Scala  
* The Scala Search Engine 
* Lift Web Framework 
* O/R Broker 
* Συνέντευξη podcast με τον Martin Odersky για τη Scala 
* Παρουσίαση της Scala από το Googleplex (video) - από τον Martin Odersky, δημιουργό της γλώσσας - slides της ομιλίας 
* Scalaz  
* Scala community blogs 
* Lift Slides από το video του Pollak για Lift, περιλαμβάνει μια παρουσίαση της Scala 
* Scala articles directory 
* Scala for Java Refugees 
* Programming Scala (ebook) 
* Scala Forum 

Κατηγορία:Αντικειμενοστρεφείς γλώσσες προγραμματισμού
Κατηγορία:Συναρτησιακές γλώσσες προγραμματισμού