Beste svaret
CPython er referanseimplementeringen av Python skrevet på C-programmeringsspråket. Det finnes en rekke andre implementeringer, til og med inkludert noen andre i C. Men CPython er den mest brukte, og den mot alle andre sammenlignes.
Python er en språkspesifikasjon. Hvis man refererer til implementeringsdetaljer med spesifisering av en bestemt implementering, vil den rimelige antagelsen være at det refererer til CPython-versjonen.
Du kan søke etter implementeringer, men resultatene vil sannsynligvis være noe forvirrende. Ikke alle implementeringer er fullstendige, og de kjører heller ikke på «normale» systemer eller i konvensjonelle programutførelsesmiljøer (for eksempel et terminalvindu eller en tekstkonsoll).
For eksempel MicroPython er et nedklippet derivat fra CPython som er målrettet for mikrokontrollere. Jython er skrevet på Java, og kjører i JVM (Java Virtual Machine), og inkluderer funksjoner for import av innfødt Java og samhandling med den (inkludert introspeksjon). IronPython er skrevet i Microsofts C # og er rettet mot å kjøre innenfor CLR (Common Language Runtime) i .NET-rammeverket. PyPy er en versjon av Python som hovedsakelig er skrevet på Python, men pakket rundt en kjerne som implementerer en begrenset delmengde av språket og gir JIT (Just-In- Time dymanic / runtime compilation). (Den delmengden heter RPython og er ment å støtte mer enn bare Python).
Ser du hva jeg mener om forvirring?
Det er minst to forskjellige implementeringer av Python som er skrevet i JavaScript og designet for å kjøre fra en vanlig nettleser (i DOM … eller Documenr Objektmodell … miljø). Dette er Brython , og Skulpt . I tillegg er det flere forskjellige «transpilere» eller Python til Javascript-kompilatorer, inkludert Transcrypt, og pyjs – (formelt pyjamas) og kanskje til og med RapydScript (skjønt det er mer som en hybrid av Python med JS).
Som du kan se , hvis du dykker dypt nok i emnet, blir det stadig vanskeligere å kategorisere forskjellige prosjekter og verktøy som «implementeringer.»
For eksempel er det Cython som er et verktøy for å ta spesielt merket Python-lignende kode og kompilere den i lastbare (binære / innfødte) moduler som kan importeres til Python og brukes som alle andre innfødte kompilert utvidelser til tolken. Det er egentlig ikke ansett å være en «implementering» av Python så mye som et verktøy for å optimalisere utvalgte utdrag av Python-kode til binære utvidelser til CPython-tolk. (Hvis du jobbet i Jython, kunne du skrive om deler av koden din i Java og bruke Jythons interoperasjons- og introspeksjonsfunksjoner for å bruke den koden. Bare analogt).
Det er også Numba , som er et verktøy for å samle en delmengde av Python og NumPy -kode til LLVM og integrering av LLVM-kjøretidsstøtte i Python-tolkerens løpende motor. Dette blir beskrevet mer som en JIT enn Cythons særegne modul / utvidelsesparadigme. Likevel er det mer et verktøy enn en «implementering» av hele språket.
Men hvis du ser på Nuitka , ser du en ambisiøst prosjekt for å samle hele Python-programmer. Så det kan være mer av en implementering.
Nok et prosjekt (som ser ut til å være et som Guido van Rossum, skaperen av Python, har jobbet med) er mypy – Python med valgfri statisk skriving og litt lokal type inferens. Dette ville ikke være en ny implementering. Det ser ut til å være en slags frontend som behandler Python (med valgfrie typekommentarer) og forbinder (uanmeldt) Python tilbake til CPython runtime-motoren (tolk).
Hvis du vil dykke ned i enda flere implementeringer og lenker ser på: PythonImplementations – Python Wiki .
Merk Jeg har dekket mange av dem her, og prøvde å forklare hvordan de forholder seg i så stor grad. Den wiki-siden er mer en gripepose, med mindre redegjørelse og noen få lenker til døde eller ikke-vedlikeholdte prosjekter. , IronPython, PyPy er forskjellige fra hverandre.
Så jeg er villig til å fjerne tre ting før jeg begynner å forklare:
- Python : Det er et språk, det sier / beskriver bare hvordan du kan formidle / uttrykke deg til tolken (programmet som godtar python-koden din).
- Implementering : Det handler om hvordan tolk ble skrevet, spesielt i hvilket språk og hva det ender med å gjøre .
- Bytecode : Det er koden som behandles av et program, vanligvis referert til som en virtuell maskin, snarere enn av den «virkelige» datamaskinen, maskinvareprosessoren.
CPython er implementeringen, som ble skrevet på C-språk. Det ender med å produsere bytecode (stack-machine based instruction set) som er Python-spesifikk og deretter utfører den. Årsaken til å konvertere Python-kode til en bytecode er fordi det er lettere å implementere en tolk hvis det ser ut som maskininstruksjoner. Men det er ikke nødvendig å produsere noe bytecode før utførelse (men CPython produserer).
Hvis du vil se på bytekoden til CPython, kan du. Slik 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
La oss se på koden ovenfor. Linje 1 til 6 er en funksjonsdefinisjon. I linje 8 importerer vi «dis» -modulen som kan brukes til å vise den mellomliggende Python bytecode (eller du kan si, demontere for Python bytecode) som genereres av CPython (tolk).
MERKNAD : Jeg fikk lenken til denne koden fra #python IRC-kanal: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c
Og så er det Jython, som er skrevet på Java og ender med å produsere Java-byte-kode. Java-byte-koden kjører på Java Runtime Environment, som er en implementering av Java Virtual Machine (JVM). Hvis dette er forvirrende, mistenker jeg at du ikke har noen anelse om hvordan Java fungerer. I lekmannsbetingelser tas Java (språket, ikke kompilatoren) -koden av Java-kompilatoren og sender ut en fil (som er Java-byte-kode) som bare kan kjøres ved hjelp av en JRE. Dette gjøres slik at når Java-koden er samlet, kan den porteres til andre maskiner i Java-byte-kodeformat, som bare kan kjøres av JRE. Hvis dette fremdeles er forvirrende, kan det være lurt å ta en titt på denne websiden .
Her kan du spørre om CPython » s bytecode er bærbar som Jython, mistenker jeg ikke. bytecode produsert i CPython-implementering var spesifikk for den tolken for å gjøre det enkelt for videre utføring av kode mistenker at slik mellomproduksjon av bytekoder bare for at det er enkelt å behandle det gjøres i mange andre tolker. Hvis du nå lurer på hvordan det er enkelt å kjøre bytekoden som vist ovenfor i koden (etter linje 9 til slutten ), så tenk på dette. Vi har en stabel (datastruktur) og hver linje i bytekoden gjør noen stabeloperasjoner som endrer stakken i samsvar. Denne modifiserte stakken brukes av CPython (tolken) for å produsere den endelige utgangen av koden .
Så i Jython, når du kompilerer Python-koden din, ender du opp med Java-byte-kode, som kan kjøres på en JVM.
Tilsvarende, IronPyt hon (skrevet på C # språk) kompilerer Python-koden din til Common Language Runtime (CLR), som er en lignende teknologi sammenlignet med JVM, utviklet av Microsoft.