Haskell

Η Haskell  είναι μια πρότυπη αμιγώς συναρτησιακή γλώσσα προγραμματισμού γενικής χρήσης με μη-αυστηρή σημασιολογία και ισχυρούς τύπους. Πήρε το όνομά της από τον επιστήμονα της λογικής Haskell Curry. Στη Haskell, "μια συνάρτηση είναι μέλος πρώτης τάξης" της γλώσσας προγραμματισμού. Ως συναρτησιακή γλώσσα προγραμματισμού, χρησιμοποιεί σαν κύρια δομή ελέγχου τη συνάρτηση. Η γλώσσα βασίζεται στις παρατηρήσεις του Haskell Curry (1934, 1958) και των πνευματικών του απογόνων, ότι "μια απόδειξη είναι ένα πρόγραμμα και ο μαθηματικός τύπος που αποδεικνύει είναι ο τύπος του προγράμματος".

Ιστορία

Ακολουθώντας την κυκλοφορία της Miranda από τη Research Software Ltd, το 1985, αυξήθηκε το ενδιαφέρον για τις οκνηρές συναρτησιακές γλώσσες προγραμματισμού: μέχρι το 1987, υπήρχαν περισσότερες από δέκα μη-αυστηρές, αμιγώς συναρτησιακές γλώσσες προγραμματισμού. Η Miranda ήταν η πιο δημοφιλής από αυτές αλλά δεν ήταν ελεύθερη για όλες τις χρήσες (public domain). Στο συνέδριο Functional Programming Languages and Computer Architecture (FPCA '87) στο Πόρτλαντ του Όρεγκον των ΗΠΑ, κατά τη διάρκεια συνάντησης, οι συμμετέχοντες συμφώνησαν ότι θα έπρεπε να δημιουργηθεί μια επιτροπή για να δημιουργήσει ένα ανοιχτό πρότυπο για αυτού του τύπου τις γλώσσες. Ο σκοπός της επιτροπής θα ήταν να αποκρυσταλλώσει τα χαρακτηριστικά των υπάρχουσων γλωσσών συναρτησιακού προγραμματισμού σε μια κοινή γλώσσα που θα χρησιμοποιούνταν σαν βάση για μελλοντικές έρευνες στη σχεδίαση συναρτησιακών γλωσσών.

Haskell 1.0

Η πρώτη έκδοση της Haskell ("Haskell 1.0") ορίστηκε το 1990. Οι προσπάθειες της επιτροπής είχαν σαν αποτέλεσμα μια σειρά από ορισμούς της γλώσσας.

Haskell 98

Προς το τέλος του 1997, η σειρά αυτή κατέληξε στην Haskell 98, που είχε σαν στόχο τον ορισμό μιας σταθερής, ελάχιστης και φορητής έκδοσης της γλώσσας, ακολουθούμενο από μια πρότυπη βιβλιοθήκη για τη διδασκαλία της και σαν βάση για μελλοντικές επεκτάσεις. Η επιτροπή ενθάρρυνε τη δημιουργία επεκτάσεων και άλλων εκδόσεων της Haskell 98 μέσω της πρόσθεσης και ενσωμάτωσης πειραματικών χαρακτηριστικών.
Το Φεβρουάριο του 1999, το πρότυπο της γλώσσας Haskell 98 δημοσιεύτηκε ("The Haskell 98 Report"). Τον Ιανουάριο του 2003, μια αναθεωρημένη έκδοση δημοσιεύτηκε ("Haskell 98 Language and Libraries: The Revised Report"). Η γλώσσα συνεχίζει να εξελίσσεται γρήγορα, με την υλοποίηση Glasgow Haskell Compiler (GHC) να απεικονίζει το τρέχον ντε φάκτο πρότυπο.

Haskell Prime

Στις αρχές του 2006, άρχισε η διαδικασία ορισμού του διαδόχου του προτύπου της Haskell 98, το οποίο άτυπα ονομάστηκε Haskell′ ("Haskell Prime"). Αυτή η σταδιακή διαδικασία αναθεώρησης του ορισμού της γλώσσας συνεχίζεται, παράγοντας μια νέα αναθεώρηση κάθε χρόνο. Η πρώτη αναθεώρηση, η Haskell 2010, ανακοινώθηκε το Νοέμβριο του 2009.

Χαρακτηριστικά

Η Haskell χρησιμοποιεί οκνηρή αποτίμηση, ταίριασμα προτύπων (pattern matching), συμπερίληψη λιστών (list comprehensions), κλάσεις τύπων (typeclasses), και πολυμορφισμό τύπων. Είναι μια αμιγώς συναρτησιακή γλώσσα, που σημαίνει ότι οι συναρτήσεις της δεν έχουν παρενέργειες. Υπάρχει ένας ξεχωριστός τύπος που απεικονίζει τις παρενέργειες, ορθογώνιος προς τον τύπο των συναρτήσεων. Μια αμιγής συνάρτηση μπορεί να επιστρέψει μια παρενέργεια, η οποία στη συνέχεια εκτελείται, μοντελοποιώντας με αυτόν τον τρόπο τις μη-αμιγείς (impure) συναρτήσεις των άλλων γλωσσών.
Η Haskell έχει ένα ισχυρό σύστημα τύπων βασισμένο στην εξαγωγή τύπων. Η βασική συνεισφορά της Haskell σε αυτό το πεδίο είναι η προσθήκη των κλάσεων τύπων, οι οποίες αρχικά δημιουργήθηκαν σαν ένας αυστηρός τρόπος να προστεθεί η υπερφόρτωση στη γλώσσα, αλλά στη συνέχεια βρήκαν επιπλέον χρήσεις.
Ο τύπος που απεικονίζει τις παρενέργειες είναι ένα παράδειγμα μίας Μονάδας. Οι Μονάδες είναι ένα γενικό πλαίσιο που μπορεί να μοντελοποιήσει διαφορετικούς τρόπους υπολογισμού, όπως η διαχείριση λαθών, ο μη-ντετερμινισμός, η λεξιλογική ανάλυση και η μνήμη συναλλαγών σε λογισμικό (software transactional memory). Οι Μονάδες ορίζονται σαν απλοί τύποι δεδομένων αλλά η Haskell παρέχει κάποιες συντακτικές διευκολύνσεις (syntactic sugar) για τη χρήση τους.
Η γλώσσα έχει έναν ανοιχτό και δημοσιευμένο ορισμό, και υπάρχουν πολλες υλοποιήσεις.
Υπάρχει μια ζωντανή κοινότητα γύρω από τη γλώσσα και περισσότερο από 1700 βιβλιοθήκες ανοιχτού κώδικα και εργαλεία από τρίτους είναι διαθέσιμα στη διαδικτυακή βιβλιοθήκη πακέτων Hackage.
Η βασική υλοποίηση της Haskell, ο GHC, είναι ταυτόχρονα ένας διερμηνέας και ένας μεταγλωττιστής σε κώδικα μηχανής για πολλές πλατφόρμες. Ο GHC διακρίνεται για την υψηλής απόδοσης υλοποίηση του ταυτοχρονισμού και του παραλληλισμού, και για το πλούσιο σύστημα τύπων του που περιέχει πρωτοποριακά χαρακτηριστικά όπως οι γενικευμένοι αλγεβρικοί τύποι δεδομένων και οι Οικογένειες Τύπων (Type Families).

"Hello World!"

Ακολουθεί ένα πρόγραμμα που εμφανίζει τη φράση "Hello world" σε Haskell (όλες οι γραμμές μπορούν να παραλειφθούν εκτός της τελευταίας):
module Main wheremain :: IO ()main = putStrLn "Hello World!"

Άλλα παραδείγματα

Η συνάρτηση "παραγοντικό" σε Haskell, ορισμένη με τέσσερις διαφορετικούς τρόπους:
-- με αναδρομήfactorial 0 = 1factorial n = n * factorial (n - 1)-- με λίστεςfactorial n = product [1..n]-- με αναδρομή αλλά χωρίς pattern matchingfactorial n = if n > 0 then n * factorial (n-1) else 1-- με χρήση μόνο προθεματικής σύνταξης και n+k-προτύπωνfactorial 0 = 1factorial (n+1) = (*) (n+1) (factorial n)
Μια αποδοτική υλοποίηση της σειράς Fibonacci, σαν άπειρη ακολουθία:
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

Πλατφόρμα της Haskell

Από τον Ιανουάριο του 2007, οι βιβλιοθήκες και οι εφαρμογές που είναι γραμμένες σε Haskell είναι συγκεντρωμένες στο Hackage, μια διαδικτυακή βάση δεδομένων με λογισμικό Haskell ανοιχτού κώδικα που χρησιμοποιεί το σύστημα πακέτων Cabal. Από τον Απρίλιο του 2010 υπάρχουν διαθέσιμα περίπου 2000 πακέτα.
Το Cabal και τα εργαλεία μεταγλώττισης, όπως το Alex και το Happy, σε συνδυασμό με αρκετές βιβλιοθήκες, αποτελούν την Πλατφόρμα της Haskell (Haskell Platform).

Εφαρμογές

Η Haskell χρησιμοποιείται όλο και πιο πολύ σε εμπορικές εφαρμογές. Ο Pugs του Audrey Tang είναι μια υλοποίηση της επερχόμενης γλώσσας Perl 6 με ένα διερμηνέα και μεταγλωττιστές που ήταν έτοιμοι για χρήση μερικούς μήνες μετά τη συγγραφή τους, όμοια ο GHC συχνά χρησιμοποιείται σαν δοκιμαστική πλατφόρμα για προχωρημένα χαρακτηριστικά συναρτησιακού προγραμματισμού και βελτιώσεων. Το Darcs είναι ένα σύστημα διαχείρισης εκδόσεων σε Haskell, με αρκετά πρωτοποριακά χαρακτηριστικά. Η διανομή GNU/Linux Linspire επέλεξε τη Haskell για την ανάπτυξη των εργαλείων συστήματος. Ο Xmonad είναι ένας διαχειριστής παραθύρων για το X Window System, γραμμένος αποκλειστικά σε Haskell.
Η Bluespec SystemVerilog είναι μια γλώσσα για τη σχεδίαση ημιαγωγών που είναι επέκταση της Haskell. Επιπλέον τα εργαλεία της Bluespec έχουν υλοποιηθεί σε Haskell. Η Cryptol, μια γλώσσα και σύνολο εργαλείων για την ανάπτυξη και επιβεβαίωση της ορθότητας κρυπτογραφικών αλγορίθμων, έχει υλοποιηθεί σε Haskell. Ο πρώτος μικροπυρήνας που αποδείχτηκε η ορθότητά του με αυστηρές μεθόδους, ο SeL4, αναπτύχθηκε σε Haskell.

Κριτική

Ο Jan-Willem Maessen, το 2002, και ο Simon Peyton Jones, το 2003, συζήτησαν κάποια προβλήματα που προκύπτουν από την οκνηρή αποτίμηση, αναγνωρίζοντας παράλληλα τη θεωρητική ανάγκη για την ύπαρξή της, και για πρακτικά θέματα όπως η βελτιωμένη απόδοση. Σημειώνουν ότι η οκνηρή αποτίμηση προσθέτει κάποια επιβάρυνση στην απόδοση του προγράμματος και δυσκολεύει τους προγραμματιστές στην κατανόηση της αποδοτικότητας του κώδικά τους (ειδικά όσον αφορά τη χρήση του χώρου στη μνήμη).
Ο Bastiaan Heeren, ο Daan Leijen, και ο Arjan van IJzendoorn το 2003 επίσης εντόπισαν κάποια σημεία που δυσκολεύουν όσους μαθαίνουν Haskell: "Η περίπλοκη σύνταξη και το σύστημα τύπων της Haskell είναι δίκοπο μαχαίρι - οι έμπειροι προγραμματιστές το εκτιμούν αλλά αποτελεί πηγή προβλημάτισμού μεταξύ των αρχάριων επειδή η γενικότητα της Haskell συχνά οδηγεί σε δυσνόητα μηνύματα λάθους". Για να αντιμετωπίσουν αυτό το πρόβλημα ανέπτυξαν ένα προχωρημένο διερμηνέα, τον Helium, που βελτίωσε την ευχρηστία των μηνυμάτων λάθους περιορίζοντας τη γενικότητα κάποιων χαρακτηριστικών της Haskell, με κυριότερο χαρακτηριστικό την απομάκρυνση της υποστήριξης κλάσεων τύπων.