Perché studiare un interprete lisp in lisp è così importante?

28

Ho visto molti curricula CS e suggerimenti di apprendimento per i nuovi programmatori che richiedono all'aspirante programmatore di studiare un interprete Lisp specificamente scritto in lisp. Tutti questi siti dicono cose simili a "è una rivelazione intellettuale", "è un'esperienza di illuminazione che ogni programmatore serio dovrebbe avere" o "mostra le relazioni hardware / software" e altre affermazioni vaghe, in particolare da questo articolo tratto da questa procedura affidabile .

Il sentimento generale della mia domanda è, in che modo il lisp raggiunge gli obiettivi sopra indicati e perché il lisp? Perché non qualche altra lingua?

Te lo chiedo perché ho appena finito di scrivere un interprete di schemi in schema (tratto da SIC link ) e ora sono scrivendo un interprete python in schema e sto lottando per avere questa leggendaria epifania che dovrebbe venire specificatamente dal primo. Sto cercando dettagli tecnici specifici tra le due lingue che posso sfruttare nei loro programmi di interpretazione per capire come funzionano i programmi.

Più in particolare:

Why is the study of an interpreter that is written in the language it interprets so emphasized - is it merely a great mental exercise to keep the original language and built language straight or are there specific problems whose solutions can only be found in the nature of the original language?

How do lisp interpreters demonstrate good architecture concepts for one's future software design?

What would I miss if I did this exercise in a different language like C++ or Java?

What is the most used takeaway or "mental tool" from this exercise? **

** Ho selezionato la risposta che ho fatto perché ho ho notato che ho acquisito da questo esercizio più abilità nel progettare strumenti di analisi nella mia testa rispetto a qualsiasi altro strumento singolo e mi piacerebbe trovare diversi metodi di analisi che potrebbero funzionare meglio per l'interprete dello schema rispetto all'interprete python.

    
posta Ma-at 30.04.2014 - 18:18
fonte

5 risposte

17

A rischio di dare una risposta "anch'io", se la provi vedrai ...

Se studi lingue informatiche, è probabile che tu abbia l'impressione che sia almeno la metà sull'analisi. Se impari Lisp, ti rendi conto che analizzare la sintassi della superficie non è altro che una comodità per le persone (come la maggior parte di noi) a cui non piacciono un sacco di irritanti parentesi singole.

Quindi ti rendi conto che per tale comodità è stato pagato un grosso prezzo. In Lisp è banale che un programma costruisca un altro programma e lo esegua. In altre lingue è una tecnica avanzata, come fare moltiplicazioni in numeri romani.

Naturalmente, quasi tutti chiedono "chi ha bisogno di farlo?" Bene, puoi benissimo vedere che si apre un intero panorama di cose che non ti sei mai reso conto di non poter fare prima. Puoi farlo in altre lingue, ma non così facilmente.

INSERITO per rispondere al commento Izkata:

  • Il programma SHRDLU di comprensione della lingua naturale ha funzionato traducendo una frase o una domanda in inglese in un programma in un dialetto Lisp chiamato MICRO-PLANNER e eseguendolo.
  • I programmi che manipolano i programmi, ad esempio per semplificarli o dimostrarli corretti, sono naturalmente scritti in Lisp.
  • Ho usato la generazione di programmi in un programma per comprendere scene visive, dove doveva gestire tutte le simmetrie capaci di oggetti tridimensionali, senza moltiplicare il codice.
  • Qualunque cosa abbia a che fare con accordi di logica e di dimostrazione del teorema nella manipolazione di espressioni logiche, che sono una forma di programma.
  • La matematica simbolica, come il calcolo simbolico integrale o differenziale, implica la manipolazione di espressioni matematiche, che sono come programmi in miniatura.
  • Qualsiasi problema riguardante la generazione di codice, o il termine più importante "valutazione parziale", è naturale in Lisp. L'ho fatto per un programma di bridge di database molto tempo fa. L'ho fatto in C, che non era facile come Lisp, ma ho avuto l'idea da Lisp. Questa era considerata una tecnica che quasi nessuno poteva fare in quel momento (specialmente le teste di COBOL). Forse più ora, spero.

... sono solo alcuni ...

Poi ti rendi conto che alcune cose che sono considerate "moderne" oggi sono state vecchie di casa in Lisp per 40 anni. Come la programmazione funzionale. Come la raccolta dei rifiuti. Come le chiusure.

Questo non vuol dire che le lingue moderne non hanno nuove buone idee, come OOP, ecc. Ma se impari Lisp, amplierai la tua prospettiva.

    
risposta data 30.04.2014 - 20:46
fonte
19

La semplice risposta alla tua domanda è provare Lisp, preferibilmente in combinazione con SICP . Allora sarai illuminato.

Detto questo ...

Il codice è dati
La maggior parte delle lingue fa una netta distinzione tra codice e dati; Lisp no. Ciò rende possibile, ad esempio, scrivere banalmente un parser Lisp in Lisp e manipolare il codice Lisp all'interno di Lisp. La migliore descrizione di questa illuminazione che ho trovato è The Nature of Lisp .

Questo è vero in parte perché la sintassi per la lingua è così semplice. Rende possibili cose in Lisp (come la metaprogrammazione) che sono poco pratiche in altre lingue perché la sintassi si intromette.

Ulteriori letture
Superare le medie

    
risposta data 30.04.2014 - 18:39
fonte
9

Why is the study of an interpreter that is written in the language it interprets so emphasized?

In generale, lo studio di un interprete ti dà un'idea del suo linguaggio e delle sue caratteristiche. In generale, studiare il codice in un linguaggio di programmazione è come praticare una lingua parlata ascoltando e leggendo: ti familiarizza con ciò che quella lingua può fare, come è usata e comuni "idiomi". Più specificamente, Lisp è un linguaggio omoiconico, che significa che la sua sintassi per le espressioni è la stessa della sua sintassi per i dati. La scrittura del codice in Lisp sembra terribilmente come se si stesse scrivendo una lista e viceversa. Quindi, interpretare il codice Lisp con il codice Lisp è semplice come eseguire gli elenchi con car e cdr .

How should I capitalize on this exercise to get the most out of it conceptually?

Pensa a come l'interprete interpreterà se stesso - in molte implementazioni di interprete meta-circolare (dove un linguaggio omoiconico interpreta se stesso) può semplicemente "passare attraverso" la funzione. Ad esempio, per implementare car , prendi semplicemente car dell'argomento. Ciò distoglie l'accento dai meccanismi di archiviazione dei dati e si concentra sulla funzionalità.

How do lisp interpreters demonstrate good architecture concepts for one's future software design?

Gli interpreti possono essere molto complicati, il che incoraggia una buona architettura nel progettarli. Con questo in mente, questo è più dipendente dall'interprete individuale.

What would I miss if I did this exercise in a different language like C++ or Java?

Queste lingue non sono omoiconiche, quindi non beneficiano della grazia e della semplicità di un interprete Lisp meta-circolare. Ciò rende l'esercizio più difficile, e forse meno comune, ma non direi che sia davvero meno vantaggioso.

What is the most used takeaway or "mental tool" from this exercise?

Non sono sicuro di avere una buona risposta per questo; semplicemente che aiuta a vedere come funziona l'interprete e, forse ancora più importante, ad armeggiare con esso per vedere come piccole modifiche al linguaggio possono essere facilmente implementate.

    
risposta data 30.04.2014 - 18:48
fonte
5

LISP è esso stesso strutturato in un modo che lo rende estremamente facile da analizzare. Se provi a scrivere un compilatore, noterai che è molto più semplice se tutto nella tua lingua è un'espressione e ha un basso livello di ambiguità. LISP forza le parentesi ovunque per eliminare l'ambiguità e non ha istruzioni, solo espressioni.

Il fatto stesso che LISP sia molto semplice da analizzare incoraggia gli utenti ad analizzare il proprio codice sorgente e a fare trucchi magici con esso. La linea tra dati e codice diventa sfocata e puoi facilmente fare cose che normalmente richiedono un certo sforzo, come la riflessione, la riscrittura dinamica dei codici, i plug-in e la serializzazione.

Questo è il succo di ciò. L'esercitazione è probabilmente pensata per darti un'idea di ciò che è possibile quando il codice è facilmente parabolabile da solo.

    
risposta data 30.04.2014 - 18:36
fonte
3

Non sono sicuro che sia davvero importante per tutti. Puoi essere uno sviluppatore di successo senza sapere come funziona un interprete Lisp. Tuttavia, studiando Informatica, le idee di base del Lisp dovrebbero essere apprese.

Gli interpreti Lisp sono importanti per i programmatori Lisp. Devono capire come un interprete ([e il compilatore] 1 ) funziona, per comprendere appieno come usare la lingua.

Un interprete Lisp è spesso usato come strumento nell'informatica per insegnare agli studenti alcune cose:

Come dispositivo didattico, un interprete Lisp è utile, perché può essere appreso e compreso in breve tempo. Dato che pochi studenti conoscono già il Lisp, gli studenti sono in un campo di livello quando si tratta di imparare sopra i concetti.

    
risposta data 03.05.2014 - 18:14
fonte