Наши партнеры

UnixForum





Библиотека сайта rus-linux.net

PyPy

Глава 19 из книги "Архитектура приложений с открытым исходным кодом", том 2.
Оригинал: PyPy
Автор: Benjamin Peterson
Перевод: А.Панин

19.6. Недостатки архитектуры

Хотя разработка приложений на языке RPython в любом случае проще, чем на языке C, опыт такой разработки может привести к разочарованию. В первое время сложно использовать применяющуюся в нем явную типизацию. Не все возможности языка программирования Python поддерживаются, а на поддерживаемые возможности накладываются произвольные ограничения. Язык RPython не имеет формальной спецификации и все принимаемые системой преобразования кода синтаксические конструкции могут меняться день ото дня из-за того, что язык RPython адаптируется для удовлетворения требований фреймворка PyPy. Автору этой главы часто удается создавать программы, в ходе получасовой обработки которых с помощью системы преобразования кода выводится непонятное сообщение об ошибке и процесс преобразования прекращается.

Тот факт, что система преобразования кода RPython производит анализ всей программы, создает несколько практических проблем. Любое минимальное изменение преобразуемого кода приводит к необходимости повторного преобразования кода всего интерпретатора. На данный момент процесс преобразования кода растягивается на 40 минут при использовании быстрой современной системы. Эта задержка особенно раздражает тогда, когда тестируются изменения, затрагивающие систему JIT-компиляции, ведь для измерения производительности необходимо произвести преобразование кода интерпретатора. Требование наличия всего кода программы перед его преобразованием подразумевает то, что модули, содержащие код на языке RPython, не могут быть скомпилированы и загружены отдельно от основного кода интерпретатора.

Уровни абстракции в PyPy не всегда так четко разделены, как это выглядит в теории. Хотя технически JIT-генератор должен иметь возможность создания замечательного JIT-компилятора для языка с использованием только двух упомянутых ранее указаний, в реальности он работает лучше с одним определенным кодом, нежели с другим. Был проведен большой объем работы для того, чтобы интерпретатор Python был "лучше совместим с процессом генерации jit-кода", включая реализацию большего количества JIT-указаний и даже новые структуры данных, специально оптимизированные для работы с JIT-генератором.

Большое количество уровней абстракции PyPy может сделать поиск ошибок достаточно сложным процессом. Ошибка интерпретатора Python может находиться в самом коде интерпретатора, либо скрываться где-либо в семантиках языка RPython и инструментарии для преобразования кода. Отладка особенно осложняется в том случае, когда ошибка не может быть воспроизведена без преобразования кода интерпретатора. Обычно в этих случаях прибегают к использованию отладчика GDB по отношению к приложению, скомпилированному на основе практически нечитаемого автоматически сгенерированного исходного кода на языке C.

Преобразование даже ограниченного подмножества языка Python в такой более низкоуровневый язык, как C, не является простой задачей. Фазы процесса преобразования, описанные в Разделе 19.4, на самом деле не являются независимыми. В процессе преобразования кода производится создание аннотаций и типизация функций, при этом система создания аннотаций располагает информацией о низкоуровневых типах. Следовательно, система преобразования кода для языка RPython сталкивается с запутанной схемой зависимостей. Система преобразования может немного упростить ее в некоторых местах, но этот процесс не прост и не доставляет удовольствия.


Продолжение статьи: Немного о процессе разработки