PyPy est le processus de traduction est en fait beaucoup moins sur le plan conceptuel récursive qu'il n'y paraît.
Vraiment tout c'est un programme en Python qui traite fonction Python/classe/d'autres objets (pas de code source Python) et génère du code C. Mais bien sûr, il ne traite pas seulement de tout objets Python; il ne peut gérer que des formes particulières, qui sont ce que vous obtenez si vous écrivez votre pour-être-traduit de code dans RPython.
Depuis la traduction de la chaîne est un programme en Python, vous pouvez l'exécuter sur le dessus de n'importe quel interpréteur Python, ce qui inclut évidemment PyPy de l'interpréteur python. Donc, c'est rien de spécial.
Car il traduit RPython objets, vous pouvez l'utiliser pour traduire PyPy de l'interpréteur python, ce qui est écrit dans RPython.
Mais vous ne pouvez pas l'exécuter sur la traduction du cadre lui-même, qui est de ne pas RPython. Seulement PyPy de l'interpréteur python lui-même est RPython.
Les choses ne deviennent intéressantes car RPython code aussi code Python (mais pas l'inverse), et parce que RPython ne jamais "vraiment" dans les fichiers source, mais seulement dans la mémoire à l'intérieur d'un travail Python processus qui inclut nécessairement les autres non-RPython code (il n'y a pas de "pure-RPython" les importations ou des définitions de fonction, par exemple, parce que le traducteur opère sur les fonctions qui ont déjà été définis et importés).
Rappelez-vous que la traduction de la chaîne opère en mémoire le code Python objets. Python modèle d'exécution signifie que ces n'existent pas avant le code Python a été en cours d'exécution. Vous pouvez imaginer que de commencer le processus de traduction ressemble un peu à ça, si vous simplifier beaucoup:
from my_interpreter import main
from pypy import translate
translate(main)
Comme nous le savons tous, juste à l'importation main
va fonctionner beaucoup de code Python, y compris tous les autres modules, my_interpreter
des importations. Mais le processus de traduction commence l'analyse de la fonction de l'objet main
; il ne voit jamais, et ne se soucie pas, quel que soit le code a été exécuté à venir avec main
.
Une façon de penser, c'est que "la programmation en RPython" signifie "écrire un programme en Python qui génère une RPython programme, puis alimente le processus de traduction". C'est relativement facile à comprendre et est une sorte de semblable à la façon dont beaucoup d'autres compilateurs de travail (par exemple, une façon de penser de la programmation en C est que vous êtes essentiellement l'écriture d'un C le pré-programme de traitement qui génère un programme en C, qui est ensuite envoyé au compilateur C).
Les choses seulement de la confusion dans la PyPy cas, car tous les 3 composantes (le programme en Python qui génère le RPython programme, le RPython programme et le processus de traduction) sont chargés dans le même interpréteur Python. Cela signifie qu'il est tout à fait possible d'avoir des fonctions qui sont RPython lorsqu'elle est appelée avec des arguments et pas quand on l'appelle avec d'autres arguments, pour appeler des fonctions d'assistance à partir de la traduction dans le cadre de la génération de votre RPython programme, et beaucoup d'autres choses étranges. Donc, la situation est assez floue sur les bords, et vous ne pouvez pas diviser vos lignes de source proprement dans "RPython à traduire", "Python générer mon RPython programme" et "la remise de la RPython programme au cours de la traduction du cadre".
La PyPy interprète, en cours d'exécution sur le dessus de Disponible, exécute partiellement
interpréter lui-même
Je pense que vous faites référence ici est PyPy de l'utilisation de l'objet de flux de l'espace lors de la traduction, de faire de l'interprétation abstraite. Même ce n'est pas comme fou et l'esprit de flexion, comme il semble au premier abord. Je suis beaucoup moins bien informées sur cette partie de PyPy, mais ce que je comprends:
PyPy met en œuvre toutes les opérations d'un interpréteur Python en déléguant à un "espace objet", qui contient une mise en œuvre de l'ensemble de la base construite dans les opérations. Mais vous pouvez brancher d'objets différents espaces pour obtenir des effets différents, et aussi longtemps qu'ils mettent en œuvre le même "espace objet" de l'interface de l'interprète sera toujours en mesure d'exécuter du code Python.
Le RPython code des objets que la PyPy la traduction de la chaîne d'processus est le code Python qui pourrait être exécuté par un interpréteur. Donc, PyPy ré-utilise une partie de leur interpréteur Python dans le cadre de l'outil de traduction de la chaîne, en branchant le flux de l'espace objet. Lors de l'exécution de code" avec cet objet, l'espace, l'interprète n'a pas de réaliser les opérations du code, à la place, produit des graphiques de flux, qui sont les analogues des sortes de représentation intermédiaire utilisé par de nombreux autres compilateurs; c'est juste une simple machine manipulable représentation du code, afin d'être traitées. C'est de cette façon régulière (R)code Python objets se transformer en une entrée pour le reste du processus de traduction.
Depuis la chose habituelle qui est traduit par le processus de traduction est PyPy de l'interpréteur Python, il fait "s'interprète elle-même" avec le flux de l'espace objet. Mais tout ce qui signifie vraiment, c'est que vous avez un programme en Python qui est le traitement de fonctions Python, y compris ceux qui font le traitement. En soi, elle n'est pas des plus hallucinants que l'application d'un décorateur pour lui-même, ou d'avoir un wrapper de la classe enrouler une instance de lui-même (ou de la pellicule de la classe elle-même).
Euh, qui a obtenu un peu rambly. J'espère que cela aide, de toute façon, et j'espère que je n'ai pas dit quoi que ce soit inexact; veuillez me corriger si j'ai.