2017-06-17 3 views
0

1 J'ai trouvé un interpréteur Python implémenté en Python. Je suis confus si j'ai besoin d'installer d'autres interprètes pour interpréter l'interprète lui-même? Si oui, pourquoi faut-il prendre la peine d'écrire un interprète dans la langue qu'il interprétera? Sinon, comment exécuter cet interpréteur?Python Interpreter peut être implémenté en Python, mais quel interprète interprétera l'Interpreter lui-même?

2 Je ne suis pas très clair sur le compilateur qui est implémenté dans le langage qu'il va compiler. L'interprète et le compilateur ont-ils la même raison derrière?

Répondre

0

Si nous écrivons un programme qui peut interpréter une expression mathématique simple telle que 1 + 2 * 3. Le programme est écrit en C.

// bash 
> ./calculate "1 + 2 * 3" 
> 7 

Ainsi, un programme de langage C peut interpréter un langage simple de mathématiques.

De toute évidence, nous pouvons choisir Ruby ou Python au lieu de C pour écrire ce programme. Enfin, un programme de langage Ruby ou Python peut interpréter un langage mathématique.

Faisons en sorte que le programme interprète un langage plus complexe, tel que Python. Ensuite, nous l'avons eu. Un programme en langage Python interprète un langage Python. Par conséquent, n'importe quelle langue peut interpréter n'importe quelle langue.

Le compilateur compile le code source en code machine, de sorte qu'il peut s'exécuter directement dans la CPU. Interpreter interprète le code source en octet, afin qu'il puisse s'exécuter dans une machine virtuelle. La seule différence est que le CPU existait déjà mais que la machine virtuelle doit d'abord être compilée.

désolé pour mon mauvais anglais.

0

Une des raisons de cette technique (appelée bootstrapping, comme un autre utilisateur a répondu correctement), peut être d'utiliser différentes techniques d'optimisations du compilateur et de travaux (à peu près) comme suit:

Supposons que vous ayez un compilateur de travail Y, qui compile une langue X pour, disons, la langue d'assemblage. Ensuite, ce compilateur est tout ce dont vous avez besoin pour traduire un programme écrit en langage X en une forme compréhensible et exécutable (après une liaison, etc.) sur votre machine.

Maintenant, vous pensez que ce compilateur est bien écrit dans ses aspects principaux, mais pas si bien écrit dans d'autres aspects (par exemple: il est très lent dans l'évaluation d'une longue déclaration de cas).

Ce que vous faites est: vous réécrivez le langage complet X en utilisant seulement un sous-ensemble (bien implémenté avec le compilateur Y) du langage X et optimisez l'évaluation des longues déclarations de cas mentionnées (exemple).

Maintenant, vous avez un compilateur Z, qui évalue un programme de langage X à un programme qui ne comprend que des instructions de base du langage X. Avec le compilateur Y vous pouvez maintenant le traduire en langage assembleur.

Généralement: À un certain point d'une longue rangée de compilateurs, il devrait y avoir un compilateur, qui génère réellement des instructions machine valides ou vous ne pourrez pas exécuter votre joli programme (cela semble trivial, mais bon à garder à l'esprit) .

EDIT @merito: un compilateur traduit un programme d'un langage source vers un langage cible, qui peut être un code binaire, mais pas nécessairement. Votre distinction entre interprète et compilateur me semble erronée.