Cosa ha reso Lisp speciale

«Il più grande linguaggio di programmazione mai creato«
— Alan Kay, "sul Lisp"

Cosa ha reso Lisp speciale

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

Lisp ha introdotto nove nuove idee:

1. Condizionali. Le istruzioni condizionali sono costruzioni if-then-else. Adesso li diamo per scontati. Li avevamo inventato McCarthy durante lo sviluppo del Lisp. (Fortran all'epoca aveva solo istruzioni goto, strettamente accoppiate a un'istruzione di ramo sull'hardware sottostante.) McCarthy, mentre faceva parte del comitato Algol, contribuì ai condizionali ad Algol, da dove si diffusero in altre lingue.

2. Un tipo di funzione. In Lisp, le funzioni sono oggetti di prima classe: sono un tipo di dati, proprio come numeri, stringhe, ecc., e hanno una rappresentazione letterale, possono essere memorizzate in variabili, possono essere passate come argomenti, ecc.

3. Ricorsione. La ricorsione, ovviamente, esisteva come concetto matematico prima del Lisp, ma il Lisp fu il primo linguaggio di programmazione a supportarlo. (Ciò è forse implicito nella creazione di funzioni come oggetti di prima classe.)

4. Un nuovo concetto di variabili. In Lisp, tutte le variabili sono puntatori efficaci. I valori sono ciò che i tipi hanno, non le variabili, e assegnare o associare variabili significa copiare i puntatori, non ciò a cui puntano.

5. Raccolta dei rifiuti.

6. Programmi composti da espressioni. I programmi Lisp sono alberi di espressioni, ognuno dei quali restituisce un valore. (Alcune espressioni Lisp possono restituire più valori.) Ciò contrasta con Fortran e molti altri linguaggi di successo che distinguono tra "espressioni" e "dichiarazioni".

Era naturale avere questa distinzione in Fortran perché il linguaggio era orientato alla linea (non sorprendente per un linguaggio il cui formato di input era una scheda perforata). Non avresti potuto annidare le istruzioni. E finché avevi bisogno che le espressioni matematiche funzionassero, non aveva senso che qualcos'altro restituisse un valore perché potrebbe non esserci nulla in attesa di essere restituito.

Le restrizioni furono rimosse con l’avvento dei linguaggi strutturati a blocchi, ma ormai era troppo tardi. La distinzione tra espressioni e proposizioni è già stata stabilita. Passò da Fortran ad Algol e successivamente ai loro discendenti.

Quando una lingua è fatta interamente di espressioni, puoi comporre le espressioni nel modo che preferisci. Puoi scrivere sia (usando la sintassi Arco)

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

o

(= x (if foo 1 2))

7. Un tipo di simbolo. I caratteri sono diversi dalle stringhe, nel qual caso è possibile verificare l'uguaglianza confrontando i puntatori.

8. Una notazione per il codice utilizzando alberi di simboli.

9. L'intera lingua è sempre disponibile. Non esiste alcuna differenza evidente tra tempo di lettura, tempo di compilazione e tempo di esecuzione. È possibile compilare o eseguire codice durante la lettura oppure leggere o eseguire codice durante la compilazione oppure leggere o compilare codice durante l'esecuzione.

L'esecuzione del codice durante la lettura consente agli utenti di riprogrammare la sintassi di Lisp; l'esecuzione del codice in fase di compilazione è la base per le macro; la compilazione runtime è la base per utilizzare Lisp come linguaggio di estensione in programmi come Emacs; infine, la lettura runtime consente ai programmi di comunicare utilizzando le espressioni s, un'idea recentemente reinventata in XML.

conclusione

Quando Lisp fu inventato per la prima volta, queste idee erano ben lontane dalle pratiche di programmazione convenzionali dettate dall’hardware disponibile alla fine degli anni ’1950.

Nel corso del tempo, la lingua predefinita, incarnata dal successo dei linguaggi popolari, si è gradualmente evoluta verso il Lisp. I punti 1-5 sono ormai ampiamente accettati. Il punto 6 sta iniziando ad apparire nel mainstream. In Python esiste una clausola 7 in qualche forma, sebbene non esista una sintassi adatta. L'elemento 8, che (insieme all'elemento 9) rende possibili le macro in Lisp, è ancora solo in Lisp, probabilmente perché (a) richiede quelle parentesi o qualcosa di altrettanto negativo, e (b) se aggiungi quest'ultimo aumento di potenza, puoi non pretendono più di aver inventato una nuova lingua, ma solo di aver sviluppato un nuovo dialetto del Lisp; -)

Sebbene ciò sia utile per i programmatori moderni, è strano descrivere il Lisp in termini di differenza rispetto alle tecniche casuali adottate in altri linguaggi. Questo potrebbe non essere ciò che McCarthy stava pensando. Lisp non è stato progettato per correggere gli errori di Fortran; appariva più come un sottoprodotto del tentativo assiomatizzare i calcoli.

Fonte: habr.com

Aggiungi un commento