Para códigos como A = A + B
, que podem compilar até uma ou duas instruções da máquina, cada uma levando um certo número de ciclos. Nenhum intérprete pode fazer a mesma coisa nesse número de ciclos por um motivo simples.
O intérprete também executa um conjunto de instruções próprio (chame-os de códigos de bytes, códigos-p, idioma intermediário, o que for). Cada vez que vê um código de byte como ADD, ele precisa procurar de alguma forma e ramificar para o código que faz a adição.
Na próxima vez que o vir, ele precisará repetir essa pesquisa, a menos que tenha uma maneira de lembrar a pesquisa anterior. Se ele tem uma maneira de lembrar a pesquisa anterior, não é mais o que chamamos de "intérprete", mas sim um compilador just-in-time, ou JITter.
Por outro lado...
Para códigos como callSomeFunction( ... some args ...)
, quantos ciclos são gastos entre inserir esse código e deixá-lo? Tudo depende do que acontece lá dentro callSomeFunction
. Pode ser alguns e trilhões, mesmo que callSomeFunction
ele próprio seja compilado. Se é muito, não faz sentido debater o custo de interpretação dessa linha de código - o dinheiro está em outro lugar.
Lembre-se de que as línguas interpretadas têm um valor próprio, como, não há necessidade de compilá-las. (A "compilação" da sintaxe da superfície para códigos de bytes leva um tempo trivial. Veja R ou MATLAB, por exemplo.)
Além disso, é necessária flexibilidade para níveis inteligentes de programação. Na Sociedade da mente de Minsky , capítulo 6.4 B- Brains, existem programas A que lidam com o mundo, e existem programas B que lidam com programas A, e pode haver outros níveis. Programas que escrevem e gerenciam outros programas podem ser realizados com mais facilidade em sistemas interpretativos.
No Lisp, você pode escrever (+ A B)
para adicionar A e B, mas uma vez escrito, você só pode executá-lo ou não. Você também pode escrever o (eval (list '+ 'A 'B))
que constrói o programa e depois o executa. Poderia construir algo diferente.
O assunto do programa é outro programa . É mais fácil escrever em uma linguagem interpretada (embora, como Jörg ressalte, as versões mais recentes do Lisp, enquanto elas eval
compilam em tempo real, não têm a penalidade de velocidade de interpretação).