Para código como A = A + B
, que puede compilar hasta una o dos instrucciones de máquina, cada una de las cuales toma un cierto número de ciclos. Ningún intérprete puede hacer lo mismo en ese número de ciclos por una simple razón.
El intérprete también ejecuta un conjunto de instrucciones propio (llámelos códigos de bytes, códigos p, lenguaje intermedio, lo que sea). Cada vez que ve un código de bytes como ADD, tiene que buscarlo de alguna manera y bifurcarse al código que hace la adición.
La próxima vez que lo vea, tiene que repetir esa búsqueda, a menos que tenga una forma de recordar la búsqueda anterior. Si tiene una manera de recordar la búsqueda previa, ya no es lo que llamamos un "intérprete", sino más bien un compilador justo a tiempo, o JITter.
Por otra parte...
Para códigos como callSomeFunction( ... some args ...)
, ¿cuántos ciclos se gastan entre ingresar ese código y abandonarlo? Todo depende de lo que ocurra adentro callSomeFunction
. Podría ser unos pocos, y podría ser billones, incluso si callSomeFunction
se compila en sí mismo. Si es mucho, no tiene sentido debatir el costo de interpretación de esa línea de código: el dinero está en otra parte.
Recuerde que los idiomas interpretados tienen un valor propio, como no es necesario compilarlos. (La "compilación" de la sintaxis de superficie a los códigos de bytes lleva un tiempo trivial. Tome R o MATLAB, por ejemplo).
Además, se necesita flexibilidad para niveles inteligentes de programación. En Minsky's Society of Mind , Capítulo 6.4 B -Brains, hay programas A que tratan con el mundo, y hay programas B que tratan con programas A, y puede haber más niveles. Los programas que escriben y administran otros programas se pueden hacer más fácilmente en sistemas interpretativos.
En Lisp, puede escribir (+ A B)
para agregar A y B, pero una vez que está escrito solo tiene la opción de ejecutarlo o no. También puede escribir (eval (list '+ 'A 'B))
qué construye el programa y luego lo ejecuta. Podría construir algo diferente.
El tema del programa es otro programa . Esto es más fácil de escribir en un lenguaje interpretado (aunque, como señala Jörg, las versiones más nuevas de Lisp, mientras que tienen eval
, compilan sobre la marcha, por lo que no tienen la penalización de velocidad de interpretación).