Τι έκανε τον Lisp ξεχωριστό

«Η μεγαλύτερη γλώσσα προγραμματισμού που δημιουργήθηκε ποτέ«
— Άλαν Κέι, "on Lisp"

Τι έκανε τον Lisp ξεχωριστό

Όταν ο McCarthy ανέπτυξε τη Lisp στα τέλη της δεκαετίας του 1950, ήταν ριζικά διαφορετική από τις υπάρχουσες γλώσσες, η πιο σημαντική από τις οποίες ήταν Fortran.

Ο Lisp παρουσίασε εννέα νέες ιδέες:

1. Υποθετικοί. Οι δηλώσεις υπό όρους είναι κατασκευές εάν-τότε-άλλο. Τώρα τα θεωρούμε δεδομένα. Ήταν εφευρέθηκε McCarthy κατά την ανάπτυξη του Lisp. (Το Fortran εκείνη την εποχή είχε μόνο δηλώσεις goto, στενά συνδεδεμένες με μια οδηγία κλάδου για το υποκείμενο υλικό.) Ο McCarthy, ενώ ήταν στην επιτροπή Algol, συνεισέφερε υπό όρους στο Algol, από όπου εξαπλώθηκαν σε άλλες γλώσσες.

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

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

4. Μια νέα έννοια των μεταβλητών. Στο Lisp, όλες οι μεταβλητές είναι αποτελεσματικοί δείκτες. Οι τιμές είναι αυτό που έχουν οι τύποι, όχι οι μεταβλητές, και η εκχώρηση ή η δέσμευση μεταβλητών σημαίνει αντιγραφή δεικτών, όχι αυτό που δείχνουν.

5. Συλλογή απορριμάτων.

6. Προγράμματα που αποτελούνται από εκφράσεις. Τα προγράμματα Lisp είναι δέντρα παραστάσεων, καθεμία από τις οποίες επιστρέφει μια τιμή. (Ορισμένες εκφράσεις Lisp μπορούν να επιστρέψουν πολλαπλές τιμές.) Αυτό έρχεται σε αντίθεση με το Fortran και πολλές άλλες επιτυχημένες γλώσσες που κάνουν διάκριση μεταξύ "εκφράσεων" και "δηλώσεων".

Ήταν φυσικό να υπάρχει αυτή η διάκριση στο Fortran επειδή η γλώσσα ήταν προσανατολισμένη στη γραμμή (δεν προκαλεί έκπληξη για μια γλώσσα της οποίας η μορφή εισόδου ήταν μια διάτρητη κάρτα). Δεν θα μπορούσατε να έχετε ένθετες δηλώσεις. Και όσο χρειαζόσασταν μαθηματικές εκφράσεις για να δουλέψετε, δεν υπήρχε νόημα να έχετε κάτι άλλο να επιστρέφει μια τιμή γιατί μπορεί να μην υπάρχει τίποτα που να περιμένει να επιστραφεί.

Οι περιορισμοί άρθηκαν με την εμφάνιση γλωσσών με δομή μπλοκ, αλλά τότε ήταν πολύ αργά. Η διάκριση μεταξύ εκφράσεων και δηλώσεων έχει ήδη καθιερωθεί. Πέρασε από το Fortran στο Algol και πιο πέρα ​​στους απογόνους τους.

Όταν μια γλώσσα αποτελείται εξ ολοκλήρου από εκφράσεις, μπορείτε να συνθέσετε εκφράσεις με όποιον τρόπο θέλετε. Μπορείτε να γράψετε είτε (χρησιμοποιώντας τη σύνταξη Τόξο)

(if foo (= x 1) (= x 2))

ή

(= x (if foo 1 2))

7. Τύπος συμβόλου. Οι χαρακτήρες είναι διαφορετικοί από τις συμβολοσειρές, οπότε μπορείτε να ελέγξετε για ισότητα συγκρίνοντας δείκτες.

8. Σημείωση για τον κώδικα χρησιμοποιώντας δέντρα συμβόλων.

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

Η εκτέλεση κώδικα κατά την ανάγνωση επιτρέπει στους χρήστες να επαναπρογραμματίσουν τη σύνταξη του Lisp. Ο κώδικας που τρέχει τη στιγμή της μεταγλώττισης είναι η βάση για τις μακροεντολές. Η μεταγλώττιση χρόνου εκτέλεσης είναι η βάση για τη χρήση της Lisp ως γλώσσας επέκτασης σε προγράμματα όπως το Emacs. και τέλος, η ανάγνωση χρόνου εκτέλεσης επιτρέπει στα προγράμματα να επικοινωνούν χρησιμοποιώντας s-expressions, μια ιδέα που επινοήθηκε εκ νέου πρόσφατα στην XML.

Συμπέρασμα

Όταν πρωτοεφευρέθηκε το Lisp, αυτές οι ιδέες απείχαν πολύ από τις συμβατικές πρακτικές προγραμματισμού που υπαγορεύονταν από το υλικό που ήταν διαθέσιμο στα τέλη της δεκαετίας του 1950.

Με τον καιρό, η προεπιλεγμένη γλώσσα, που ενσωματώθηκε από την επιτυχία των δημοφιλών γλωσσών, σταδιακά εξελίχθηκε προς τη Lisp. Τα σημεία 1-5 είναι πλέον ευρέως αποδεκτά. Το σημείο 6 αρχίζει να εμφανίζεται στο mainstream. Στην Python, υπάρχει μια ρήτρα 7 σε κάποια μορφή, αν και δεν υπάρχει κατάλληλη σύνταξη. Το στοιχείο 8, το οποίο (με το στοιχείο 9) καθιστά δυνατές τις μακροεντολές στο Lisp, εξακολουθεί να είναι μόνο στο Lisp, πιθανώς επειδή (α) απαιτεί αυτές τις παρενθέσεις ή κάτι εξίσου κακό, και (β) εάν προσθέσετε αυτήν την τελευταία αύξηση ισχύος, μπορείτε δεν ισχυρίζονται πλέον ότι έχουν εφεύρει μια νέα γλώσσα, αλλά μόνο ότι έχουν αναπτύξει μια νέα διάλεκτο του Lisp. -)

Αν και αυτό είναι χρήσιμο για τους σύγχρονους προγραμματιστές, είναι περίεργο να περιγράψουμε το Lisp ως προς τη διαφορά του από τις τυχαίες τεχνικές που υιοθετούνται σε άλλες γλώσσες. Μπορεί να μην ήταν αυτό που σκεφτόταν ο ΜακΚάρθι. Το Lisp δεν σχεδιάστηκε για να διορθώνει τα λάθη του Fortran. εμφανίστηκε περισσότερο ως υποπροϊόν της προσπάθειας αξιωματοποίηση υπολογισμών.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο