Bedste svar
CPython er referenceimplementeringen af Python skrevet på C-programmeringssproget. Der er en række andre implementeringer, endda inklusive nogle andre i C. Men CPython er den mest anvendte, og den mod alle andre sammenlignes.
Python er en sprogspecifikation. Hvis man refererer til implementeringsdetaljer med angivelse af en bestemt implementering, er den rimelige antagelse, at det refererer til CPython-versionen.
Du kan søge efter implementeringer, men resultaterne er sandsynligvis noget forvirrende. Ikke alle implementeringer er komplette, og de kører heller ikke på “normale” systemer eller i konventionelle programudførelsesmiljøer (såsom et terminalvindue eller en tekstkonsol).
For eksempel MicroPython er et afskåret derivat fra CPython, der er målrettet mod mikrocontrollere. Jython er skrevet på Java og kører i JVM (Java Virtual Machine) og indeholder funktioner til import af native Java og interoperation med det (inklusive introspektion). IronPython er skrevet i Microsofts C # og er målrettet til at køre inden for CLR (Common Language Runtime) i .NET-rammen. PyPy er en version af Python, som for det meste er skrevet i Python, men viklet rundt om en kerne, der implementerer en begrænset delmængde af sproget og giver JIT (Just-In- Tid dymanisk / runtime kompilering). (Denne delmængde hedder RPython og er beregnet til at understøtte mere end bare Python).
Se hvad jeg mener om forvirrende?
Der er mindst to forskellige implementeringer af Python, som er skrevet i JavaScript og designet til at køre fra en normal browser (i DOM… eller Documenr Objektmodel … miljø). Det er Brython og Skulpt . Derudover er der flere forskellige “transpilere” eller Python til Javascript-compilere inklusive Transcrypt, og pyjs – (formelt pyjamas) og måske endda RapydScript (selvom det mere ligner en hybrid af Python med JS).
Som du kan se , hvis du dykker dybt nok ind i emnet, bliver det stadig sværere at kategorisere forskellige projekter og værktøjer som “implementeringer.”
For eksempel er der Cython som er et værktøj til at tage specielt kommenteret Python-lignende kode og kompilere den i indlæselige (binære / indfødte) moduler, som kan importeres til Python og bruges som enhver anden naturlig kompileret udvidelse til tolken. Det betragtes ikke rigtig som en “implementering” af Python så meget som et værktøj til optimering af udvalgte uddrag af Python-kode til binære udvidelser til CPython-interpeteren. (Hvis du arbejdede i Jython, kunne du omskrive dele af din kode i Java og bruge Jythons interoperations- og introspektionsfunktioner til at bruge denne kode. Bare analogt).
Der er også Numba , som er et værktøj til transparent kompilering af en undersæt af Python og NumPy -kode til LLVM og integrering af LLVM-runtime-support i Python-fortolkerens kørende motor. Dette beskrives mere som en JIT end Cythons karakteristiske modul / udvidelsesparadigme. Det er stadig mere af et værktøj end en “implementering” af hele sproget.
Men så, hvis du ser på Nuitka ser du en ambitiøst projekt til at kompilere hele Python-programmer. Så det kan være mere en implementering.
Endnu et andet projekt (som synes at være et, som Guido van Rossum, skaberen af Python, har arbejdet med) er mypy – Python med valgfri statisk indtastning og lokal lokal inferens. Dette ville ikke være en ny implementering. Det ser ud til at være en slags frontend, der behandler Python (med valgfri typebetegnelser) og forbinder den (ikke-bemærkede) Python tilbage til CPython runtime-motoren (tolk).
Hvis du vil dykke ned i endnu flere implementeringer og links ser på: PythonImplementations – Python Wiki .
Bemærk! Jeg har dækket mange af dem her og forsøgt at forklare, hvordan de vedrører i så høj grad. Denne wiki-side er mere en grabbag med mindre redegørelse og et par links til døde eller ikke-vedligeholdte projekter.
Svar
Selv jeg havde det samme problem med at forstå, hvordan det er med CPython, JPython , IronPython, PyPy er forskellige fra hinanden.
Så jeg er villig til at rydde tre ting, før jeg begynder at forklare:
- Python : Det er et sprog, det angiver / beskriver kun, hvordan man formidler / udtrykker sig til tolken (programmet, der accepterer din python-kode).
- Implementering : Det handler om, hvordan tolken blev skrevet, specifikt i hvilket sprog og hvad det ender med at gøre .
- Bytecode : Det er koden, der behandles af et program, der normalt kaldes en virtuel maskine snarere end af den “rigtige” computermaskine, hardwareprocessoren.
CPython er implementeringen, som blev skrevet på C-sprog. Det ender med at producere bytecode (stack-machine based instruction set), der er Python-specifikt og derefter udfører det. Årsagen til at konvertere Python-kode til en bytecode er, at det er lettere at implementere en tolk, hvis det ligner maskininstruktioner. Men det er ikke nødvendigt at producere noget bytecode inden udførelse (men CPython producerer ikke).
Hvis du vil se på CPython “s bytecode, kan du. Her 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
Lad os nu se på ovenstående kode. Linje 1 til 6 er en funktionsdefinition. I linje 8 importerer vi “dis” -modulet, som kan bruges til at se den mellemliggende Python-bytecode (eller du kan sige, disassembler for Python-bytecode), der genereres af CPython (tolk).
BEMÆRK : Jeg fik linket til denne kode fra #python IRC-kanal: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c
Og så er der Jython, som er skrevet i Java og ender med at producere Java-byte-kode. Java-byte-koden kører på Java Runtime Environment, som er en implementering af Java Virtual Machine (JVM). Hvis dette er forvirrende, formoder jeg, at du ikke har nogen anelse om, hvordan Java fungerer. I lægmandssprog tages Java (sproget, ikke compileren) -koden af Java-compileren og udsender en fil (som er Java-byte-kode), der kun kan køres ved hjælp af en JRE. Dette gøres, så når Java-koden er kompileret, kan den overføres til andre maskiner i Java-byte-kodeformat, som kun kan køres af JRE. Hvis dette stadig er forvirrende, kan du måske se på denne webside .
Her kan du spørge, om CPython ” s bytecode er bærbar som Jython, formoder jeg ikke. bytecode produceret i CPython-implementering var specifikt for denne tolk for at gøre det let for yderligere udførelse af kode (jeg har også mistanke om, at sådan mellemproduktion af bytecode bare for at gøre det let at behandle det sker i mange andre tolke. Hvis du nu undrer dig over, hvordan er det let at køre bytecode som vist ovenfor i koden (efter linje 9 til slutningen ), så tænk på dette. Vi har en stak (datastruktur), og hver linje i bytekoden udfører en stakoperation, der ændrer stakken i overensstemmelse hermed. Denne modificerede stak bruges af CPython (tolken) til at producere den endelige output af koden .
Så når du kompilerer din Python-kode i Jython, ender du med Java-byte-kode, som kan køres på en JVM.
Tilsvarende IronPyt hon (skrevet på C # sprog) kompilerer din Python-kode til Common Language Runtime (CLR), som er en lignende teknologi sammenlignet med JVM, udviklet af Microsoft.