Навіть у мене була однакова проблема розуміння того, чим CPython, JPython, IronPython, PyPy відрізняються один від одного.
Отже, я готовий очистити три речі, перш ніж почати пояснювати:
- Пітон : Це мова, вона лише констатує / описує, як передати / виразити себе інтерпретатору (програма, яка приймає ваш код python).
- Впровадження : Це все про те, як письмово було написано перекладачем, якою мовою та чим він закінчується .
- Байт-код : це код, який обробляється програмою, зазвичай називається віртуальною машиною, а не "справжньою" комп'ютерною машиною, апаратним процесором.
CPython - це реалізація, яка була написана мовою С. Це в кінцевому підсумку створює байт-код (набір команд на основі стека), який є специфічним для Python, а потім виконує його. Причина перетворення Python-коду в байт-код полягає в тому, що простіше втілити інтерпретатор, якщо це схоже на машинні інструкції. Але перед виконанням Python-коду не потрібно створювати деякий байт-код (але CPython справді виробляє).
Якщо ви хочете переглянути байт-код CPython, ви можете. Ось як можна:
>>> def f(x, y): # line 1
... print("Hello") # line 2
... if x: # line 3
... y += x # line 4
... print(x, y) # line 5
... return x+y # line 6
... # line 7
>>> import dis # line 8
>>> dis.dis(f) # line 9
2 0 LOAD_GLOBAL 0 (print)
2 LOAD_CONST 1 ('Hello')
4 CALL_FUNCTION 1
6 POP_TOP
3 8 LOAD_FAST 0 (x)
10 POP_JUMP_IF_FALSE 20
4 12 LOAD_FAST 1 (y)
14 LOAD_FAST 0 (x)
16 INPLACE_ADD
18 STORE_FAST 1 (y)
5 >> 20 LOAD_GLOBAL 0 (print)
22 LOAD_FAST 0 (x)
24 LOAD_FAST 1 (y)
26 CALL_FUNCTION 2
28 POP_TOP
6 30 LOAD_FAST 0 (x)
32 LOAD_FAST 1 (y)
34 BINARY_ADD
36 RETURN_VALUE
Тепер давайте розглянемо вищевказаний код. Рядки 1 - 6 - це визначення функції. У рядку 8 ми імпортуємо модуль 'dis', який можна використовувати для перегляду проміжного байт-коду Python (або, можна сказати, розбиральника для байтового коду Python), що генерується CPython (інтерпретатором).
ПРИМІТКА . Я отримав посилання на цей код з каналу #python IRC: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c
І тоді, є Jython, який написаний на Java і в кінцевому підсумку виробляє байт-код Java. Байт-код Java працює в середовищі виконання Java Java, що є реалізацією віртуальної машини Java (JVM). Якщо це заплутано, я підозрюю, що ви не маєте поняття, як працює Java. По-простому, код Java (мова, а не компілятор) приймається компілятором Java і видає файл (який є байт-кодом Java), який можна запустити лише за допомогою JRE. Це робиться для того, що після компіляції коду Java він може бути перенесений на інші машини у форматі байтового коду Java, який може працювати тільки JRE. Якщо це все ще заплутано, можливо, ви захочете переглянути цю веб-сторінку .
Тут ви можете запитати, чи байт-код CPython такий портативний, як Jython, я підозрюю, що ні. TheБайткод проводиться в реалізації CPython був спеціально для цього перекладачем , що робить його легким для подальшого виконання коду (я підозрюю , що таке проміжне виробництво байткод, просто для зручності обробки робиться в багатьох інших перекладачів).
Так, у Jython, коли ви компілюєте свій код Python, ви отримуєте байт-код Java, який можна запустити на JVM.
Аналогічно, IronPython (написаний мовою C #) збирає ваш код Python до загальної мови виконання (CLR), що є аналогічною технологією порівняно з JVM, розробленою Microsoft.