48 votes

Ne PyPy traduire lui-même?

Suis-je obtenir ce droit? La PyPy interprète en fait s'interpréter elle-même, puis de traduire lui-même?

Voici donc ma compréhension actuelle:

  • RPython de la chaîne consiste en partie à l'exécution du programme à traduire pour obtenir une sorte de version précompilée pour annoter et de les traduire.
  • La PyPy interprète, en cours d'exécution sur le dessus de Disponible, exécute partiellement interpréter lui-même, à quel point il les mains de contrôle hors de son RPython moitié, qui effectue la traduction?

Si cela est vrai, alors ce est l'un des plus hallucinants de choses que j'ai jamais vu.

65voto

Ben Points 22160

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.

12voto

John Doe Points 1705

Disclaimer: je ne suis pas un expert sur PyPy - en particulier, je ne comprends pas les détails de la RPython la traduction, je suis le seul à en citant des trucs que j'ai lu avant. Pour plus de post spécifique sur la façon dont RPython traduction peut travailler, découvrez cette réponse.

La réponse est, oui, il peut (mais seulement après qu'il ait été compilé à l'aide de Disponible).

Description longue:

Au premier abord, il semble fort esprit de flexion et paradoxial, mais une fois que vous comprenez, c'est facile. L'extraction de la réponse sur Wikipédia.

L'amorçage dans le programme de développement a commencé dans les années 1950 lorsque chaque programme a été construit sur le papier en code décimal ou en code binaire, bit par bit (1 et 0), parce qu'il n'y a pas de langage informatique de haut niveau, pas de compilateur, pas de l'assembleur, et aucun éditeur de liens. Un petit programme en assembleur a été codée à la main pour un nouvel ordinateur (par exemple l'IBM 650) qui a converti quelques instructions en binaire ou décimal code: A1. Ce simple programme en assembleur a ensuite été réécrit à sa juste définies par l'assemblée de la langue, mais avec les extensions qui pourrait en permettre l'utilisation de certaines autres mnémoniques pour les plus complexes de codes d'opération.

Le processus est appelé logiciel d'amorçage. Fondamentalement, vous construire un outil, par exemple un compilateur C++, une baisse de la langue qui a déjà été fait (tout ce qui à un moment a dû être codée en binaire), dire à l'ASM. Maintenant que vous avez C++ dans l'existence, vous pouvez maintenant le code d'un compilateur C++ en C++, puis utilisez l'ASM compilateur C++ pour compiler votre nouvelle. Après une fois que vous avez votre nouveau compilateur compilé, vous pouvez maintenant l'utiliser pour compiler lui-même.

Donc en gros, faire le premier outil informatique à jamais par le codage à la main, l'utilisation que l'interprète de faire un autre un peu mieux, et l'utiliser pour faire mieux, ... Et finalement vous profitez de tous les logiciels complexes d'aujourd'hui! :)

Un autre cas intéressant, est le CoffeeScript de la langue, ce qui est écrit dans... CoffeeScript. (Bien que ce cas d'utilisation nécessite toutefois l'utilisation d'un interprète externe, à savoir Node.js)

La PyPy interprète, en cours d'exécution sur le dessus de Disponible, exécute partiellement interpréter lui-même, à quel point il les mains de contrôle hors de son RPython moitié, qui effectue la traduction?

Vous pouvez compiler PyPy à l'aide d'un déjà compilé PyPy interprète, ou vous pouvez utiliser Disponible pour le compiler à la place. Cependant, depuis PyPy a un JIT maintenant, ça va être plus rapide à compiler PyPy à l'aide de lui-même, plutôt que de Disponible. (PyPy est maintenant plus rapide que Disponible dans la plupart des cas)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X