Cosa ha reso Lisp speciale

«Il più grande dei linguaggi di programmazione mai creati«
— Alan Kay, «on Lisp»

Cosa ha reso Lisp speciale

Quando McCarthy sviluppò Lisp alla fine degli anni '50, era radicalmente diverso dai linguaggi esistenti, il più importante dei quali era Fortran.

Lisp ha incarnato nove nuove idee:

1. Dichiarazioni condizionali (Conditionals). Le dichiarazioni condizionali sono strutture if-then-else. Oggi le diamo per scontate. Furono inventate da McCarthy durante lo sviluppo di Lisp. (Il Fortran di quel tempo aveva solo dichiarazioni goto, strettamente collegate all'istruzione di branching a livello dell'hardware sottostante.) McCarthy, essendo nel comitato di Algol, introdusse le dichiarazioni condizionali in Algol, da dove si diffusero in altri linguaggi.

2. Tipi di funzione (A function type). In Lisp le funzioni sono oggetti di primo classe: sono un tipo di dato, proprio come i numeri, le stringhe, ecc., e hanno una rappresentazione letterale, possono essere memorizzate in variabili, possono essere passed as arguments, e così via.

3. Ricorsione (Recursion). La ricorsione esisteva già come concetto matematico prima di Lisp, ma Lisp è stato il primo linguaggio di programmazione a supportarla. (Questo è implicitamente suggerito dal fatto che le funzioni sono oggetti di primo classe.)

4. Nuova concezione delle variabili (A new concept of variables). In Lisp tutte le variabili sono puntatori efficaci. I valori appartengono ai tipi, non alle variabili; quindi l'assegnazione o il binding di variabili significa copiare puntatori, non ciò a cui puntano.

5. Garbage-collection.

6. Programmi composti da espressioni (Programs composed of expressions). I programmi in Lisp sono alberi di espressioni, ognuno dei quali restituisce un valore. (Alcune espressioni Lisp possono restituire più valori.) Questo contrasta con Fortran e con molti altri linguaggi di successo che distinguono tra «espressioni» e «affermazioni».

Era naturale avere tale distinzione in Fortran, perché il linguaggio era lineare (non sorprende per un linguaggio il cui formato di input era una scheda perforata). Non era possibile avere affermazioni nidificate. E mentre era necessario avere espressioni matematiche da manipolare, non aveva senso costringere qualcos'altro a restituire un valore, perché potrebbe non esserci nulla che si aspettava un ritorno.

Le restrizioni furono rimosse con l'emergere dei linguaggi a blocchi strutturati, ma a quel punto era già troppo tardi. La distinzione tra espressioni e affermazioni si era già consolidata. Essa è passata da Fortran ad Algol e oltre ai loro discendenti.

Quando un linguaggio è completamente composto da espressioni, puoi comporre le espressioni come preferisci. Puoi scrivere sia (utilizzando la sintassi Arc)

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

oppure

(= x (if foo 1 2))

7. Tipo simbolo (A symbol type). I simboli si differenziano dalle stringhe, in quanto puoi confrontarli per uguaglianza confrontando puntatori.

8. Notazione per il codice (A notation for code) utilizzando alberi di simboli.

9. L'intero linguaggio sempre disponibile (The whole language always available). Non c'è distinzione esplicita tra tempo di lettura, tempo di compilazione e tempo di esecuzione. Puoi compilare o eseguire il codice mentre lo leggi, oppure leggere o eseguire il codice mentre compili, o leggere o compilare codice durante l'esecuzione.

Eseguire codice durante la lettura consente agli utenti di riprogrammare la sintassi di Lisp; eseguire codice durante la compilazione è alla base delle macro; compilare durante l'esecuzione è alla base dell'uso di Lisp come linguaggio di estensione in programmi come Emacs; e infine, leggere durante l'esecuzione consente ai programmi di interagire utilizzando espressioni s, un’idea recentemente reinventata in XML.

Conclusione

Quando Lisp fu introdotto, tutte queste idee erano lontane dalle pratiche comuni di programmazione che erano dettate dall'hardware disponibile alla fine degli anni '50.

Nel corso del tempo, il linguaggio di default, incarnato nel successo di linguaggi popolari, ha evoluto gradualmente verso Lisp. Gli aspetti 1-5 sono ora ampiamente diffusi. Il punto 6 inizia a emergere nel mainstream. In Python esiste in qualche forma il punto 7, anche se non c'è una sintassi adatta. Il punto 8, che (con il punto 9) rende possibile le macro in Lisp, è ancora presente solo in Lisp, forse perché (a) richiede queste parentesi o qualcosa di altrettanto brutto, e (b) se aggiungi questo ultimo incremento di potenza, non puoi più affermare di aver inventato un nuovo linguaggio, ma solo di aver sviluppato un nuovo dialetto di Lisp; -)

Sebbene sia utile per i programmatori moderni, è strano descrivere Lisp in termini delle sue differenze rispetto a tecniche casuali adottate in altri linguaggi. Forse non è ciò a cui pensava McCarthy. Lisp non è stato progettato per correggere gli errori di Fortran; è emerso piuttosto come un sottoprodotto di un tentativo di assiomatizzare i calcoli.

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS | ProHoster