Riguardo agli interpreti

-1

Capisco che un interprete potrebbe fare una delle seguenti cose (e probabilmente più):

  1. Esegui direttamente il codice sorgente della lingua di programmazione.

  2. Prima converti il codice sorgente in un codice intermedio (che è meno leggibile dall'uomo e più efficiente o più semplice da eseguire per l'interprete), quindi esegui questo codice.

Le mie domande sono:

  1. Questa ipotesi è vera? Sto capendo correttamente la funzione generale di un interprete? O è qualcosa che ho scritto male?

  2. Se le mie supposizioni sono vere, quale di queste due possibili funzioni è più comune? Si prega di mostrare esempi.

posta Aviv Cohn 07.03.2014 - 11:02
fonte

2 risposte

5

Un interprete è generalmente inteso per eseguire un programma senza compilare il programma in una fase separata. Tuttavia, la maggior parte degli interpreti moderni non interpreta direttamente il codice sorgente - questo non è comunque possibile per qualcosa di più complesso di BASIC. Invece, prima analizzano il codice, quindi producono una rappresentazione intermedia e infine eseguono questa rappresentazione.

Le rappresentazioni intermedie comuni sono:

  • bytecode , che è un cugino di alto livello del codice macchina. Vengono eseguiti su una macchina virtuale che utilizza questo bytecode. Il bytecode non è generalmente leggibile dall'uomo, sebbene possa esistere una serializzazione leggibile dall'uomo (ad es. Assemblatore Jasmin per bytecode JVM).

    Un'implementazione del linguaggio può scegliere un bytecode perché è essenzialmente simile alla maggior parte delle architetture esistenti, anche se più limitate, e quindi più sicuro. È anche molto semplice memorizzare bytecode in un file o scambiarlo altrimenti. La maggior parte delle macchine virtuali esegue bytecode (iniziando dal codice P originale, da CPython alla JVM).

  • altri codici operativi , ad es. strutture dati in memoria come AST. Questi a volte non hanno serializzazione permanente.

    Un'implementazione linguistica può scegliere di rappresentare il codice come una struttura dati perché è molto più flessibile (proprio come Lisp è più flessibile di C), e perché rimuove la necessità di decodificare bytecode all'interno della VM - rendendolo più semplice implementare. Questo percorso è molto utile per progetti semplici, ma è anche usato in alcuni interpreti seri come perl .

In pratica, il confine tra compilatori e interpreti è stato sfocato al di là del riconoscimento, e la maggior parte degli interpreti potrebbe anche essere considerata compilatore perché compilano una rappresentazione intermedia (anche se non è memorizzata da nessuna parte). Le due utili caratteristiche distintive sono:

  • quando la fonte è compilata - prima del tempo, o prima di ogni esecuzione
  • qual è il obiettivo di compilazione - codice macchina, una rappresentazione intermedia eseguita da una VM

Alcune implementazioni come le implementazioni Java primarie sfidano categorizzazioni troppo semplici: qui il codice viene compilato in anticipo su un bytecode che viene interpretato su una VM che può anche eseguire la compilazione JIT su codice macchina.

    
risposta data 07.03.2014 - 11:51
fonte
1

Is this assumption true? Am I understanding correctly the general function of an interpreter? Or is something I wrote wrong?

È vero, in teoria. Ma un interprete pratico farà almeno un po 'di lavoro per tradurre il codice sorgente in un codice intermedio di qualche tipo.

If my assumptions are true, which one of these two possible functions are more common? Please show examples.

Il secondo. In effetti, non sono a conoscenza di esempi di vita reale che direttamente eseguano il codice sorgente ... anche se alcuni interpreti BASIC primitivi potrebbero aver lavorato in questo modo.

Naturalmente, il codice intermedio potrebbe assumere una varietà di forme. Il codice assume la forma di istruzioni per una macchina (immaginaria); per esempio. Bytecode Java, Pascal PCODE, Microsoft CLR e così via. Oppure potrebbe assumere la forma di un albero sintattico astratto ... con decorazioni.

    
risposta data 07.03.2014 - 12:56
fonte

Leggi altre domande sui tag