Question

Si je crée une JVM en Java , par exemple, est-il possible de rendre l'implémentation que j'ai rendue plus rapide que l'implémentation d'origine que j'ai utilisée pour construire cette implémentation, même si mon implémentation est construite au-dessus de l'implémentation d'origine et peut même dépendre de cette implémentation?

(déroutant ...)

Regardez PyPy .C'est un compilateur JIT pour Python réalisé en Python.C'est bien, mais comment peut-il prétendre être plus rapide que l'implémentation originale de Python dont il utilise et dont il dépend?

Était-ce utile?

La solution

Vous êtes confus entre une langue et l ' appareil d'exécution pour cette langue.

L'une des raisons pour lesquelles PyPy peut être plus rapide que CPython est que PyPy est compilé dans un exécutable natif complètement séparé et ne dépend pas de, ni ne s'exécute dans CPython.

Néanmoins, il serait possible qu'une implémentation inefficace d'un langage soit dépassée par un interprète écrit dans ce même langage, et hébergé dans l'interpréteur inefficace, si l'interpréteur de niveau supérieur utilisait des stratégies d'exécution plus efficaces.

/ p>

Autres conseils

Absolument, c'est possible.Votre implémentation JVM peut compiler des bytecodes Java en code machine optimisé.Si votre optimiseur était plus sophistiqué que celui de l'implémentation JVM sur laquelle vous exécutez votre compilateur Java, alors le résultat final pourrait être plus rapide.

Dans ce cas, vous pouvez exécuter votre compilateur Java sur son propre code source , et bénéficier de vitesses de compilation plus rapides à partir de là.

Vous avez dit que PyPy est un compilateur JIT pour Python (je ne le connais pas moi-même).Si tel est le cas, il convertit un programme Python en code machine, puis exécute le code machine.Une autre affiche a déclaré que le compilateur PyPy fonctionne comme un exécutable autonome, distinct de CPython.Mais même s'il devait s'exécuter sur CPython, une fois que votre programme est JIT en code machine et que le code machine compilé est en cours d'exécution, les performances du compilateur n'ont plus d'importance.La vitesse du compilateur n'a d'effet que sur le temps de démarrage.

PyPy n'est pas un interpréteur Python implémenté en Python, c'est un interpréteur et un compilateur Python implémentés dans RPython , qui est un sous-ensemble restreint de Python de type statique:

RPython est un sous-ensemble restreint de Python qui se prête à la statique Analyse.Bien qu'il y ait des ajouts à la langue et certaines choses pourrait étonnamment fonctionner, voici une liste approximative de restrictions qui devrait être considéré.Notez qu'il y a des tonnes de caissons spéciaux restrictions que vous rencontrerez au fur et à mesure.

La différence de vitesse réelle vient du fait que, contrairement à CPython qui interprète tout le programme comme un bytecode, PyPy utilise compilation juste-à-temps (JIT) (en code machine) pour les pièces RPython.

Je ne pense pas qu'il soit possible d'implémenter un interpréteur pour une langue dans cette langue (appelez-le A), puis de l'exécuter au-dessus d'un autre interpréteur existant (appelez-le B) pour cette langue et d'exécuter un programme (appelez-le P), et que P s'exécute sur (A sur B) soit plus rapide que P sur B.

Chaque opération de A va devoir être implémentée avec au moins une opération de B. Donc, même si B est atrocement mauvais et A, est optimalement bon, le fait que A soit exécuté sur B signifie que la méchanceté de B sera ralentir A.

Il pourrait être possible d'implémenter un interpréteur + compilateur JIT pour un langage dans le langage lui-même, où le compilateur JIT produit un autre code plus rapide à l'exécution, et que P s'exécute sur (A s'exécute sur B) soit plus rapide que P s'exécute sur B. La partie de l'exécution de P qui n'est pas compilée en JIT sera plus lente ( beaucoup , normalement) mais si le compilateur JIT identifie avec succès les parties "chaudes" de P et les exécute plus rapidement que B serait alors l'ensemble du système pourrait fonctionner plus rapidement dans l'ensemble.

Mais ce n'est pas vraiment intéressant. Il est également possible d'implémenter un compilateur pour un langage dans ce langage (C), de le compiler avec un compilateur existant (D) et de faire en sorte que le nouveau langage du compilateur produise du code plus rapide que ce que le compilateur d'origine aurait produit. J'espère que cela ne vous surprend pas; il doit être clair que la vitesse du code émis par D n'aura un effet que sur le temps d'exécution de C, pas sur le temps d'exécution des autres programmes compilés avec C.

L'écriture des compilateurs dans les langages qu'ils compilent se fait depuis des décennies (GCC est écrit en C, par exemple), et n'est pas vraiment pertinente pour la vraie question que je pense que vous vous posez; la compilation par JIT d'un langage ne s'utilise pas non plus. Dans les deux cas, l'exécution sous-jacente est autre que la langue que vous envisagez; généralement du code machine.

Cependant, la source de votre question est une idée fausse. L'interpréteur Python de PyPy n'est pas réellement implémenté en Python. Le projet PyPy dispose d'un interpréteur pour Python écrit en RPython . RPython est un sous-ensemble de Python, choisi pour qu'il puisse être efficacement compilé en code machine; en tant que langage, RPython ressemble beaucoup plus à Java avec l'inférence de type et des blocs indentés au lieu d'accolades. Le projet PyPy a également un compilateur pour RPython qui est écrit en Python, et est capable d'ajouter (principalement) automatiquement un compilateur JIT à tout interpréteur qu'il compile.

Lorsque vous utilisez réellement l'interpréteur PyPy en production, vous utilisez un interpréteur de code machine compilé à partir des sources RPython, tout comme lorsque vous utilisez l'interpréteur CPython, vous utilisez un interpréteur de code machine compilé à partir de C code source. Si vous exécutez l'interpréteur PyPy sur un autre interpréteur Python (ce que vous pouvez faire car un code RPython valide est également du code Python valide; mais pas l'inverse), alors il s'exécute beaucoup plus lentement que le CPython interprète.

Le processus de traduction pypy fonctionne sur CPython, mais le résultat est une liste de fichiers .c (19 fichiers la dernière fois que j'ai vérifié) qui sont ensuite compilés en un binaire: pypy-c.Au moment de l'exécution, pypy-c n'a aucune relation avec CPython, c'est pourquoi il peut être plus rapide.

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