Bästa svaret
CPython är referensimplementeringen av Python skriven i C-programmeringsspråket. Det finns ett antal andra implementeringar, även några andra i C. Men CPython är den mest använda och den mot alla andra jämförs.
Python är en språkspecifikation. Om man hänvisar till implementeringsdetaljer med specifik specifik implementering är det rimliga antagandet att det hänvisar till CPython-versionen.
Du kan söka efter implementeringar, men resultaten är sannolikt något förvirrande. Inte alla implementeringar är färdiga, och de kör inte heller på ”normala” system eller i konventionella programkörningsmiljöer (t.ex. ett terminalfönster eller textkonsol).
Till exempel MicroPython är ett nedklippt derivat från CPython som riktar sig till mikrokontroller. Jython är skriven i Java och körs i JVM (Java Virtual Machine) och innehåller funktioner för att importera inbyggt Java och interoperera med det (inklusive introspektion). IronPython är skrivet i Microsofts C # och riktat till att köras inom CLR (Common Language Runtime) i .NET-ramverket. PyPy är en version av Python som mestadels är skriven i Python, men lindad runt en kärna som implementerar en begränsad delmängd av språket och ger JIT (Just-In- Time dymanic / runtime compilation). (Den delmängden heter RPython och är avsedd att stödja mer än bara Python).
Ser du vad jag menar med att förvirra?
Det finns minst två olika implementeringar av Python som är skrivna i JavaScript och är utformade för att köras från en vanlig webbläsare (i DOM … eller Documenr Objektmodell … miljö). Det är Brython och Skulpt . Dessutom finns det flera olika “transpilers” eller Python till Javascript-kompilatorer inklusive Transcrypt, och pyjs – (formellt pyjamas) och kanske till och med RapydScript (men det är mer som en hybrid av Python med JS).
Som du kan se , om du gräver tillräckligt djupt in i ämnet blir det allt svårare att kategorisera olika projekt och verktyg som ”implementeringar.”
Till exempel finns det Cython vilket är ett verktyg för att ta speciellt kommenterad Python-liknande kod och kompilera den i laddningsbara (binära / inbyggda) moduler som kan importeras till Python och användas som alla andra inbyggda tillägg till tolk. Det anses egentligen inte vara en ”implementering” av Python så mycket som ett verktyg för att optimera utvalda utdrag av Python-kod till binära tillägg till CPython-interpeteren. (Om du arbetade i Jython kunde du skriva om delar av din kod i Java och använda Jythons interoperations- och introspektionsfunktioner för att använda den koden. Bara analogt).
Det finns också Numba som är ett verktyg för att transparent sammanställa en delmängd av Python och NumPy -kod till LLVM och integrering av LLVM-körtidsstöd i Python-tolkarens pågående motor. Detta beskrivs som mer som en JIT än Cythons distinkta modul / tilläggsparadigm. Ändå är det mer ett verktyg än en ”implementering” av hela språket.
Men om du tittar på Nuitka ser du en ambitiöst projekt för att sammanställa hela Python-program. Så det kan vara mer av en implementering.
Ännu ett projekt (som verkar vara ett som Guido van Rossum, skaparen av Python, har arbetat med) är mypy – Python med valfri statisk typning och viss lokal typslutledning. Detta skulle inte vara en ny implementering. Det verkar vara en typ av frontend som bearbetar Python (med valfria typkommentarer) och passerar den (obemannade) Python tillbaka till CPython runtime-motorn (tolk).
Om du vill dyka in i ännu fler implementeringar och länkar tittar på: PythonImplementations – Python Wiki .
Obs! Jag har täckt många av dem här och försökt förklara hur de relaterar i så hög grad. Den wiki-sidan är mer en greppväska, med mindre exponering och några länkar till döda eller omhändertagna projekt.
Svar
Även jag hade samma problem med att förstå hur det går med CPython, JPython , IronPython, PyPy skiljer sig från varandra.
Så jag är villig att rensa tre saker innan jag börjar förklara:
- Python : Det är ett språk, det anger / beskriver bara hur man förmedlar / uttrycker sig till tolk (programmet som accepterar din pythonkod).
- Implementering : Det handlar om hur tolkarna skrevs, specifikt i vilket språk och vad det slutar göra .
- Bytecode : Det är koden som bearbetas av ett program, vanligtvis kallad en virtuell maskin, snarare än av den ”riktiga” datormaskinen, hårdvaruprocessorn.
CPython är implementeringen, som skrevs på C-språk. Det slutar med att producera bytecode (stack-machine based instruction set) som är Python-specifik och sedan kör den. Anledningen till att konvertera Python-kod till en bytkod är att det är lättare att implementera en tolk om det ser ut som maskininstruktioner. Men det är inte nödvändigt att producera lite bytkod före körning (men CPython producerar inte).
Om du vill titta på bytkod för CPython så kan du. Så här kan du:
>>> 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
Låt oss nu titta på koden ovan. Rad 1 till 6 är en funktionsdefinition. I rad 8 importerar vi ”dis” -modulen som kan användas för att visa den mellanliggande Python-bytecoden (eller så kan du säga disassembler för Python bytecode) som genereras av CPython (tolk).
OBS : Jag fick länken till den här koden från #python IRC-kanal: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c
Och sedan finns Jython, som är skriven i Java och slutar producera Java-byte-kod. Java-byte-koden körs på Java Runtime Environment, som är en implementering av Java Virtual Machine (JVM). Om det här är förvirrande tror jag att du inte har någon aning om hur Java fungerar. När det gäller lekman tas Java (språket, inte kompilatorn) -koden av Java-kompilatorn och matar ut en fil (som är Java-byte-kod) som endast kan köras med en JRE. Detta görs så att när Java-koden har kompilerats kan den överföras till andra maskiner i Java-byte-kodformat, som bara kan köras av JRE. Om detta fortfarande är förvirrande kanske du vill titta på den här webbsidan .
Här kan du fråga om CPython ” s bytecode är bärbar som Jython, jag misstänker inte. bytecode som producerades i CPython-implementeringen var specifik för den tolk för att göra det enkelt för vidare körning av kod misstänker att sådan mellanproduktion av bytekod, bara för att det är enkelt att bearbeta det i många andra tolkar. Om du nu undrar hur det är enkelt att köra bytekoden som visas ovan i koden (efter rad 9 till slutet ), tänk då på detta. Vi har en stack (datastruktur) och varje rad i bytkoden gör någon stackoperation som modifierar stacken i enlighet med detta. Denna modifierade stack används av CPython (tolk) för att producera den slutliga utgången av koden .
Så, i Jython, när du kompilerar din Python-kod, slutar du med Java-byte-kod, som kan köras på en JVM.
På samma sätt IronPyt hon (skrivet i C # -språk) sammanställer din Python-kod till Common Language Runtime (CLR), vilket är en liknande teknik jämfört med JVM, utvecklad av Microsoft.