Come funziona un interprete? [chiuso]

4

Ho cercato un sacco di siti web per capire come funziona un interprete, ma non ho trovato nessuno di questi aspetti che spieghi come Interpreter lavori internamente. Ma ho trovato in molti posti come il compilatore funziona con tutti i passaggi e le descrizioni.

Quindi la mia domanda è: come funziona un interprete?

    
posta Susantha7 24.06.2016 - 07:00
fonte

3 risposte

10

La tua domanda è troppo ampia per essere risolta in alcuni paragrafi. E in realtà gli interpreti non significano molto: l'interprete BASIC del ZX80 (nel 1980) è molto diverso dall'attuale Guile , Lua , Ruby , o Python interpreti sulla maggior parte dei sistemi Linux. Conoscendo diversi linguaggi di programmazione, ad es. leggendo la programmazione Pragmatica della lingua di Scott, vale la pena.

Lisp come lingue come Schema (& Common Lisp) sono omoiconico , ed è molto facile scrivere un piccolo interprete Lisp in Lisp. Il famoso libro SICP (introduzione gratuita alla programmazione, usando Scheme) ha il suo chapter 4 dedicato a tale valutatore meta-circolare .

Interpreters condividi con compilatori diverse funzionalità e attività; la maggior parte di questi sono analizzando il codice in alcuni abstract syntax tree (AST) come fa un compilatore. Questa è in realtà la parte più facile. Quindi un libro di testo su compilatori come l'ultima edizione del Libro del Drago è molto importante per gli interpreti .

(AFAIK, BASIC degli anni '80 non costruiva alcun AST ma analizzava ripetutamente ogni riga, questo è il motivo per cui il BASIC di ZX80 non è come gli attuali interpreti, ma potrei sbagliarmi, dato che questi vecchi interpreti sono software proprietario

Alcuni interpreti stanno valutando l'AST in qualche ambiente attraverso una funzione ricorsiva ingenua. Altri (e oggi, molti di loro), in realtà compileranno l'AST in una forma più efficiente, spesso una specie di bytecode (che viene interpretato in seguito da una veloce macchina virtuale , spesso in stack e con codice threadato ). Alcune implementazioni utilizzano addirittura le compilazione JIT per generare dinamicamente codice macchina (quindi, in realtà, la frontiera tra gli interpreti e il compilatore è piuttosto sfocato, si noti che SBCL sta convertendo in codice macchina ogni interazione del suo Leggi Eval Print Loop ; potresti percepirlo come un" compilatore "mascherato da" interprete "o viceversa).

Garbage collection è molto importante per gli interpreti. Puoi leggere il manuale del GC .

Un eccellente libro sull'interpretazione e la compilazione dei dialoghi Lisp è Lisp In Small Pieces a>. Spiega in dettaglio varie implementazioni di Lisp (da interpreti ingenui a compilatori sofisticati a codice C).

Troverai molti interpreti del software libero da studiare e diversi tutorial su come crearne uno, ad es. di Norvig (Come scrivere un interprete (Lisp) (in Python)) e molti altri.

Si noti che la progettazione e l'implementazione di un robusto, efficiente e amp; interprete user-friendly è un sacco di lavoro (si potrebbe passare diversi anni su questo). Se hai del software a cui vuoi aggiungere un interprete, considera invece embedding un interprete esistente come Guile o Lua (entrambi sono progettati per essere facilmente incorporabili).

    
risposta data 24.06.2016 - 09:12
fonte
2

Un interprete riceve un programma rappresentato come una struttura di dati, quindi passa attraverso ciascuna delle attività nella struttura dei dati ed esegue le attività nel modo in cui procede. La struttura dati può essere un albero sintattico astratto del codice che desideri interpretare, oppure può anche essere un codice byte se lo desideri.

Gli interpreti possono anche conservare una tabella (mappa hash) di nomi di variabili - > valori delle variabili attualmente in ambito. Ma non strettamente necessario.

Un interprete può essere pensato come una finta CPU che hai creato con il codice.

    
risposta data 24.06.2016 - 07:43
fonte
-4

Posso dirti che per esperienza personale, perché nella nostra scuola, abbiamo dovuto creare la nostra lingua, il proprio compilatore e il proprio interprete.

Suppongo che tu sappia, qual è il linguaggio e il compilatore, quindi lo salterò. Il compilatore creerà una struttura dal codice sorgente, che è eseguibile dall'interprete. Spetta a te, come appare la struttura e come viene eseguita dal compilatore.

Quello comune è "bytecode", dove non c'è differenza tra "dati" e "comandi" se non si conosce la sintassi, ma li si legge da "sinistra a destra" e la si esegue. L'interprete è ad esempio Java Virtual Machine - ottiene il .jar, che è eseguibile per quell'interpretazione e lo esegue.

Come può essere? Ad esempio, abbiamo definito che "1" è un comando da aggiungere e richiede un byte successivo e lo aggiunge allo stack. E "2" è per l'output senza richiedere alcun parametro.

1511132217

Se byte non è un parametro, è un comando. Il che significa

15 - one is command to take next param and add it, it adds 5 (consider uninitalized command to have 0 at stack)

11 - take one and add 1 = 6

13 - Add 3 = 9

2 - output 9

2 - output 9

17 - add 7 = 16
    
risposta data 24.06.2016 - 10:29
fonte

Leggi altre domande sui tag