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)? 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? P> p>
6 Réponses :
Vérifiez le module de désassembleur trouvé ici: P>
La seule chose est que je voulais assembler bytecode, pas Dis i> 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.
in Python 2.x, vous approchez généralement de cela avec le Les deux offrent un compilateur Code> Module
et son sous-module ast code> ast code> (note que ce module est obsolète depuis la version 2.6). Dans Python 3.x, vous utiliseriez juste ast code> a>. p>
compile () code> fonction qui ira de source / ast sur "un objet de code qui peut être exécuté par l'instruction
exécutée code> ou
eval ( ) code>. " p>
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)
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. P>
Travailler via 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! p> ast code> 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. p>
Mise à jour de Python3 - Il y a aussi un assembleur très intéressant zachariahreed / byteasm code>
.
En fait, le seul qui travaille pour moi dans PY3. Il a une API très agréable et propre: p>
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.