Русская Википедия:PyPy
Шаблон:Карточка программы Шаблон:Ltn — интерпретатор языка программирования Python. PyPy в начале своего существования был интерпретатором Python, написанным на Python. Текущие версии PyPy транслируются из RPython в Си и компилируются. В PyPy встроен Шаблон:Iw JIT-компилятор, который может превращать код на Python в машинный код во время выполнения программы.
Цели проекта
PyPy был задуман как реализация Python, написанная на Python. Тот факт, что PyPy реализован на языке высокого уровня, делает его более гибким и позволяет легче экспериментировать с новыми возможностями, чем CPython, а также легко определить области, где он может быть улучшен.
PyPy призван обеспечить единый механизм трансляции. Он поддерживает фреймворк для реализации динамических языков программирования и осуществляет чёткое разделение между спецификацией языка и его реализацией.
Он также призван обеспечить совместимость, гибкость и быстроту реализации языка программирования Python и позволяет реализовывать новые возможности без необходимости программирования на языке низкого уровня[1].
Трансляция
PyPy состоит из стандартного интерпретатора и транслятора.
Интерпретатор полностью реализует язык Python. Сам интерпретатор написан на ограниченном подмножестве этого же языка, называемом RPython (Restricted Python). В отличие от стандартного Python, RPython является статически типизированным для более эффективной компиляции[2].
Транслятор является набором инструментов, который анализирует код RPython и переводит его в языки более низкого уровня, такие как C, байт-код Java или CIL. Он также поддерживает подключаемые сборщики мусора и позволяет опционально включать Stackless. Также он включает JIT-компилятор для трансляции кода в машинные инструкции во время исполнения программы.
PyPy как средство реализации интерпретаторов
Компилятор языка RPython можно использовать и для написания интерпретаторов с других языков программирования. Добавив в код такого интерпретатора импорт класса JitDriver и создание его экземпляра, а затем передав в этот класс списки глобальных переменных, изменяемых и неизменяемых в ходе выполнения программы, а также сделав ещё несколько очевидных деклараций, мы, после трансляции с флагом --opt=jit:
, получаем работающий JIT-компилятор языка[3].
История проекта
PyPy является продолжением проекта Psyco, JIT-компилятора для Python, разработанный Армином Риго (Armin Rigo). Цель PyPy в том, чтобы иметь JIT-компилятор с охватом, который не был доступен для Psyco. PyPy начался как исследовательский проект для разработчиков.
Когда проект достиг зрелой стадии развития и официальной версии 1.0 в середине 2007 года, следующий акцент был сделан на выпуск production-ready версии с большей совместимостью с CPython.
Версия 1.1 была выпущена 28 апреля 2009 года.
В марте 2010 года вышла версия 1.2, в которой особое внимание было уделено скорости. Эта версия включает в себя JIT-компилятор, который работает, но не рекомендуется для использования в production.
26 ноября 2010 года была выпущена версия 1.4. Эта версия впервые в режиме JIT-компилятора по скорости превосходит CPython[4]. Также разработчики считают, что эта версия готова для использования в production[5].
В рамках PyPy разрабатывается специальная версия интерпретатора pypy-stm, в которой реализована программная транзакционная память[6][7]. Использование транзакционной памяти позволит избавиться от GIL и упростит распараллеливание Python приложений на многоядерных системах.
9 мая 2013 года вышла вторая версия PyPy, в число новшеств которой входит бесстековый режим и новый интерфейс работы с внешними функциями на языке Си — cffi[8].
10 марта 2016 года вышла пятая версия PyPy, в которой была улучшена производительность, и API CPython получило множество улучшений[9].
9 августа 2016 года PyPy получил финансирование в размере $200,000 от Mozilla для поддержки Python 3.5[10].
12 ноября 2016 года вышла версия PyPy2 v5.6, самое главное изменение — стандартная библиотека Python 2.7.12
Поддерживаемые бэкенды
- C — трансляция кода RPython в C и запуск как нативной программы; это стандартный режим работы;
- Python — транслятор PyPy также может быть запущен в интерпретаторе Python или в самом интерпретаторе PyPy, хотя скорость работы будет крайне низкой; эта возможность полезна для отладки.
По состоянию на 2017 год, PyPy отказался от JVM, CIL, JavaScript[11] в качестве бэкендов.
Совместимость с CPython
Версия 5.6.0 совместима с версией Python 2.7.12 и может работать на 32- и 64-битных платформах (кроме Windows, где поддерживается только 32-битная версия[12]). PyPy полностью поддерживает модули, написанные на чистом Python. Для использования двоичных расширений (.so и .pyd) PyPy имеет хорошую поддержку API CPython в виде отдельного модуля cpyext. Для нормальной работы этих расширений требуется их перекомпиляция[13].
Версия PyPy3 5.5 совместима с CPython 3.3.5[14].
Также ведётся активная разработка PyPy3.5, реализующей Python 3.5.
Известно, что следующие библиотеки и фреймворки могут работать в PyPy[13]:
- ctypes
- django
- sqlalchemy
- flask
- twisted
- pylons
- IPython
- Selenium
- nevow (en:nevow)
- pyglet (en:pyglet)
- pillow (форк Python Imaging Library)
- lxml
- NumPy (неполная совместимость)[15].
- а также множество других (менее популярных) библиотек
См. также
- Раскрутка компилятора
- Cython
- Shedskin, транслятор Python в код C++
- Psyco
- Rubinius, реализация Ruby на Ruby
Примечания
Литература
- Davide Ancona, Massimo Ancona, Antonio Cuni, Nicholas D. Matsakis, 2007. RPython: a Step Towards Reconciling Dynamically and Statically Typed OO LanguagesШаблон:Недоступная ссылка. In Proc. Dynamic Language Symposium (DLS), 2007. ACM Press.
- Carl Friedrich Bolz, Antonio Cuni, Maciej Fijalkowski, 2009. Tracing the meta-level: PyPy’s Tracing JIT Compiler. In Proc. ICOOOLPS, 2009. ACM Press.
- Шаблон:Cite web
- Шаблон:Cite web
- Шаблон:Cite news
- Шаблон:Cite web
- Шаблон:Cite web
Ссылки
- ↑ Шаблон:Cite web
- ↑ «It is a proper subset of Python, restricted in a way that enables easy analysis and efficient code generation», Ancona et al., 2007.
- ↑ Andrew Brown, Tutorial: Writing an Interpreter with PyPy, Part 1 Шаблон:Wayback, Part 2: Adding a JIT Шаблон:Wayback,
Руководство: пишем интерпретатор с JIT на PyPy (перевод) Шаблон:Wayback,
Репозиторий исх. кода Шаблон:Wayback
В статье, описывается реализация Brainfuck на RPython - ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Шаблон:Wayback Re: [pypy-dev] pypy appears to have entirely removed all mention of javascript
- ↑ Шаблон:Cite web
- ↑ 13,0 13,1 Шаблон:Cite web
- ↑ Шаблон:Cite web
- ↑ Шаблон:Cite web