Per un codice simile A = A + B
, che può essere compilato in una o due istruzioni macchina, ognuna prendendo un certo numero di cicli. Nessun interprete può fare la stessa cosa in quel numero di cicli per un semplice motivo.
L'interprete esegue anche un proprio set di istruzioni (chiamali codici byte, codici p, linguaggio intermedio, qualunque cosa). Ogni volta che vede un codice byte come ADD, deve cercarlo in qualche modo e diramarsi al codice che fa l'aggiunta.
La prossima volta che lo vede, deve ripetere quella ricerca, a meno che non abbia un modo per ricordare la ricerca precedente. Se ha un modo per ricordare la ricerca precedente, non è più quello che chiamiamo un "interprete", ma piuttosto un compilatore just-in-time o JITter.
D'altro canto...
Per codice come callSomeFunction( ... some args ...)
, quanti cicli vengono trascorsi tra l'immissione di quel codice e la sua uscita? Tutto dipende da cosa succede dentro callSomeFunction
. Potrebbero essere pochi e potrebbero essere miliardi di miliardi, anche se callSomeFunction
è esso stesso compilato. Se è molto, non ha senso discutere il costo dell'interpretazione di quella riga di codice: il denaro è altrove.
Ricorda che le lingue interpretate hanno un valore proprio, come ad esempio, non è necessario compilarle. (La "compilazione" della sintassi di superficie in codici byte richiede un tempo insignificante. Prendi R o MATLAB, per esempio.)
Inoltre, è necessaria flessibilità per livelli di programmazione intelligenti. In Minsky's Society of Mind , capitolo 6.4 B -Brains, ci sono programmi A che si occupano del mondo, e ci sono programmi B che si occupano di programmi A, e possono esserci ulteriori livelli. I programmi che scrivono e gestiscono altri programmi possono essere eseguiti più facilmente nei sistemi interpretativi.
In Lisp, puoi scrivere (+ A B)
per aggiungere A e B, ma una volta scritto hai solo la possibilità di eseguirlo o meno. Puoi anche scrivere (eval (list '+ 'A 'B))
quale costruisce il programma e quindi lo esegue. Potrebbe costruire qualcosa di diverso.
L'argomento del programma è un altro programma . È più facile scrivere in un linguaggio interpretato (anche se, come sottolinea Jörg, le versioni più recenti di Lisp, mentre hanno eval
, compilano al volo, quindi non hanno la penalità di interpretazione).