PyPy

PyPy
Official PyPy logo
Тип інтерпретатор та компілятор (як набір інструментів) Python
Стабільний випуск 5.9 (5 жовтня, 2017; 6 років тому (2017-10-05))
Операційна система крос-платформовий
Мова програмування Python
Стан розробки активний
Ліцензія MIT License
Репозиторій github.com/pypy/pypy
Вебсайт pypy.org

PyPy — реалізація мови програмування Python, інтерпретатор та JIT-компілятор, написані на мові Python (використовується статично типізована підмножина RPython, Restricted Python). Проект має за мету швидкодію, ефективність та 100 % сумісність з класичною реалізацією Python на мові Сі — CPython.

Завдяки залученню JIT-компілятора, котрий на льоту транслює деякі елементи в машинний код, PyPy при виконанні деяких операцій в кілька разів обганяє у продуктивності оригінальний інтерпретатор CPython. Ціною високої продуктивності та використання JIT-компіляції є більше споживання пам'яті — загальне споживання пам'яті в складних і тривало працюючих процесах (наприклад, при трансляції PyPy силами самого PyPy) перевищує споживання CPython в півтора-два рази.

Історія проекту

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[1]. Також розробники вважають, що ця версія готова для використання в production[2].

У червні 2014 вийшла перша[3] стабільна версія з підтримкою Python 3, гілка PyPy3 розвивається синхронно з PyPy і відрізняється підтримкою Python 3.

Цілі проекту

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

PyPy покликаний забезпечити єдиний механізм трансляції. Він підтримує фреймворк для реалізації динамічних мов програмування і здійснює чіткий поділ між специфікацією мови та її реалізацією.

Він також покликаний забезпечити сумісність, гнучкість і швидкість реалізації мови програмування Python і дозволяє реалізовувати нові можливості без необхідності програмування на мові низького рівня.[4]

Трансляція

PyPy складається з стандартного інтерпретатора і транслятора.

Інтерпретатор повністю реалізує мову Python, використовуючи обмежену підмножину мови, звану RPython (Restricted Python). На відміну від стандартного Python, RPython є статично типізованим для ефективнішої компіляції[5].

Транслятор є набором інструментів, який аналізує код RPython і переводить його в мови нижчого рівня, такі як C, байт-код Java або CIL. Він також підтримує спільні збирачі сміття і дозволяє опціонально включати Stackless. Також він включає JIT-компілятор для трансляції коду в машинні інструкції під час виконання програми.

RPython

Сам інтерпретатор PyPy написаний у обмеженій підмножині Python під назвою RPython (обмежений Python). RPython накладає деякі обмеження на мову Python, так що тип змінної можна визначити під час компіляції.[6][7]

Проект PyPy розробив ланцюжок інструментів, який аналізує код RPython і перетворює його у форму байтового коду, який можна опустити в C. Раніше крім C існували інші бекенди: Java, CSharp та Javascript, але ті, що постраждали від бітротів і були видалені. Таким чином, рекурсивний логотип PyPy — це змія, яка ковтає себе, оскільки RPython перекладається інтерпретатором Python. Код також можна запускати в неперекладеному вигляді для тестування та аналізу, що забезпечує хороший тестовий майданчик для дослідження динамічних мов.

Він дозволяє підключати збирачі сміття, а також додатково включати функції Stackless Python. Нарешті, він включає генератор JIT (just-in-time), який вбудовує компілятор just-in-time в інтерпретатор з огляду на кілька анотацій у вихідному коді інтерпретатора. Згенерований компілятор JIT є трасуванням JIT.[8]

Тепер RPython також використовується для написання не-Python мовних реалізацій, таких як Pixie.[9]

PyPy як засіб реалізації інтерпретаторів

Компілятор мови RPython можна використовувати і для написання інтерпретаторів з інших мов програмування. Додавши в код такого інтерпретатора імпорт класу JitDriver і створення його примірник, а потім передавши в цей клас списки глобальних змінних, змінних і незмінних в ході виконання програми, а також зробивши ще кілька очевидних декларацій, ми, після трансляції з прапорцем -opt=jit:, отримуємо працюючий JIT-компілятор мови.[10]

Підтримувані бекенди

  • C — трансляція коду RPython в C і запуск як рідної програми; це стандартний режим роботи;
  • CIL — Common Intermediate Language;
  • JVM — віртуальна машина Java;
  • Python — транслятор PyPy також може бути запущений в інтерпретаторі Python, хоча швидкість роботи буде вкрай низькою; ця можливість корисна для зневадження.

Станом на 2010, PyPy відмовився від JavaScript як бекенду.[11]

Сумісність з CPython

Версія 1.4 сумісна з версією Python 2.5 і може працювати на 32-х і 64-х бітних платформах. PyPy повністю підтримує модулі написані на чистому Python. Для використання бінарних (.so і .pyd) розширень PyPy має початкову підтримку API CPython у вигляді окремого модуля cpyext. Для нормальної роботи цих розширень потрібно їх перекомпіляція.[12]

Відомо, що такі бібліотеки і фреймворки можуть працювати в PyPy[12]:

  • ctypes
  • django (бази даних не підтримуються, за винятком sqlite)
  • twisted (без підтримки SSL)
  • pylons
  • nevow[en]
  • pyglet

Виноски

  1. PyPy Speed Center: Comparison. Архів оригіналу за 2 квітня 2012. Процитовано 11 лютого 2012.
  2. PyPy Status Blog: PyPy 1.4: Ouroboros in practice. Архів оригіналу за 9 березня 2012. Процитовано 11 лютого 2012.
  3. Первый стабильный выпуск PyPy3 с поддержкой Python 3 [Архівовано 23 червня 2014 у Wayback Machine.] // opennet.ru 21.06.2014
  4. Samuele Pedroni (March 2007). PyPy - Goals and Architecture Overview. Архів оригіналу за 30 червня 2012. Процитовано 11 лютого 2012.
  5. «It is a proper subset of Python, restricted in a way that enables easy analysis and efficient code generation», Ancona et al., 2007
  6. Cory Althoff (2016). The Self-Taught Programmer: The Definitive Guide to Programming Professionally. Triangle Connection. Архів оригіналу за 6 вересня 2021. Процитовано 21 вересня 2021.
  7. «It is a proper subset of Python, restricted in a way that enables easy analysis and efficient code generation», Ancona et al., 2007.
  8. Bolz, Carl; Cuni, Antonio; Fijalkowski, Maciej; Rigo, Armin. Tracing the Meta-Level: PyPy's Tracing JIT Compiler. ICOOOLPS '09. doi:10.1145/1565824.1565827.
  9. Timothy Balridge interview [Архівовано 3 березня 2016 у Wayback Machine.].
  10. Andrew Brown, Tutorial: Writing an Interpreter with PyPy, Part 1 [Архівовано 3 березня 2012 у Wayback Machine.], Part 2: Adding a JIT [Архівовано 3 березня 2012 у Wayback Machine.],
    Керівництво: пишемо інтерпретатор з JIT на PyPy (переклад) [Архівовано 8 лютого 2012 у Wayback Machine.],
    Репозиторій сирцевого коду [Архівовано 26 січня 2012 у Wayback Machine.]
    У статті описується реалізація Brainfuck на RPython
  11. [[https://web.archive.org/web/20121009143354/http://www.mail-archive.com/[email protected]/msg03946.html Архівовано 9 жовтня 2012 у Wayback Machine.] Re: [pypy-dev] pypy appears to have entirely removed all mention of javascript]
  12. а б PyPy :: Python compatibility. Архів оригіналу за 7 червня 2021. Процитовано 11 лютого 2012.

Література

  • Davide Ancona, Massimo Ancona, Antonio Cuni, Nicholas D. Matsakis, 2007. RPython: a Step Towards Reconciling Dynamically and Statically Typed OO Languages[недоступне посилання з лютого 2019]. 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.
  • Corbet, Jonathan (19 травня 2010). PyPy: the other new compiler project. LWN.net. Архів оригіналу за 26 травня 2012. Процитовано 11 лютого 2012.
  • Corbet, Jonathan (11 травня 2011). A brief experiment with PyPy. LWN.net. Архів оригіналу за 26 травня 2012. Процитовано 11 лютого 2012.
  • von Eitzen, Chris (21 листопада 2011). PyPy 1.7 widens the performance “sweet spot”. The H. Heinz Heise. Архів оригіналу за 17 лютого 2018. Процитовано 11 лютого 2012.
  • Rose, John (2 грудня 2011). A Day with PyPy. Oracle Corporation. Архів оригіналу за 26 травня 2012. Процитовано 11 лютого 2012.
  • Gaynor, Alex (12 серпня 2011). Quora is now running on PyPy. Quora. Архів оригіналу за 26 травня 2012. Процитовано 11 лютого 2012.

Посилання

  • Офіційний сайт
  • PyPy на Launchpad
  • Official status blog [Архівовано 11 лютого 2012 у Wayback Machine.]
  • PyPy nightly benchmark run [Архівовано 1 червня 2020 у Wayback Machine.]
  • Python in Python: The PyPy System [Архівовано 11 травня 2011 у Wayback Machine.] — technical talk by the designer of PyPy (video archive)
  • п
  • о
  • р
Реалізації
Вебфреймворк
IDE
Стандарт
Інше