é o código para linguagens interpretadas re-interpretada cada vez que a linha é alcançada?

StackOverflow https://stackoverflow.com/questions/922692

  •  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)

Foi útil?

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?"

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top