é o código para linguagens interpretadas re-interpretada cada vez que a linha é alcançada?
-
06-09-2019 - |
Pergunta
supor que não bytecode é gerado para um programa, como em Ruby, Perl ou PHP, neste caso, é a linha 1 abaixo interpretada-re cada vez que a linha alcance execução 1 novamente?
while ($indexArrayMoviesData < $countArrayMoviesData + $countNewlyAddedMoviesData) {
# do something
}
isto é, se o loop é executado 100.000 vezes, então essa linha será re-interpretado 100.000 vezes?
e se assim for, a criação bytecode ajuda não só o arranque inicial de que programa, mas também durante a execução? (Porque o código não precisa ser re-interpretada de novo)
Solução
Normalmente, ele vai ser convertido em código de bytes e que o código byte, então, ser executado.
Mas no caso do PHP por exemplo, o código de byte é regenerado em cada visualização do pedido / página. A menos que você instalar um código de bytes (ou código de operação, como é chamado frequentemente no caso de PHP) cache, como XCache, APC ou eAccelerator.
Outras dicas
Para linguagens recentes, incluindo perl, o código é pré-compilado antes de ser executado. Assim, a maioria do trabalho de análise é realizada apenas uma vez.
Este não é o caso para os reservatórios, que interpretam cada linha de cada vez que executá-los.
Se o intérprete é sensato que poderia vir a verificar se $ countArrayMoviesData ou US $ countNewlyAddedMoviesData foram alteradas durante o ciclo e se eles não estavam então a soma poderia ser calculado e mantido.
Se os valores são atualizados dentro do loop, em seguida, com toda a probabilidade, mesmo o bytecode exigiria uma operação de adição a ter lugar, não torná-lo mais eficiente.
Muito, muito poucos intérpretes vai fazer isso. Um exemplo são as idades de idade, intérprete HyperTalk não é mais usado para Hypercard onde você realmente pode reescrever o texto do seu código de programação (que é apenas uma corda!)
intérpretes Mesmo que não produzem byte código irá analisar o seu código em primeiro lugar, como é difícil fazer isso linha por linha e muito mais fácil fazer tudo de uma vez. Assim, um intérprete muito simples, basicamente, ter uma árvore, com um nó para o "onde" loop com dois filhos:. One "inferior a" expressão para a condicional, e um bloco para o corpo do laço
A resposta à sua pergunta, como todos os consultores sabe, é "depende".
Você está certo, em algumas linguagens interpretadas, essa linha pode ser reinterpretada a cada vez. Eu suspeito que a maioria das conchas lidar com isso mais ou menos desta forma.
As versões originais do Basic também fiz isto deste modo.
A maioria dos intérpretes atuais , pelo menos tokenizar a língua, de modo que o texto não precisa ser re-rastreados a cada vez. Ou seja, um programa BASIC-ish como
00010 LET A=42
00020 DO WHILE A > 0
00025 LET A = A - 1
00030 ENDDO
poderia convertê-lo pelo menos para pequenas fichas para as palavras-chave e endereços para a variável, algo como
LET $0003, 42
LABEL 00020
LETEST A, 0
IFTRUEGOTO 00030
SUB $0005, $0003, 1
GOTO 00020
LABEL 00030
onde cada palavra em maiúsculas na tradução é um único inteiro internamente. Dessa forma, não há uma única passagem análise léxica para traduzi-lo, seguido pelo intérprete ser capaz de simplesmente interpretar os valores de token.
É claro que, uma vez que você ir tão longe, você está pensando "caramba, por que não usar opcodes reais?"