"PyPy - це повторне втілення Python в Python" - це досить оманливий спосіб описати PyPy, IMHO, хоча технічно це правда.
Є дві основні частини PyPy.
- Рамка перекладу
- Перекладач
Рамка перекладу - це компілятор. Він компілює RPython код до C (або інших цілей), автоматично додаючи такі аспекти, як збирання сміття та компілятор JIT. Він не може обробляти довільний код Python, лише RPython.
RPython - це підмножина нормального Python; весь код RPython - це код Python, але не навпаки. Не існує офіційного визначення RPython, тому що RPython є в основному лише "підмножиною Python, яка може бути перекладена рамками перекладу PyPy". Але для того, щоб перекласти, код RPython повинен бути статично введений (типи зроблені, ви не оголошуєте їх, але це все одно строго одного типу на змінну), і ви не можете робити такі речі, як оголошення / модифікація функцій / заняття під час виконання.
Тоді інтерпретатор - це звичайний перекладач Python, написаний RPython.
Оскільки код RPython є звичайним кодом Python, ви можете запустити його на будь-якому інтерпретаторі Python. Але жодна з претензій на швидкість PyPy не приводить її до запуску; це лише для швидкого циклу тестування, оскільки переклад перекладача займає а багато часу.
З огляду на це, слід відразу зрозуміти, що спекуляції щодо PyPyPy або PyPyPyPy насправді не мають жодного сенсу. У вас є перекладач, написаний на RPython. Ви перекладаєте його в код C, який швидко виконує Python. Там процес зупиняється; більше немає RPython для прискорення, обробляючи його знову.
Тож "Як можливо PyPy бути швидшим за CPython" також стає досить очевидним. PyPy має кращу реалізацію, включаючи компілятор JIT (я вважаю, що це, звичайно, не так швидко без компілятора JIT, що означає, що PyPy є швидшим лише для програм, сприйнятливих до компіляції JIT). CPython ніколи не був розроблений таким чином, щоб оптимізувати реалізацію мови Python (хоча вони намагаються зробити це оптимізованою реалізацією, якщо слідувати різниці).
Дійсно інноваційний біт проекту PyPy полягає в тому, що вони не пишуть вручну складні схеми GC або компілятори JIT. Вони пишуть інтерпретатора порівняно прямо в RPython, і для всіх RPython є нижчим рівнем, ніж Python, це все ще об'єктно-орієнтована зібрана сміття мова, набагато більш високий рівень, ніж C. Тоді рамки перекладу автоматично додає такі речі, як GC та JIT. Тож рамки перекладу величезнізусилля, але це однаково добре застосовується до інтерпретатора PyPy python, проте вони змінюють свою реалізацію, дозволяючи набагато більше свободи в експерименті для підвищення продуктивності (не турбуючись про введення помилок GC чи оновлення компілятора JIT, щоб впоратися зі змінами). Це також означає, що коли вони обійдуться реалізацією інтерпретатора Python3, він автоматично отримає ті самі переваги. І будь-які інші перекладачі, написані в рамках PyPy (яких на різних етапах польської мови існує кількість). І всі інтерпретатори, що використовують рамку PyPy, автоматично підтримують усі платформи, підтримувані рамкою.
Отже, справжня перевага проекту PyPy полягає в тому, щоб максимально відокремити всі частини впровадження ефективного платформового незалежного інтерпретатора для динамічної мови. А потім придумайте одну хорошу реалізацію їх в одному місці, яку можна повторно використовувати у багатьох перекладачів. Це не відразу виграш, як "моя програма Python зараз працює швидше", але це велика перспектива на майбутнє.
І вона може запустити вашу програму Python швидше (можливо).