Введение

Альтернативная реализация языка программирования Python

PyPy (/'//p//aɪ//p//aɪ/) — это реализация языка программирования Python. PyPy часто работает быстрее, чем стандартная реализация CPython, поскольку использует JIT-компилятор (компилятор с динамической компиляцией). Большинство кода Python хорошо работает на PyPy, за исключением кода, зависящего от расширений CPython, который либо не работает, либо имеет дополнительные накладные расходы при запуске в PyPy. Сам PyPy построен с использованием техники, известной как мета-трассировка, — это преимущественно автоматическое преобразование, которое принимает интерпретатор на вход и выдаёт трассирующий JIT-компилятор на выходе. Поскольку интерпретаторы обычно проще писать, чем компиляторы, но работают медленнее, эта техника может упростить создание эффективных реализаций языков программирования. Инструментарий мета-трассировки PyPy называется RPython. PyPy не обладает полной совместимостью с более новыми версиями экосистемы CPython. Несмотря на заявленную совместимость с Python 2.7, 3.7, 3.8 и 3.9 ("прямая замена CPython"), ему не хватает некоторых новых функций и синтаксиса в Python 3.10, например, синтаксиса для сопоставления с образцом.

Подробности и мотивация

PyPy стремится предоставить общую систему трансляции и поддержку для создания реализаций динамических языков, делая акцент на чётком разделении между спецификацией языка и аспектами реализации. Также PyPy нацелен на обеспечение совместимой, гибкой и быстрой реализации языка программирования Python, используя вышеописанную структуру, чтобы позволить внедрение новых продвинутых возможностей без необходимости встраивания в неё деталей низкого уровня.

RPython

Сам интерпретатор PyPy написан на ограниченном подмножестве Python, называемом RPython (Restricted Python). RPython накладывает некоторые ограничения на язык Python, позволяющие определить тип переменной во время компиляции. Проект PyPy разработал инструментарий, который анализирует код RPython и преобразует его в байт-код, который затем может быть сгенерирован в C. Ранее существовали и другие бэкенды, помимо C (Java, C# и Javascript), но они устарели и были удалены. Таким образом, рекурсивный логотип PyPy изображает змею, пожирающую саму себя, поскольку RPython транслируется интерпретатором Python. Код также можно запускать без трансляции для тестирования и анализа, что предоставляет удобную платформу для исследований в области динамических языков. Он поддерживает подключаемые сборщики мусора и опциональное включение возможностей Stackless Python. Кроме того, он включает в себя генератор JIT, который создает JIT-компилятор непосредственно в интерпретаторе на основе нескольких аннотаций в исходном коде. Сгенерированный JIT-компилятор является трассирующим JIT. В настоящее время RPython также используется для реализации других языков программирования, таких как Pixie.

Статус проекта

PyPy, начиная с версии 7.3.7, совместим с тремя версиями CPython: 2.7, 3.7 и 3.8. Первая версия PyPy, совместимая с CPython v3, – PyPy v2.3.1 (2014). Интерпретатор PyPy, совместимый с CPython v3, также известен как PyPy3. PyPy поддерживает JIT-компиляцию на 32-битных/64-битных x86 и 32-битных/64-битных ARM процессорах. Он ежедневно тестируется на Windows, Linux, OpenBSD и Mac OS X. PyPy способен запускать чистый Python код, не зависящий от специфических особенностей реализации. Существует слой совместимости для расширений C API CPython, называемый CPyExt, но он неполный и экспериментальный. Предпочтительным способом взаимодействия с общими библиотеками C является встроенный интерфейс внешних функций C (CFFI) или библиотеки ctypes.

Финансирование

PyPy финансировался Европейским Союзом в рамках Специального целевого исследовательского проекта с декабря 2004 года по март 2007 года. В июне 2008 года PyPy объявил о получении финансирования в рамках программ Google Open Source и договорился сосредоточиться на повышении совместимости PyPy с CPython. В 2009 году Eurostars, европейское агентство финансирования, специализирующееся на поддержке малых и средних предприятий, одобрило предложение участников проекта PyPy под названием "PYJIT – быстрый и гибкий инструментарий для динамических языков программирования на основе PyPy". Финансирование Eurostars продолжалось до августа 2011 года. На PyCon US 2011 года Python Software Foundation выделил грант в размере 10 000 долларов США для продолжения работы PyPy над производительностью и совместимостью с новыми версиями языка. Разработка порта на архитектуру ARM была частично профинансирована Фондом Raspberry Pi. По состоянию на 2013 год финансировались различные подпроекты, включая обеспечение совместимости с Python 3, встроенную оптимизированную поддержку NumPy для численных расчетов и поддержку программной транзакционной памяти для повышения параллелизма.