est le code pour les langages interprétés réinterprétée chaque fois que la ligne est atteinte?

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

  •  06-09-2019
  •  | 
  •  

Question

supposons que ne bytecode est généré pour un programme, comme dans Ruby, Perl ou PHP, dans ce cas, est la ligne 1 ci-dessous réinterprété chaque fois que la ligne de portée d'exécution 1 à nouveau?

while ($indexArrayMoviesData < $countArrayMoviesData + $countNewlyAddedMoviesData) {
  # do something
}

qui est, si la boucle fonctionne 100.000 fois, puis cette ligne sera réinterprétés 100.000 fois?

et si oui, la création de bytecode aide non seulement le démarrage initial du programme il, mais aussi pendant l'exécution? (Parce que le code n'a pas besoin d'être réinterprété à nouveau)

Était-ce utile?

La solution

En règle générale, il sera converti en code binaire et que le code octet sera alors exécuté.

Mais dans le cas de PHP par exemple, le code d'octet est régénéré à chaque requête / page vue. Sauf si vous installez un code octet (ou opcode comme on l'appelle souvent dans le cas de PHP) cache, comme XCache, APC ou eAccelerator.

Autres conseils

Pour les langues récentes, y compris Perl, le code est précompilée avant d'être exécuté. Donc, la plupart des travaux d'analyse est effectuée une seule fois.

Ce n'est pas le cas pour les coques, qui interprètent chaque ligne à chaque fois qu'ils les exécutent.

Si l'interprète est raisonnable, il nous l'espérons vérifier si countArrayMoviesData $ ou countNewlyAddedMoviesData $ ont été modifiés au cours de la boucle et si elles ne sont pas la somme pourrait être calculés et conservés.

Si les valeurs sont mises à jour dans la boucle puis, selon toute vraisemblance, même le bytecode nécessiterait une opération d'addition doit avoir lieu, ne le rendant plus efficace.

Très, très peu d'interprètes vont le faire. Un exemple est séculaire, plus utilisé interprète Hypertalk pour Hypercard où vous pouvez réellement réécrire le texte de votre code programatically (c'est juste une chaîne!)

Même les interprètes qui ne produisent pas de code octet analysera votre code d'abord, comme il est difficile de faire cette ligne par ligne et beaucoup plus facile de le faire à la fois. Ainsi, un interprète très simple sera essentiellement un arbre, avec un nœud pour le « où » boucle avec deux enfants. Un « moins » expression du conditionnel, et un bloc pour le corps de la boucle

La réponse à votre question, que tous les consultants savent, est "ça dépend".

Vous avez raison, dans certaines langues interprétées, cette ligne peut être réinterprété à chaque fois. Je soupçonne que la plupart des obus le manipuler à peu près de cette façon.

Les versions originales de base, il fait aussi de cette façon.

La plupart des interprètes actuels au moins tokenize la langue, de sorte que le texte n'a pas besoin d'être de nouveau analysés à chaque fois. Autrement dit, un programme BASIC-ish comme

 00010 LET A=42
 00020 DO WHILE A > 0
 00025    LET A = A - 1
 00030 ENDDO

se convertir au moins aux petits jetons pour les mots-clés et des adresses pour la variable, quelque chose comme

 LET    $0003, 42
 LABEL  00020 
 LETEST A, 0
 IFTRUEGOTO   00030
 SUB    $0005, $0003, 1
 GOTO   00020
 LABEL  00030

où chaque mot en majuscule dans la traduction est un entier interne. De cette façon, il y a une seule passe d'analyse lexicale pour le traduire, suivi par l'interprète étant capable d'interpréter simplement les valeurs symboliques.

Bien sûr, une fois que vous allez loin, vous vous trouvez penser « gee, pourquoi ne pas utiliser opcodes réelle? »

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top