PyPy: быстрая реализация Python с JIT-компилятором. Ускоряет выполнение кода, но не поддерживает CPython-расширения. Мета-трассировка для эффективной разработки.
Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
Альтернативная реализация языка программирования Python
Alternative implementation of the Python programming language
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 (/'//p//aɪ//p//aɪ/) is an implementation of the Python programming language. PyPy often runs faster than the standard implementation CPython because PyPy uses a just in time compiler. Most Python code runs well on PyPy except for code that depends on CPython extensions, which either does not work or incurs some overhead when run in PyPy. PyPy itself is built using a technique known as meta tracing, which is a mostly automatic transformation that takes an interpreter as input and produces a tracing just in time compiler as output. Since interpreters are usually easier to write than compilers, but run slower, this technique can make it easier to produce efficient implementations of programming languages. PyPy's meta tracing toolchain is called RPython. PyPy does not have full compatibility with more recent versions of the CPython ecosystem. While it claims compatibility with Python 2.7, 3.7, 3.8 and 3.9 ("a drop in replacement for CPython"), it lacks some of the newer features and syntax in Python 3.10, such as syntax for pattern matching.
Подробности и мотивация
PyPy стремится предоставить общую систему трансляции и поддержку для создания реализаций динамических языков, делая акцент на чётком разделении между спецификацией языка и аспектами реализации. Также PyPy нацелен на обеспечение совместимой, гибкой и быстрой реализации языка программирования Python, используя вышеописанную структуру, чтобы позволить внедрение новых продвинутых возможностей без необходимости встраивания в неё деталей низкого уровня.
PyPy aims to provide a common translation and support framework for producing implementations of dynamic languages, emphasizing a clean separation between language specification and implementation aspects. It also aims to provide a compliant, flexible and fast implementation of the Python programming language using the above framework to enable new advanced features without having to encode low level details into it.
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.
The PyPy interpreter itself is written in a restricted subset of Python called RPython (Restricted Python). RPython puts some constraints on the Python language such that a variable's type can be inferred at compile time. The PyPy project has developed a toolchain that analyzes RPython code and translates it into a form of byte code, which can be lowered into C. There used to be other backends in addition to C (Java, C#, and Javascript), but those suffered from bitrot and have been removed. Thus, the recursive logo of PyPy is a snake swallowing itself since the RPython is translated by a Python interpreter. The code can also be run untranslated for testing and analysis, which provides a nice test bed for research into dynamic languages. It allows for pluggable garbage collectors, as well as optionally enabling Stackless Python features. Finally, it includes a just in time (JIT) generator that builds a just in time compiler into the interpreter, given a few annotations in the interpreter source code. The generated JIT compiler is a tracing JIT. RPython is now also used to write non Python language implementations, such as 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 as of version 7.3.7 is compatible with three CPython versions: 2.7, 3.7 and 3.8. The first PyPy version compatible with CPython v3 is PyPy v2.3.1 (2014). The PyPy interpreter compatible with CPython v3 is also known as PyPy3. PyPy has JIT compilation support on 32 bit/64 bit x86 and 32 bit/64 bit ARM processors. It is tested nightly on Windows, Linux, OpenBSD and Mac OS X. PyPy is able to run pure Python software that does not rely on implementation specific features. There is a compatibility layer for CPython C API extensions called CPyExt, but it is incomplete and experimental. The preferred way of interfacing with C shared libraries is through the built in C foreign function interface (CFFI) or ctypes libraries.
Финансирование
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 для численных расчетов и поддержку программной транзакционной памяти для повышения параллелизма.
PyPy was funded by the European Union being a Specific Targeted Research Project between December 2004 and March 2007. In June 2008, PyPy announced funding being part of the Google Open Source programs and has agreed to focus on making PyPy more compatible with CPython. In 2009 Eurostars, a European Union funding agency specially focused on SMEs, accepted a proposal from PyPy project members titled "PYJIT – a fast and flexible toolkit for dynamic programming languages based on PyPy". Eurostars funding lasted until August 2011. At PyCon US 2011, the Python Software Foundation provided a $10,000 grant for PyPy to continue work on performance and compatibility with newer versions of the language. The port to ARM architecture was sponsored in part by the Raspberry Pi Foundation. As of 2013, a variety of sub projects had funding: Python 3 version compatibility, built in optimized NumPy support for numerical calculations and software transactional memory support to allow better parallelism.