Pour du code similaire A = A + B
, cela peut être compilé en une ou deux instructions machine, chacune prenant un certain nombre de cycles. Aucun interprète ne peut faire la même chose dans ce nombre de cycles pour une raison simple.
L’interprète exécute également un ensemble d’instructions (appelez-les octets, p-codes, langage intermédiaire, etc.). Chaque fois qu'il voit un code octet comme ADD, il doit le rechercher d'une manière ou d'une autre et créer une branche vers le code qui effectue l'addition.
La prochaine fois qu'il le verra, il devra répéter cette recherche, à moins qu'il ait un moyen de se souvenir de la recherche précédente. S'il a un moyen de se souvenir de la recherche précédente, il ne s'agit plus d'un interprète, mais d'un compilateur juste-à-temps, ou JITter.
D'autre part...
Pour un code du type callSomeFunction( ... some args ...)
, combien de cycles sont dépensés entre la saisie de ce code et sa sortie? Tout dépend de ce qui se passe à l'intérieur callSomeFunction
. Cela pourrait être quelques-uns, et cela pourrait être des milliards, même si callSomeFunction
elle est elle-même compilée. Si c'est beaucoup, il ne sert à rien de débattre du coût d'interprétation de cette ligne de code - l'argent est ailleurs.
Rappelez-vous que les langages interprétés ont une valeur qui leur est propre, par exemple, aucun besoin de les compiler. (La "compilation" de la syntaxe de surface en codes d'octets prend un temps trivial. Prenez R ou MATLAB, par exemple.)
En outre, la flexibilité est nécessaire pour des niveaux de programmation intelligents. Dans Minsky Society of Mind , chapitre 6.4 B- Brains, il existe des programmes A qui traitent du monde, et des programmes B qui traitent des programmes A, et il peut y avoir d'autres niveaux. Les programmes qui écrivent et gèrent d'autres programmes peuvent être plus facilement réalisés dans des systèmes d'interprétation.
En Lisp, vous pouvez écrire (+ A B)
pour ajouter A et B, mais une fois qu'il est écrit, vous ne pouvez que le lancer ou non. Vous pouvez également écrire (eval (list '+ 'A 'B))
quelle construction du programme, puis l'exécuter. Il pourrait construire quelque chose de différent.
Le sujet du programme est un autre programme . C’est plus facile à écrire dans un langage interprété (bien que, comme Jörg le fait remarquer, les versions les plus récentes de Lisp, alors qu’elles ont eval
, compilées à la volée, elles n’ont donc pas la peine d’interpréter rapidement).