Samstag, 2. Juli 2011

Formalisierung der AST-Change-Control-Policy

Python legt mit dem AST-Modul einen abstrakten Syntaxbaum (abstract syntax tree -- AST) offen, der die kompilierte Form von Python-Quellcode darstellt. Das AST-Modul erlaubt Nutzern Code anhand der AST-Darstellung, zwischen Parsing des Quellcodes und der Kompilierung zu Bytecode, zu inspizieren und zu verändern.

Die Bedeutung von Python-Code ist in der Sprachreferenz definiert. Das AST-Modul ist ein CPython-Implementierungsdetail und andere Python-Implementierungen müssen es nicht implementieren.

Kompatibilität des AST

Als Teil der Arbeit CPythons Peephole-Optimierer umzuschreiben, sodass er auf dem AST arbeitet (anstatt auf dem rohen Bytecode, wie es momentan der Fall ist), musste Eugene Toder einige Änderungen an der Struktur des AST machen. Als CPython-Implementierungsdetail war es nicht sofort klar, ob die Richtlinie zur Rückwärtskompatibilität auch den AST betrifft. Also stellte Eugene die Frage auf python-dev. Ist es bei AST-Änderungen notwendig rückwärtskompatibel zu bleiben?

Der allgemeine Konsens war, dass Kompatibilität nicht nötig wäre. Das AST-Modul stellt eine Konstante, ast.__version__ bereit, die Nutzercode eine Möglichkeit bietet sein Verhalten der genutzten AST-Version anzupassen. Das wurde als ausreichend Kompatibilität für ein implementierungsspezifisches Modul angesehen.

Andere Python-Implementierungen

Tatsächlich haben sowohl Jython als auch IronPython darauf hingewiesen, dass ihre jeweiligen Implementierungen entweder ein kompatibles AST-Modul haben oder eines bereitstellen wollen. Trotzdem meinten sie nicht, dass deswegen der AST eingefroren werden sollte und sind damit glücklich, dass der AST inkompatibel geändert werden könnte, solange die ast.__version-Konstante geändert wird.

Es wurde auch angesprochen, dass eine vollständige Testsuite in test_ast.py anderen Implementierungen dabei helfen würden, sicherzustellen, dass ihre Implementierungen zu CPython kompatibel sind. Die Abdeckung von test_ast.py zu erhöhen würde sich gut als Projekt für jemanden eignen, der sich bei den Python-Interna engagieren will!

Was passiert als nächstes?

Der Patch, der die Diskussion lostrat, hat noch nicht in CPython Einzug gehalten. Also könnte möglicherweise gar nichts passieren. Aber, wenn es doch passiert, wird der AST sich inkompatibel ändern. Die ast.__version__-Konstante wird sich ändern, um das widerzuspiegeln und Nutzercode wird damit die Veränderungen bemerken, aber Änderungen werden nötig sein. Allgemeiner gesprochen wird dies die Art und Weise sein, wie AST-Änderungen in Zukunft gehandhabt werden.

Die Python-Entwickler sind interessiert zu erfahren, wie weit verbreitet die Nutzung des AST ist und wie viele Auswirkungen diese Handhabung haben wird. Wenn es Leser gibt, deren Code von der Änderung betroffen ist, so sind sie aufgefordert sich an der Diskussion auf python-dev zu beteiligen.

Englische Version

Keine Kommentare:

Kommentar posten