пятница, 10 июня 2011 г.

Формализация политики управления изменением AST

Источник: Formalizing the AST Change Control Policy

В Python скомпилированные исходные тексты представляются в виде абстрактного синтаксического дерева с помощью модуля AST. Модуль AST позволяет программисту анализировать и манипулировать представлением AST между процессами разбора исходников и компиляции их в байткод.

Хотя смысл Python-кода определён в справочнике языка Python, модуль AST является деталью реализации CPython, и он не является необходимым для реализации в других воплощениях Python.

Совместимость AST

В процессе выполнения работы по переписыванию локального оптимизатора CPython для работы с AST (а не обработки сырого байткода, как это сейчас происходит), Евгению Тодеру было необходимо внести некоторые изменения в структуру AST. Так как это является особенностью реализации CPython, сразу и не ясно, какую политику обратной совместимости нужно применять к AST. По этой причине Евгений задал вопрос в списке рассылки python-dev: "Является ли необходимым при изменении AST обеспечивать обратную совместимость?"

Выработанное общими усилиями мнение было таково: совместимость не является необходимой. У модуля AST есть константа ast.__version__, которая предоставляет программисту способ изменять поведение кода в зависимости от версии AST, с которой тот столкнулся. Эта возможность была признана достаточной для обеспечения совместимости в специфичном для воплощения Python модуле.

Другие воплощения Python

В действительности, мейнтейнеры Jython и IronPython указывали, что их соответствующие реализации обе имеют совместимые AST модули, или планируют предоставлять такую возможность. Однако, они не считают, что модуль AST должен быть заморожен, и не находят ничего плохого в том, что при изменении константы ast.__version__ AST будет изменяться с нарушением совместимости.

Ещё один вопрос, который поднимался, касался полного набора тестов в test_ast.py. Такой набор помог бы другим воплощениям Python обеспечить совместимость с CPython. Увеличение покрытия в test_ast.py было бы хорошим проектом для кого-нибудь, кто хочет заняться разработкой ядра Python.

Что же дальше?

Патч, который послужил причиной дискуссии, до сих пор не включён в CPython. Поэтому, вероятно, всё останется как есть. Хотя, если он будет внесён в репозиторий, AST будет изменён с потерей совместимости. Константа ast.__version__ изменится для того, чтобы отразить это. Код пользователей сможет с помощью этой переменной определить, как себя вести. Если обобщить, то это будет способ изменить AST, который вероятно будет применяться в будущем.

Разработчики Python заинтересованы в определении того, как широко используется AST, и насколько много коллизий будет иметь данная политика. Если у кого-нибудь из читателей есть код, на который будет влиять данное изменение, у них есть стимул поучаствовать в обсуждении на python-dev этого вопроса.

Комментариев нет:

Отправить комментарий