Lisp

Lisp ονομάζεται μια οικογένεια γλωσσών προγραμματισμού υπολογιστών με μεγάλη ιστορία και χαρακτηριστική σύνταξη με πλήρεις παρενθέσεις. Αρχικά προσδιορίστηκε το 1958, και είναι η δεύτερη σε ηλικία γλώσσα προγραμματισμού υψηλού επιπέδου, νεότερη μόνο από τη Fortran. Όπως και η Fortran, η Lisp έχει αλλάξει πολύ σε σχέση με την πρώτη της εμφάνιση, με αρκετές διαλέκτους της να υπάρχουν ανά την ιστορία της. Σήμερα, οι διάλεκτοι της Lisp με την περισσότερη χρήση και διάδοση είναι η Common Lisp και η Scheme.

Η Lisp δημιουργήθηκε αρχικά ως μια πρακτική μαθηματική σημειολογία για προγράμματα υπολογιστών, βασισμένη στο λογισμό λάμδα του Alonzo Church. Γρήγορα εξελίχθηκε στην γλώσσα προτίμησης για έρευνα σε τεχνητή νοημοσύνη. Ως μια από τις πρώτες γλώσσες προγραμματισμού, η Lisp πρωτοπόρησε στην εισαγωγή πολλών ιδεών στην επιστήμη υπολογιστών, όπως οι δομές δένδρων, η αυτόματη διαχείριση αποθήκευσης δεδομένων, οι δυναμικοί τύποι, ο αντικειμενοστρεφής προγραμματισμός, και ο μεταγλωττιστής που μεταγλωττίζει τον εαυτό του.

Το όνομα Lisp προέρχεται από τη φράση "List Processing". Οι συνδεδεμένες λίστες είναι μία από τις σημαντικότερες δομές δεδομένων στη Lisp, και ο πηγαίος κώδικας των προγραμμάτων Lisp αποτελείται ο ίδιος από λίστες. Ως αποτέλεσμα, τα προγράμματα σε Lisp μπορούν να διαχειρίζονται και να επεξεργάζονται πηγαίο κώδικα Lisp ως άλλη μια δομή δεδομένων. Αυτό ανέδειξε τα συστήματα μακροεντολών που επιτρέπουν στους προγραμματιστές να δημιουργήσουν νέα σύνταξη ή ακόμα και νέες "μικρές γλώσσες" που περιέχονται στη Lisp.

Το γεγονός ότι ο κώδικας είναι απαράλλακτος από τα δεδομένα, δίνει στη Lisp μια χαρακτηριστική σύνταξη που αναγνωρίζεται εύκολα. Όλος ο κώδικας του προγράμματος γράφεται ως λίστες μέσα σε παρενθέσεις. Η κλήση μιας συνάρτησης γράφεται ως μια λίστα όπου το όνομα της συνάρτησης είναι πρώτο, και ακολουθούν τα ορίσματα. Για παράδειγμα, μια συνάρτηση f που παίρνει τρία ορίσματα μπορεί να καλεσθεί με (f x y z).

Η δημιουργία της Lisp 
Η Lisp εφευρέθηκε από τον Τζον Μακάρθι το 1958 ενώ ήταν στο MIT. Ο Μακάρθι δημοσίευσε τη σχεδίαση της Lisp σε ένα άρθρο στο Communications of the ACM το 1960, με τίτλο Αναδρομικές Συναρτήσεις Συμβολικών Εκφράσεων και ο Υπολογισμός τους με Μηχανή, Μέρος I, ("Recursive Functions of Symbolic Expressions and Their Computation By Machine, Part I".)  Το δεύτερο μέρος δεν δημοσιεύθηκε ποτέ.  Έδειξε ότι με μερικούς απλούς τελεστές και ένα συμβολισμό για συναρτήσεις, μπορεί να δημιουργηθεί μια Turing-πλήρης γλώσσα για αλγορίθμους.

Η Lisp υλοποιήθηκε για πρώτη φορά από τον Steve Russell σε ένα IBM 704 υπολογιστή.  Ο Russell είχε διαβάσει το άρθρο του McCarthy και συνειδητοποίησε (προς έκπληξη του McCarthy) ότι η eval συνάρτηση μπορούσε να υλοποιηθεί ως ένας ερμηνευτής για τη Lisp.

Ο πρώτος πλήρης μεταγλωττιστής για Lisp, γραμμένος σε Lisp, υλοποιήθηκε το 1962 από τον Tim Hart και τον Mike Levin στο ΜΙΤ.

Ο μεταγλωττιστής αυτός εισήγαγε το μοντέλο σταδιακής μεταγλώττισης της Lisp, στο οποίο μεταγλωττισμένες και ερμηνευόμενες συναρτήσεις μπορούν να αναμειχθούν ελεύθερα.  Η γλώσσα που χρησιμοποιούν οι Hart και Levin είναι πολύ πιο κοντά στο σημερινό στυλ Lisp σε σχέση με τον προηγούμενο κώδικα του McCarthy.

Συμπτώσεις στην πρώιμη ιστορία 
Η Information Processing Language ήταν η πρώτη γλώσσα για AI, από το 1955 ή 1956, και ήδη περιείχε πολλές από τις ιδέες (όπως π.χ. επεξεργασία λιστών και αναδρομή) που κατέληξαν να χρησιμοποιούνται στη Lisp.

Ο αρχικός συμβολισμός του McCarthy χρησιμοποιούσε "Μ-εκφράσεις" που μπορούσαν να διερμηνευθούν σε "S-εκφράσεις".  Για παράδειγμα,
η M-έκφραση car[cons[A,B]] αντιστοιχεί στην S-έκφραση (car (cons A B)). Όταν υλοποιήθηκε η Lisp, οι προγραμματιστές γρήγορα επέλεξαν να χρησιμοποιούν S-εκφράσεις και οι M-εκφράσεις εγκαταλείφθηκαν.  Οι M-εκφράσεις επανήλθαν στο προσκήνιο ξανά με τις ακαρπες προσπάθειες της MLISP από τον Horace Enea και της CGOL από τον Vaughan Pratt.

Δυο μακροεντολές της συμβολικής γλώσσας του IBM 704 έδωσαν το όνομά τους στις βασικές λειτουργίες για την αποδόμηση των λιστών: car (Contents of Address Register – τα περιεχόμενα του καταχωρητή διευθύνσεων) και cdr (Contents of Decrement Register – τα περιεχόμενα του καταχωρητή μειώσεων). Οι διαλέκτοι της Lisp χρησιμοποιούν ακόμα το car και cdr (προφέρεται:  and ) για τις λειτουργίες που επιστρέφουν το πρώτο στοιχείο μιας λίστας, και το υπόλοιπο της λίστας, αντίστοιχα.

Γενεαλογία και παραλλαγές 
Στα περίπου πενήντα χρόνια της ιστορίας της, η Lisp έχει γεννήσει πολλές παραλλαγές πάνω στο βασικό θέμα μιας γλώσσας με S-εκφράσεις.  Επιπλέον, κάθε μια από τις διαλέκτους μπορεί να έχει πάνω από μια υλοποιήσεις.  Για παράδειγμα, υπάρχουν πάνω από δώδεκα υλοποιήσεις της Common Lisp.

Οι διαφορές μεταξύ των διαλέκτων μπορεί να είναι πολύ προφανείς.  Για παράδειγμα, η Common Lisp και η Scheme χρησιμοποιούν διαφορετικές λέξεις-κλειδιά για να ορίσουν συναρτήσεις.  Για μια δεδομένη διάλεκτο, όμως, όλες οι υλοποιήσεις υποστηρίζουν την ίδια βασική γλώσσα, με διαφορές στις επεκτάσεις και τις βιβλιοθήκες.

Διάλεκτοι ιστορικής αξίας 
 LISP 1.5  – Η πρώτη έκδοση με ευρεία διανομή, αναπτύχθηκε από τον McCarthy και άλλους στο MIT. Ονομάστηκε έτσι επειδή περιέχει αρκετές βελτιώσεις σε σχέση με τον αρχικό ερμηνευτή της "LISP 1," αλλά χωρίς να απαιτεί βασική αναδιοργάνωση, όπως θα έκανε η προγραμματιζόμενη LISP 2. (Η LISP 2 χρησιμοποιούσε σύνταξη βασισμένη σε M-εκφράσεις και δεν χρησιμοποιήθηκε ευρέως.)
 Stanford LISP 1.6  – Η διάδοχος της LISP 1.5, αναπτύχθηκε στο Stanford AI Lab, και εξαπλώθηκε πολύ στα συστήματα PDP-10 τα οποία έτρεχαν το λειτουργικό σύστημα TOPS-10.  Ξεπεράστηκε από τις Maclisp και InterLisp.
 Maclisp  – αναπτύχθηκε για το Project MAC του MIT (άσχετο με το Macintosh της Apple και με τον McCarthy), και είναι άμεσος απόγονος της LISP 1.5.  Έτρεχε σε PDP-10 και Multics συστήματα.
 InterLisp  – αναπτύχθηκε στο BBN για συστήματα PDP-10 με το Tenex λειτουργικό σύστημα, και αργότερα υιοθετήθηκε ως Lisp της "δυτικής ακτής" για μηχανές Xerox Lisp. Μια μικρή έκδοση με το όνομα "InterLISP 65" δημοσιεύθηκε με τη γραμμή υπολογιστών της Atari που βασιζόταν στο 6502.  Για αρκετό καιρό η MacLisp και η InterLisp ήταν ανταγωνιστές.
 Franz Lisp – αρχικά μια απόπειρα του Πανεπιστημίου της Καλιφόρνιας, Μπέρκλεϊ, αργότερα αναπτύχθηκε από τη Franz Inc.  Το όνομα αποτελεί χιουμοριστικό λογοπαίγνιο του 'Φραντς Λιστ'.
 ZetaLisp – χρησιμοποιήθηκε στα Lisp machine, άμεσος απόγονος της MacLisp.
 EuLisp – απόπειρα να αναπτυχθεί μια νέα, αποδοτική και "καθαρή" Lisp.
 ISLisp – απόπειρα να αναπτυχθεί μια νέα, αποδοτική και "καθαρή" Lisp.  Καθορίστηκε σαν πρότυπο.
 IEEE Scheme – IEEE standard, 1178-1990 (R1995)
 ANSI Common Lisp – ως επί το πλείστον μια καθαρή έκδοση της ZetaLisp που εμπεριείχε το CLOS.

Lisp και Τεχνητή Νοημοσύνη 
Από την δημιουργία της, η Lisp συνδεόταν στενά με την ερευνητική κοινότητα της τεχνητής νοημοσύνης, ειδικά στα συστήματα PDP-10.  Η Lisp χρησιμοποιήθηκε ως η υλοποίηση της γλώσσας Micro Planner που έθεσε τα θεμέλια για το διάσημο σύστημα τεχνητής νοημοσύνης SHRDLU.  Τη δεκαετία 1970, ενώ η έρευνα στην τεχνητή νοημοσύνη δημιουργούσε εμπορικές εταιρείες, η απόδοση των υπαρχόντων συστημάτων Lisp έγινε σημαντικό ζήτημα.

Η Lisp ήταν δύσκολο σύστημα στο να υλοποιηθεί με τις τεχνικές μεταγλώττισης και το υλικό της δεκαετίας του 1970.  Οι ρουτίνες συλλογής απορριμάτων που αναπτύχθηκαν από τον τότε μεταπτυχιακό φοιτητή του MIT, Daniel Edwards, έκαναν πρακτική την εκτέλεση της Lisp σε υπολογιστικά συστήματα γενικής χρήσης, αν και η απόδοση ήταν ακόμα προβληματική.  Αυτό οδήγησε στην δημιουργία των μηχανών Lisp: ειδικό υλικό για την εκτέλεση περιβάλλοντος και προγραμμάτων Lisp.  Σύντομα οι εξελίξεις τόσο στον τομέα του υλικού υπολογιστών όσο και στην τεχνολογία μεταγλώττισης έκαναν τις μηχανές Lisp ξεπερασμένες, πράγμα επιζήμιο για την αγορά της Lisp.

Κατά τις δεκαετίες 1980 και 1990 έγινε μεγάλη προσπάθεια να ενοποιηθούν οι πολυάριθμες διάλεκτοι Lisp (κυρίως οι InterLisp, Maclisp, ZetaLisp και Franz Lisp) σε μία και μόνη γλώσσα.  Η νέα αυτή γλώσσα, η Common Lisp, ήταν ουσιαστικά ένα συμβατό υποσύνολο των διαλέκτων που αντικατέστησε. Το 1994, η ANSI δημοσίευσε το πρότυπο της Common Lisp, "ANSI X3.226-1994 Information Technology Programming Language Common Lisp." Εκείνη την περίοδο η παγκόσμια αγορά για τη Lisp ήταν πολύ μικρότερη από ότι είναι σήμερα.

Η Lisp σήμερα 

Έχοντας παρακμάσει στη δεκαετία 1990, η Lisp συναντά αναζωογόνηση του ενδιαφέροντος από το 2000.  Το μεγαλύτερο κομμάτι της νέας δραστηριότητας συγκεντρώνεται γύρω από υλοποιήσεις της Common Lisp από το Ανοικτό λογισμικό, και συμπεριλαμβάνει την ανάπτυξη νέων φορητών βιβλιοθηκών και εφαρμογών.

Πολλοί νέοι προγραμματιστές Lisp έχουν πεισθεί από συγγραφείς όπως ο Paul Graham και ο Eric S. Raymond να ασχοληθούν με μια γλώσσα που άλλοι θεωρούν απαρχαιωμένη.  Οι νέοι αυτοί προγραμματιστές Lisp συχνά περιγράφουν τη γλώσσα ως διαφωτιστική εμπειρία και ισχυρίζονται ότι είναι αρκετά πιο παραγωγικοί από ότι σε άλλες γλώσσες.  Ο Graham αναπτύσσει μια νέα διάλεκτο Lisp που λέγεται Arc.

Το Practical Common Lisp του Peter Seibel, ένα εκπαιδευτικό βιβλίο που δημοσιεύτηκε το 2004, ήταν για λίγο το δεύτερο δημοφιλέστερο βιβλίο προγραμματισμού στο amazon.com.

Κύριες σύγχρονοι διάλεκτοι 

Οι δύο κύριες διάλεκτοι της Lisp που χρησιμοποιούνται σήμερα για γενικής χρήσης προγραμματισμό είναι η Common Lisp και η Scheme. Αυτές οι γλώσσες αντιπροσωπεύουν σημαντικά διαφορετικές επιλογές στο σχεδιασμό.

Η Common Lisp, προερχόμενη κυρίως από τις MacLisp, Interlisp και Lisp Machine Lisp, είναι ένα εκτεταμένο υπερσύνολο παλιότερων διαλέκτων Lisp, με ένα ογκώδες πρότυπο γλώσσας που περιλαμβάνει πολλούς ενσωματωμένους τύπους δεδομένων και συντακτικές μορφές, καθώς και ένα σύστημα αντικειμένων.  Η Scheme έχει ένα μινιμαλιστικότερο σχεδιασμό, με πολύ μικρότερο σύνολο λειτουργιών αλλά με κάποια επιπλέον στοιχεία υλοποίησης, όπως η βελτίωση της αναδρομής ουράς και η πλήρης υποστήριξης συνεχειών (continuations), που δεν υπάρχουν στην Common Lisp.  Επίσης, η Common Lisp έχει δανειστεί κάποια στοιχεία από τη Scheme, όπως lexical scoping και lexical closures.

Επιπλέον, οι διάλεκτοι Lisp χρησιμοποιούνται ως scripting γλώσσες σε αρκετές εφαρμογές, η πιο γνωστή εκ των οποίων είναι η Emacs Lisp στο διορθωτή κειμένου Emacs και η Autolisp στο AutoCAD.

Γλωσσικές Καινοτομίες 
Η Lisp ήταν η πρώτη ομοεικονική γλώσσα προγραμματισμού: η βασική αναπαράσταση του κώδικα ενός προγράμματος έχει τον ίδιο τύπο λίστας που επίσης χρησιμοποιείται για τις κύριες δομές δεδομένων της γλώσσας.  Ως αποτέλεσμα, οι συναρτήσεις της Lisp μπορούν να επεξεργαστούν, να  μεταβληθούν, ακόμα και να δημιουργηθούν μέσα από ένα Lisp πρόγραμμα χωρίς ιδιαίτερη λεξική ανάλυση ή χρήση δυαδικού κώδικα μηχανής.  Αυτό γενικά θεωρείται ένα από τα βασικά πλεονεκτήματα της γλώσσας, όσον αφορά την εκφραστικότητα, και κάνει τη γλώσσα επιδεκτική σε μετακυκλικό υπολογισμό.

Η πολύ διαδεδομένη δομή του if-then-else, που τώρα θεωρούμε δεδομένο, προφανές και απαραίτητο στοιχείο κάθε γλώσσας προγραμματισμού, εφευρέθηκε από τον McCarthy για χρήση στη Lisp.  Εκεί εμφανίστηκε πρώτη φορά σε πιο γενική μορφή (η δομή cond).  Κληρονομήθηκε από την ALGOL από την οποία και έγινε δημοφιλής.

Η Lisp επηρέασε πολύ τον Alan Kay, τον αρχηγό της έρευνας πάνω στη Smalltalk ενώ στη συνέχεια και η Lisp επηρεάστηκε από τη Smalltalk, υιοθετώντας στοιχεία αντικειμενοστρεφούς προγραμματισμού (κλάσεις, εμφανίσεις, κλπ) στο τέλος της δεκαετίας 1970.

Κυρίως λόγω των απαιτήσεων της σε πόρους, όσον αφορά το υλικό (συμπεριλαμβανομένου των πρώτων μικροεπεξεργαστών,) η Lisp δεν έγινε τόσο δημοφιλής έξω από την κοινότητα της τεχνητής νοημοσύνης όσο η Fortran και η C, η οποία προήλθε από την Algol.  Νεότερες γλώσσες όπως η Java και η Python έχουν ενσωματώσει περιορισμένες εκδόσεις κάποιων στοιχείων της Lisp, αλλά αδυνατούν να δείξουν τη συνέπεια και σύμπραξη που βρίσκεται στις έννοιες της Lisp.  Λόγω του ότι ενδείκνυται για εφαρμογές κακο-διατυπωμένες, περίπλοκες και δυναμικές, η Lisp έχει αρχίσει ξανά να απολαμβάνει αυξημένη δημοτικότητα.

Δες επίσης "The evolution of Lisp", ένα άρθρο από τους Guy L. Steele, Jr. και Richard P. Gabriel.

Παραπομπές

Δείτε επίσης 
 Clojure
 Scheme

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

 Η γλώσσα LISP
 Συναρτησιακός προγραμματισμός και η γλώσσα Lisp 
 

Γλώσσες με δυναμικούς τύπους
Δυναμικές γλώσσες προγραμματισμού
Lisp