Legjobb válasz
A CPython a Python C programozási nyelven írt referencia-megvalósítása. Számos más megvalósítás létezik, köztük néhány más is a C-ben. De a CPython a legszélesebb körben használt, és összehasonlítják az összes többi verzióval.
A Python egy nyelvi specifikáció. Ha valaki a megvalósítás részleteire hivatkozik egy adott megvalósítás megadásával, akkor az ésszerű feltételezés az lesz, hogy a CPython verzióra vonatkozik.
Kereshet megvalósításokat, de az eredmények valószínűleg kissé zavaróak. Nem minden megvalósítás fejeződik be, és nem is futnak „normál” rendszereken vagy hagyományos programfuttatási környezetekben (például terminálablakban vagy szöveges konzolban).
Például A MicroPython a CPython levágott származéka, amely a mikrovezérlőket célozza meg. A Jython Java-ban íródott, és a JVM-ben (Java Virtual Machine) fut, és tartalmaz funkciókat a natív Java importálásához és a vele való együttműködéshez (beleértve az önellenőrzést is). Az IronPython a Microsoft C # -jába van írva, és a .NET-keretrendszer CLR-jén (Common Language Runtime) futni célzott. A PyPy a Python egyik változata, amelyet többnyire Python-ban írnak, de egy olyan mag köré tekerve, amely a nyelv korlátozott részhalmazát valósítja meg és JIT (Just-In- Időméretű / futásidejű összeállítás). (Ez az alkészlet RPython nevet viseli, és nem csupán a Python-ot hivatott támogatni).
Látja, mire gondolok a zavaros? >
A Pythonnak legalább két különböző megvalósítása létezik, amelyek JavaScript-be vannak írva és egy normál böngészőből (a DOM-ban vagy a Documenr-ben) történő futtatásra készültek. Object Model… környezet). Ezek Brython és Skulpt . Ezenkívül számos különböző „transzpiler” vagy Python – Javascript fordító létezik, beleértve a Transcrypt, és a pyjs – (formálisan pizsama) és talán még a RapydScript (bár ez inkább hasonlít a Python és a JS hibridjére).
Amint láthatja , ha eléggé elmélyül a témában, egyre nehezebb a különböző projekteket és eszközöket „megvalósításként” kategorizálni.
Van még Numba , amely egy eszköz a Python és NumPy kód részhalmazának átlátható összeállításához LLVM és integrálja az LLVM futásidejű támogatást a Python tolmács futó motorjába. Ezt inkább JIT-nek írják le, mint Cython megkülönböztető modul / kiterjesztés paradigmáját. Ennek ellenére ez inkább eszköz, mint az egész nyelv „megvalósítása”.
De ha megnézi a Nuitka oldalt, akkor egy ambiciózus projekt teljes Python programok összeállítására. Tehát ez inkább megvalósítás lehet.
Egy másik projekt (amely úgy tűnik, hogy Guido van Rossum, a Python készítője dolgozott) mypy – Python opcionális statikus gépeléssel és néhány helyi típusú következtetéssel. Ez nem lenne új megvalósítás. Úgy tűnik, hogy ez egyfajta kezelőfelület, amely feldolgozza a Pythont (opcionális típusjegyzetekkel), és visszarendezi a (nem jegyzett) Pythont a CPython futásidejű motorjába (tolmács).
Ha még több megvalósításba akar merülni. és a linkek a következőket nézik meg: PythonImplementations – Python Wiki .
Megjegyzés: ezek közül sokakat ismertettem, és megpróbáltam elmagyarázni, hogy ezek hogyan kapcsolódnak egymáshoz. olyan mértékben. Ez a wiki oldal inkább ragadós táska, kevesebb kiállítással és néhány linkkel a holt vagy nem karbantartott projektekre.
Válasz
Még nekem is ugyanaz volt a problémám, hogy megértsem a CPython, a JPython helyzetét. , Az IronPython és a PyPy különböznek egymástól.
Tehát hajlandó vagyok három dolgot tisztázni, mielőtt elmagyaráznám:
- Python : Ez egy nyelv, csak azt írja le / írja le, hogyan kell közvetíteni / kifejezni magad az értelmezőnek (a program, amely elfogadja a python kódodat).
- Végrehajtás : Minden arról szól, hogyan írták a tolmácsot, konkrétan milyen nyelv és mire készül .
- Bytecode : Ezt a kódot egy program dolgozza fel, amelyet általában virtuális gépnek neveznek, nem pedig az “igazi” számítógépes gép, a hardver processzor.
A CPython a megvalósítás, amelyet C nyelven írtak. Végül a Python-specifikus bytecode-ot (verem-gép alapú utasításkészlet) állítja elő, majd végrehajtja. A Python kód bájtkóddá konvertálásának oka az, hogy egyszerűbb egy tolmács implementálása, ha úgy néz ki, mint a gépi utasítások. De a végrehajtás előtt nem szükséges néhány bájtkódot előállítani (de a CPython mégis produkál).
Ha meg akarja tekinteni a CPython bájtkódját, akkor megteheti. Így teheti meg:
>>> 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
Most nézzük meg a fenti kódot. Az 1–6. Sor függvénydefiníció. A 8. sorban importáljuk a “dis” modult, amellyel megtekinthető a köztes Python bytecode (vagy mondhatjuk, disassembler for Python bytecode), amelyet a CPython (tolmács) generál.
MEGJEGYZÉS : A kódra mutató linket a #python IRC csatornáról kaptam: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c
És akkor itt van a Jython, amelyet Java-ban írunk, és végül Java bájtkódot állít elő. A Java bájtkód a Java Runtime Environment rendszeren fut, amely a Java Virtual Machine (JVM) megvalósítása. Ha ez zavaró, akkor gyanítom, hogy fogalma sincs a Java működéséről. A laikusok szempontjából a Java (a nyelv, nem a fordító) kódot a Java fordító veszi, és egy fájlt (amely Java bájtkód) ad ki, amelyet csak JRE segítségével lehet futtatni. Ez úgy történik, hogy amint a Java kód össze van állítva, akkor azt más bájtkód formátumban is át lehet vinni más gépekre, amelyeket csak a JRE futtathat. Ha ez továbbra is zavaró, érdemes megnéznie ezt az weboldalt .
Itt megkérdezheti, hogy a CPython ” s a bytecode hordozható, mint a Jython, gyanítom, hogy nem. A bytecode, amelyet a CPython implementációban készítettek, az adott tolmácsra volt jellemző, hogy megkönnyítse a kód további végrehajtását (én is gyanítom, hogy egy ilyen köztes bytecode előállítás csak a feldolgozás megkönnyítése érdekében sok más tolmácsban történik.) Ha most arra kíváncsi, hogyan egyszerű futtatni a bytecode-ot a fenti kódban látható módon (a 9. sor után a végéig) ), akkor gondolj erre: Van egy verem (adatstruktúra), és a bytecode minden sora végez valamilyen veremműveletet, ennek megfelelően módosítva a veremét. Ezt a módosított veremet a CPython (az értelmező) használja a kód végső kimenetének előállítására. .
Tehát a Jythonban, amikor lefordítja a Python-kódot, a Java bájtkódja lesz, amelyet egy JVM-en futtathat.
Hasonlóképpen, az IronPyt A hon (C # nyelven írva) lefordítja a Python kódodat Common Language Runtime (CLR) fájlba, amely hasonló technológia, mint a Microsoft által kifejlesztett JVM.