Η **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:

```
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:

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

```

ή

```
 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

Αναφορές
--------

1. 1 2 3  Martin Odersky et al. An Overview of the Scala Programming Language, 2nd Edition
2. ↑  «Scala on .NET». Programming Methods Laboratory of EPFL. 7 Ιανουαρίου 2008. Αρχειοθετήθηκε από το πρωτότυπο στις 9 Οκτωβρίου 2007. Ανακτήθηκε στις 15 Ιανουαρίου 2008. *Scala is primarily developed for the JVM and embodies some of its features. Nevertheless, its .NET support is designed to make it as portable across the two platforms as possible.*
3. ↑
4. ↑  «Αρχειοθετημένο αντίγραφο». Αρχειοθετήθηκε από το πρωτότυπο στις 31 Αυγούστου 2010. Ανακτήθηκε στις 24 Σεπτεμβρίου 2019.
5. ↑
6. 1 2 3  Martin Odersky, "A Brief History of Scala", Artima.com weblogs, June 9, 2006
7. ↑  Martin Odersky, "The Scala Language Specification Version 2.7"
8. ↑  Greene, Kate (1 Απριλίου 2009). «The Secret Behind Twitter's Growth, How a new Web programming language is helping the company handle its increasing popularity». *Technology Review*. MIT. Αρχειοθετήθηκε από το πρωτότυπο στις 17 Απριλίου 2012. Ανακτήθηκε στις 6 Απριλίου 2009.
9. ↑  Cloud, Jeremy (10 Μαρτίου 2009). «Scala + WattzOn, sitting in a tree...».

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

* Meredith, Gregory (April 25, 2010), *Pro Scala: Monadic Design Patterns for the Web* (1st έκδοση), Apress, σελ. 300, ISBN 143022844X, ανακτήθηκε στις 2010-04-07
* Wampler, Dean; Payne, Alex (September 15, 2009), *Programming Scala: Scalability = Functional Programming + Objects* (1st έκδοση), O'Reilly Media, σελ. 448, ISBN 0596155956,
* Odersky, Martin; Spoon, Lex; Venners, Bill (November 26, 2008), *Programming in Scala: A Comprehensive Step-by-step Guide* (1st έκδοση), Artima Inc, σελ. 776, ISBN 0981531601,
* Pollak, David (May 25, 2009), *Beginning Scala* (1st έκδοση), Apress, σελ. 776, ISBN 1430219890, ανακτήθηκε στις 2010-04-07
* Subramaniam, Venkat (July 28, 2009), *Programming Scala: Tackle Multi-Core Complexity on the Java Virtual Machine* (1st έκδοση), Pragmatic Bookshelf, σελ. 250, ISBN 193435631X, ανακτήθηκε στις 2010-04-07
* Wampler, Dean; Payne, Alex (September 25, 2009), *Programming Scala* (1st έκδοση), O'Reilly Media, σελ. 250, ISBN 9780596157746,
* Loverdos, Christos; Syropoulos, Apostolos (Σεπτέμβριος 2010), *Steps in Scala: An Introduction to Object-Functional Programming* (1st έκδοση), Cambridge University Press, σελ. xviii + 485, ISBN 9780521747585,

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

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