Nejlepší odpověď
CPython je referenční implementace Pythonu napsaná v programovacím jazyce C. Existuje celá řada dalších implementací, včetně některých dalších v C. Ale CPython je nejpoužívanější a porovnává se se všemi ostatními.
Python je jazyková specifikace. Odkazuje-li se na podrobnosti implementace se specifikováním konkrétní implementace, pak lze rozumně předpokládat, že jde o verzi CPython.
Můžete hledat implementace, ale výsledky budou pravděpodobně poněkud matoucí. Ne všechny implementace jsou kompletní, ani ne všechny běží na „normálních“ systémech nebo v konvenčních prostředích pro provádění programů (například v terminálovém okně nebo textové konzole).
Například MicroPython je zkrácená derivace z CPython, která je zaměřena na mikrořadiče. Jython je napsán v Javě a běží v JVM (Java Virtual Machine) a obsahuje funkce pro import nativní Javy a její spolupráci (včetně introspekce). IronPython je napsán v C # společnosti Microsoft a je zaměřen na spuštění v rámci CLR (Common Language Runtime) rozhraní .NET. PyPy je verze Pythonu, která je většinou napsána v Pythonu, ale je obklopena jádrem, které implementuje omezenou podmnožinu jazyka a poskytuje JIT (Just-In- Time dymanic / runtime compilation). (Tato podmnožina se jmenuje RPython a je určena k podpoře více než jen Pythonu.)
Podívejte se, co mám na mysli zmatením?
Existují alespoň dvě různé implementace Pythonu, které jsou napsány v JavaScriptu a jsou navrženy tak, aby se spouštěly z normálního prohlížeče (v DOM… nebo Documenr Objektový model… prostředí). Jedná se o Brython a Skulpt . Kromě toho existuje několik různých překladačů nebo překladačů jazyka Python to Javascript, včetně Transcrypt, a pyjs – (formálně pyžamo) a možná i RapydScript (i když je to spíš hybrid Pythonu s JS).
Jak vidíte , pokud se do tématu ponoříte dostatečně hluboko, bude stále obtížnější kategorizovat různé projekty a nástroje jako „implementace“.
Například existuje Cython což je nástroj k převzetí speciálně anotovaného kódu podobného Pythonu a jeho kompilaci do načtitelných (binárních / nativních) modulů, které lze importovat do Pythonu a použít jako jakékoli jiné nativně zkompilované rozšíření tlumočníka. Opravdu se to nepovažuje za „implementaci“ Pythonu, spíše než za nástroj pro optimalizaci vybraných úryvků kódu Pythonu do binárních rozšíření interpeteru CPython. (Pokud jste pracovali v Jythonu, mohli byste přepsat části svého kódu v Javě a použít k použití tohoto kódu funkce spolupráce a introspekce Jythonu. Jen pro analogii.)
Existuje také Numba , což je nástroj pro transparentní kompilaci podmnožiny Pythonu a NumPy kódu do LLVM a integrace podpory běhu LLVM do běžícího enginu interpreta Pythonu. Toto je popsáno jako spíš JIT než charakteristické paradigma Cythonova modulu / rozšíření. Stále je to spíše nástroj než „implementace“ celého jazyka.
Ale když se podíváte na Nuitka , uvidíte ambiciózní projekt na kompilaci celých programů Pythonu. Může to tedy být spíše implementace.
Ještě dalším projektem (na kterém se podle všeho pracuje Guido van Rossum, tvůrce Pythonu) je mypy – Python s volitelným statickým psaním a odvozením lokálního typu. To by nebyla nová implementace. Zdá se, že jde o jakýsi frontend, který zpracovává Python (s volitelnými anotacemi typu) a paassuje (bez poznámek) Python zpět do runtime modulu CPython (interpret).
Pokud se chcete ponořit do ještě více implementací a odkazy se dívají na: PythonImplementations – Python Wiki .
Poznámka: Pokryl jsem zde mnoho z nich a pokusil jsem se vysvětlit, jak souvisí do té míry. Tato wiki stránka je spíš drapákem, s menší expozicí a několika odkazy na mrtvé nebo neudržované projekty.
Odpověď
I já jsem měl stejný problém pochopit, jak jsou CPython, JPython „IronPython a PyPy se navzájem liší.
Takže jsem ochoten vyjasnit tři věci, než začnu vysvětlovat:
- Python : Je to jazyk, pouze uvádí / popisuje, jak se vyjádřit / vyjádřit tlumočníkovi (programu, který přijímá váš kód v Pythonu).
- Implementace : Jde o to, jak byl tlumočník napsán, konkrétně v jaký jazyk a co to nakonec udělá .
- Bytecode : Je to kód, který je zpracováván programem, obvykle označovaným jako virtuální stroj, spíše než „skutečným“ počítačovým strojem, hardwarovým procesorem.
CPython je implementace, která byla napsána v jazyce C. Nakonec produkuje bytecode (sada instrukcí založená na stroji), který je specifický pro Python, a poté jej provede. Důvod převodu kódu Pythonu na bytecode je ten, že je snazší implementovat tlumočníka, pokud to vypadá jako strojové instrukce. Není však nutné před provedením nějaký bytecode vyrobit (ale CPython to produkuje).
Pokud se chcete podívat na bytecode CPython, pak můžete. Zde je návod, jak můžete:
>>> 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)
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
Nyní se podívejme na výše uvedený kód. Řádky 1 až 6 jsou definicí funkce. V řádku 8 importujeme modul „dis“, který lze použít k zobrazení přechodného bajtkódu Pythonu (nebo můžete říci, disassembleru pro bajtkód Pythonu), který je generován CPythonem (tlumočník).
POZNÁMKA : Odkaz na tento kód jsem získal z #python IRC kanálu: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c
A pak je tu Jython, který je napsán v Javě a nakonec produkuje bajtový kód Java. Bajtový kód Java běží na prostředí Java Runtime Environment, což je implementace Java Virtual Machine (JVM). Pokud je to matoucí, pak mám podezření, že nemáte ponětí, jak Java funguje. Laicky řečeno, kód Java (jazyk, nikoli překladač) je převzat kompilátorem Java a vydává soubor (což je bajtový kód Java), který lze spustit pouze pomocí JRE. To se provádí tak, že jakmile je kód Java zkompilován, lze jej přenést na jiné stroje ve formátu Java byte code, který může spustit pouze JRE. Pokud je to stále matoucí, můžete se podívat na tuto webovou stránku .
Zde se můžete zeptat, zda CPython “ s bytecode je přenosný jako Jython, domnívám se, že ne. bytecode vytvořený v implementaci CPython byl specifický pro tohoto tlumočníka, aby usnadnil další provádění kódu (také máte podezření, že taková přechodná výroba bajtových kódů se pro snadnost zpracování provádí u mnoha dalších tlumočníků.) Pokud se nyní ptáte, jak je snadné spustit bajtkód tak, jak je uvedeno výše v kódu (po řádku 9 až do konce ), pak o tom přemýšlejte. Máme zásobník (datovou strukturu) a každý řádek v bytecode provádí nějakou operaci zásobníku, která odpovídajícím způsobem upravuje zásobník. Tento upravený zásobník používá CPython (tlumočník) k vytvoření konečného výstupu kódu .
Takže v Jythonu při kompilaci kódu Pythonu skončíte s bajtovým kódem Java, který lze spustit na JVM.
Podobně IronPyt hon (napsaný v jazyce C #) kompiluje váš kód v Pythonu na Common Language Runtime (CLR), což je podobná technologie ve srovnání s JVM vyvinutou společností Microsoft.