PyPy — реалізація мови програмування Python, інтерпретатор та JIT-компілятор, написані на мові Python (використовується статично типізована підмножина RPython, Restricted Python). Проект має за мету швидкодію, ефективність та 100 % сумісність з класичною реалізацією Python на мові Сі — CPython.
Тип | інтерпретатор та компілятор (як набір інструментів) Python |
---|---|
Стабільний випуск | 5.9 (5 жовтня, 2017 ) |
Операційна система | крос-платформовий |
Мова програмування | Python |
Стан розробки | активний |
Ліцензія | MIT License |
Репозиторій | foss.heptapod.net/pypy/pypy |
Вебсайт | pypy.org |
Завдяки залученню 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. Також розробники вважають, що ця версія готова для використання в production.
У червні 2014 вийшла перша стабільна версія з підтримкою Python 3, гілка PyPy3 розвивається синхронно з PyPy і відрізняється підтримкою Python 3.
Цілі проекту ред.
PyPy був задуманий як реалізація Python написана на Python. Той факт, що PyPy реалізований на мові високого рівня робить його гнучкішим і дозволяє легше експериментувати з новими можливостями, ніж CPython, і легко визначити області, де він може бути поліпшений.
PyPy покликаний забезпечити єдиний механізм трансляції. Він підтримує фреймворк для реалізації динамічних мов програмування і здійснює чіткий поділ між специфікацією мови та її реалізацією.
Він також покликаний забезпечити сумісність, гнучкість і швидкість реалізації мови програмування Python і дозволяє реалізовувати нові можливості без необхідності програмування на мові низького рівня.
Трансляція ред.
PyPy складається з стандартного інтерпретатора і транслятора.
Інтерпретатор повністю реалізує мову Python, використовуючи обмежену підмножину мови, звану RPython (Restricted Python). На відміну від стандартного Python, RPython є статично типізованим для ефективнішої компіляції.
Транслятор є набором інструментів, який аналізує код RPython і переводить його в мови нижчого рівня, такі як C, байт-код Java або CIL. Він також підтримує спільні збирачі сміття і дозволяє опціонально включати Stackless. Також він включає JIT-компілятор для трансляції коду в машинні інструкції під час виконання програми.
RPython ред.
Сам інтерпретатор PyPy написаний у обмеженій підмножині Python під назвою RPython (обмежений Python). RPython накладає деякі обмеження на мову Python, так що тип змінної можна визначити під час компіляції.
Проект PyPy розробив ланцюжок інструментів, який аналізує код RPython і перетворює його у форму байтового коду, який можна опустити в C. Раніше крім C існували інші бекенди: Java, CSharp та Javascript, але ті, що постраждали від бітротів і були видалені. Таким чином, рекурсивний логотип PyPy — це змія, яка ковтає себе, оскільки RPython перекладається інтерпретатором Python. Код також можна запускати в неперекладеному вигляді для тестування та аналізу, що забезпечує хороший тестовий майданчик для дослідження динамічних мов.
Він дозволяє підключати збирачі сміття, а також додатково включати функції Stackless Python. Нарешті, він включає генератор JIT (just-in-time), який вбудовує компілятор just-in-time в інтерпретатор з огляду на кілька анотацій у вихідному коді інтерпретатора. Згенерований компілятор JIT є трасуванням JIT.
Тепер RPython також використовується для написання не-Python мовних реалізацій, таких як Pixie.
PyPy як засіб реалізації інтерпретаторів ред.
Компілятор мови RPython можна використовувати і для написання інтерпретаторів з інших мов програмування. Додавши в код такого інтерпретатора імпорт класу JitDriver і створення його примірник, а потім передавши в цей клас списки глобальних змінних, змінних і незмінних в ході виконання програми, а також зробивши ще кілька очевидних декларацій, ми, після трансляції з прапорцем -opt=jit:, отримуємо працюючий JIT-компілятор мови.
Підтримувані бекенди ред.
- C — трансляція коду RPython в C і запуск як рідної програми; це стандартний режим роботи;
- CIL — Common Intermediate Language;
- JVM — віртуальна машина Java;
- Python — транслятор PyPy також може бути запущений в інтерпретаторі Python, хоча швидкість роботи буде вкрай низькою; ця можливість корисна для зневадження.
Станом на 2010, PyPy відмовився від JavaScript як бекенду.
Сумісність з CPython ред.
Версія 1.4 сумісна з версією Python 2.5 і може працювати на 32-х і 64-х бітних платформах. PyPy повністю підтримує модулі написані на чистому Python. Для використання бінарних (.so і .pyd) розширень PyPy має початкову підтримку API CPython у вигляді окремого модуля cpyext. Для нормальної роботи цих розширень потрібно їх перекомпіляція.
Відомо, що такі бібліотеки і фреймворки можуть працювати в PyPy:
Виноски ред.
- . Архів оригіналу за 2 квітня 2012. Процитовано 11 лютого 2012.
- . Архів оригіналу за 9 березня 2012. Процитовано 11 лютого 2012.
- Первый стабильный выпуск PyPy3 с поддержкой Python 3 [ 23 червня 2014 у Wayback Machine.] // opennet.ru 21.06.2014
- Samuele Pedroni (March 2007). PyPy - Goals and Architecture Overview. Архів оригіналу за 30 червня 2012. Процитовано 11 лютого 2012.
- «It is a proper subset of Python, restricted in a way that enables easy analysis and efficient code generation», Ancona et al., 2007
- Cory Althoff (2016). . Triangle Connection. Архів оригіналу за 6 вересня 2021. Процитовано 21 вересня 2021.
- «It is a proper subset of Python, restricted in a way that enables easy analysis and efficient code generation», Ancona et al., 2007.
- Bolz, Carl; Cuni, Antonio; Fijalkowski, Maciej; Rigo, Armin. Tracing the Meta-Level: PyPy's Tracing JIT Compiler ICOOOLPS '09. doi:10.1145/1565824.1565827.
- Timothy Balridge interview [ 3 березня 2016 у Wayback Machine.].
- 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 - [[https://web.archive.org/web/20121009143354/http://www.mail-archive.com/pypy-dev@codespeak.net/msg03946.html Архівовано 9 жовтня 2012 у Wayback Machine.] Re: [pypy-dev] pypy appears to have entirely removed all mention of javascript]
- ↑ . Архів оригіналу за 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. . 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). . 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)