11
votes

Y a-t-il un moyen de générer de manière programmée par Python Bytecode?

Je veux pirater avec l'interprète Python et essayer de créer un petit DSL. Y a-t-il un module où je peux faire quelque chose comme ce code théorique (semblable aux arbres d'expression de Linq)? xxx

ou serait-il simplement plus facile de générer un code source Python? Cela pourrait-il être facilité en utilisant c ou Swig ou Cyron?


2 commentaires

Compte tenu de l'énorme pouvoir expressif des langues OO (Python en particulier), une DSL est assez stupide. Juste écrire le python. Si vous vous fournissez de bonnes définitions de classe, vous avez un Python "DSL" et n'en avez pas besoin de cela.


Les DSL ne sont jamais idiotes. Nous sommes plus productifs dans les DSL. Voir «Code complète» une Bible de construction de logiciels.


6 Réponses :


0
votes

Vérifiez le module de désassembleur trouvé ici:

http://docs.python.org/library/dis.html


2 commentaires

La seule chose est que je voulais assembler bytecode, pas Dis l'assemblez. :-)


Ahh bon point, désolé qui;) Cependant, la bonne chose à propos du module Désassembler est que cela vous permet de regarder le bytecode généré et de donner aux spécificités aux instructions de la byTecode.



5
votes

in Python 2.x, vous approchez généralement de cela avec le compilateur Module et son sous-module ast ast (note que ce module est obsolète depuis la version 2.6). Dans Python 3.x, vous utiliseriez juste ast .

Les deux offrent un compile () fonction qui ira de source / ast sur "un objet de code qui peut être exécuté par l'instruction exécutée ou eval ( ) . "


0 commentaires

1
votes

Fernando Meyer a récemment écrit un article de blog Expliquer comment utiliser le codage # Code> Directive Pour spécifier vos propres extensions à Python. Exemple (la définition du format réel est dans PYSPEC.PY et tokenizer.py ):

# coding: pyspec

class Bow:
    def shot(self):
        print "got shot"

    def score(self):
        return 5

describe Bowling:
    it "should score 0 for gutter game":
        bowling = Bow()
        bowling.shot()
        assert that bowling.score.should_be(5)


0 commentaires

2
votes

Il est plus facile de générer du code Python et de l'exécuter. Si vous le faites, vous pouvez également le déboguer plus facilement car il y a une source réelle pour le débogueur à afficher. Voir aussi Article Malte Borchs dans le numéro de juillet du magazine Python, où il en parle parmi d'autres choses.


0 commentaires

12
votes

Travailler via ast et compiler l'arborescence en bytecode, comme une autre réponse suggère, est probablement la plus simple; générer des sources et compiler ceux-ci, presque aussi bon.

Cependant, pour explorer les approches de niveau inférieur, consultez les liens de Cette page ; J'ai trouvé byTEplay particulièrement utile (actuellement ne fonctionne pas sur 2,6 ni 3. *, Seulement 2,4 ou 2,5, mais je pense que la fixer pour 2,6 devrait être facile, comme décrit actuellement dans son tracker). Je n'ai pas utilisé de Phil Eby's de la même manière - en vedette bytecodeAsMbler , mais compte tenu de la réputation de l'auteur, je suis sûr que c'est Vaut la peine de le vérifier!


0 commentaires

1
votes

Mise à jour de Python3 - Il y a aussi un assembleur très intéressant zachariahreed / byteasm .

En fait, le seul qui travaille pour moi dans PY3. Il a une API très agréable et propre: xxx


0 commentaires