Migliore risposta
CPython è limplementazione di riferimento di Python scritta nel linguaggio di programmazione C. Ci sono un certo numero di altre implementazioni, incluse anche alcune altre in C. Ma CPython è la più usata e viene confrontata quella con tutte le altre.
Python è una specifica del linguaggio. Se ci si riferisce ai dettagli di implementazione specificando una particolare implementazione, allora il presupposto ragionevole sarà che è in riferimento alla versione di CPython.
È possibile cercare le implementazioni, ma è probabile che i risultati siano un po confusi. Non tutte le implementazioni sono complete, né vengono eseguite su sistemi “normali” o in ambienti di esecuzione di programmi convenzionali (come una finestra di terminale o una console di testo).
Ad esempio MicroPython è un derivato ridotto di CPython destinato ai microcontrollori. Jython è scritto in Java, viene eseguito nella JVM (Java Virtual Machine) e include funzionalità per limportazione di Java nativo e linteroperabilità con esso (inclusa lintrospezione). IronPython è scritto in C # di Microsoft e progettato per essere eseguito allinterno del CLR (Common Language Runtime) del framework .NET. PyPy è una versione di Python scritta principalmente in Python, ma avvolta attorno a un nucleo che implementa un sottoinsieme limitato del linguaggio e fornisce JIT (Just-In- Time dymanic / compilazione runtime). (Quel sottoinsieme si chiama RPython ed è destinato a supportare più del semplice Python).
Vedi cosa intendo per confusione?
Esistono almeno due diverse implementazioni di Python scritte in JavaScript e progettate per essere eseguite da un normale browser (nel DOM … o Documenr Modello a oggetti … ambiente). Questi sono Brython e Skulpt . Inoltre, esistono diversi compilatori “transpilers” o da Python a Javascript, tra cui Transcrypt e pyjs – (formalmente Pyjamas) e forse anche RapydScript (sebbene sia più simile a un ibrido di Python con JS).
Come puoi vedere , se approfondisci abbastanza largomento, diventa sempre più difficile classificare progetti e strumenti diversi come “implementazioni”.
Ad esempio, cè Cython che è uno strumento per prendere codice simile a Python appositamente annotato e compilarlo in moduli caricabili (binari / nativi) che possono essere importati in Python e utilizzati come qualsiasi altra estensione compilata in modo nativo per linterprete. Non è realmente considerato una “implementazione” di Python quanto uno strumento per lottimizzazione di frammenti selezionati di codice Python in estensioni binarie allinterpeter CPython. (Se stavi lavorando in Jython potresti riscrivere parti del tuo codice in Java e utilizzare le funzionalità di interoperabilità e introspezione di Jython per usare quel codice. Solo per analogia).
Cè anche Numba che è uno strumento per compilare in modo trasparente un sottoinsieme di codice Python e NumPy in LLVM e integrando il supporto del runtime LLVM nel motore in esecuzione dellinterprete Python. Questo è descritto come più simile a un JIT rispetto al paradigma di modulo / estensione distintivo di Cython. Tuttavia è più uno strumento che una “implementazione” dellintero linguaggio.
Ma poi, se guardi Nuitka , vedi un ambizioso progetto per compilare interi programmi Python. Quindi potrebbe essere più unimplementazione.
Un altro progetto (che sembra essere uno su cui Guido van Rossum, il creatore di Python, ha lavorato) è mypy – Python con digitazione statica opzionale e alcune inferenze di tipo locale. Questa non sarebbe una nuova implementazione. Sembra essere una sorta di frontend che elabora Python (con annotazioni di tipo opzionali) e riporta il Python (non annotato) nel motore di runtime CPython (interprete).
Se vuoi immergerti in ancora più implementazioni e i collegamenti guardano a: PythonImplementations – Python Wiki .
Nota ho trattato molti di questi qui e ho cercato di spiegare come si relazionano a tal punto. Quella pagina wiki è più di un affare, con meno esposizione e pochi link a progetti morti o non mantenuti.
Risposta
Anche io ho avuto lo stesso problema a capire come sono CPython, JPython , IronPython, PyPy sono diversi luno dallaltro.
Quindi, sono disposto a chiarire tre cose prima di iniziare a spiegare:
- Python : è un linguaggio, afferma / descrive solo come trasmettere / esprimere te stesso allinterprete (il programma che accetta il tuo codice python).
- Implementazione : si tratta di come è stato scritto linterprete, in particolare, in che lingua e cosa finisce per fare .
- Bytecode : è il codice che viene elaborato da un programma, di solito indicato come macchina virtuale, piuttosto che dalla macchina “reale” del computer, il processore hardware.
CPython è limplementazione, che è stata scritta in linguaggio C. Finisce per produrre bytecode (set di istruzioni basato su stack machine) che è specifico di Python e quindi lo esegue. Il motivo per convertire il codice Python in un bytecode è perché è più facile implementare un interprete se assomiglia a istruzioni della macchina. Ma non è necessario produrre un bytecode prima dellesecuzione (ma CPython lo produce).
Se vuoi guardare il bytecode di CPython, puoi farlo. Ecco come puoi:
>>> 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
Ora, diamo unocchiata al codice sopra. Le righe da 1 a 6 sono una definizione di funzione. Nella riga 8, importiamo il modulo “dis” che può essere utilizzato per visualizzare il bytecode Python intermedio (o si può dire, disassembler per bytecode Python) generato da CPython (interprete).
NOTA : ho ricevuto il link a questo codice dal canale IRC #python: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c
E poi cè Jython, che è scritto in Java e finisce per produrre codice byte Java. Il codice byte Java viene eseguito su Java Runtime Environment, che è unimplementazione di Java Virtual Machine (JVM). Se questo crea confusione, sospetto che tu non abbia idea di come funziona Java. In parole povere, il codice Java (il linguaggio, non il compilatore) viene preso dal compilatore Java e genera un file (che è codice byte Java) che può essere eseguito solo utilizzando un JRE. Questo viene fatto in modo che, una volta compilato il codice Java, possa essere portato su altre macchine in formato codice byte Java, che può essere eseguito solo da JRE. Se questo crea ancora confusione, potresti voler dare unocchiata a questa pagina web .
Qui potresti chiedere se il CPython ” s bytecode è portabile come Jython, sospetto di no. Il bytecode prodotto nellimplementazione di CPython era specifico per quellinterprete per facilitare lulteriore esecuzione del codice sospetto che, tale produzione di bytecode intermedio, solo per la facilità di elaborazione sia eseguita in molti altri interpreti) Se ora ti stai chiedendo come sia facile eseguire il bytecode come mostrato sopra nel codice (dopo la riga 9 fino alla fine ), quindi, pensa a questo. Abbiamo uno stack (struttura dei dati) e ogni riga nel bytecode esegue alcune operazioni di stack modificando lo stack di conseguenza. Questo stack modificato viene utilizzato da CPython (linterprete) per produrre loutput finale del codice .
Quindi, in Jython, quando compili il tuo codice Python, finisci con il codice byte Java, che può essere eseguito su una JVM.
Allo stesso modo, IronPyt hon (scritto in linguaggio C #) compila il codice Python in Common Language Runtime (CLR), che è una tecnologia simile rispetto a JVM, sviluppata da Microsoft.