"PyPy è una reimplementazione di Python in Python" è un modo piuttosto fuorviante per descrivere PyPy, IMHO, anche se tecnicamente vero.
Ci sono due parti principali di PyPy.
- Il framework di traduzione
- L'interprete
Il framework di traduzione è un compilatore. Compila il codice RPython fino a C (o altri target), aggiungendo automaticamente aspetti come garbage collection e un compilatore JIT. Non può gestire codice Python arbitrario, solo RPython.
RPython è un sottoinsieme del normale Python; tutto il codice RPython è codice Python, ma non viceversa. Non esiste una definizione formale di RPython, poiché RPython è fondamentalmente solo "il sottoinsieme di Python che può essere tradotto dal framework di traduzione di PyPy". Ma per essere tradotto, il codice RPython deve essere tipizzato staticamente (i tipi sono dedotti, non li dichiari, ma è comunque rigorosamente un tipo per variabile) e non puoi fare cose come dichiarare / modificare funzioni / classi durante l'esecuzione.
L'interprete quindi è un normale interprete Python scritto in RPython.
Poiché il codice RPython è un normale codice Python, è possibile eseguirlo su qualsiasi interprete Python. Ma nessuna delle affermazioni sulla velocità di PyPy proviene dal farlo in quel modo; questo è solo per un rapido ciclo di test, perché la traduzione dell'interprete richiede molto tempo.
Detto ciò, dovrebbe essere immediatamente ovvio che le speculazioni su PyPyPy o PyPyPyPy non hanno alcun senso. Hai un interprete scritto in RPython. Lo traduci in codice C che esegue rapidamente Python. Lì il processo si ferma; non c'è più RPython per accelerare elaborandolo di nuovo.
Quindi "Come è possibile che PyPy sia più veloce di CPython" diventa anche abbastanza ovvio. PyPy ha un'implementazione migliore, incluso un compilatore JIT (in genere non è altrettanto veloce senza il compilatore JIT, credo, il che significa che PyPy è solo più veloce per i programmi sensibili alla compilazione JIT). CPython non è mai stato progettato per essere un'implementazione altamente ottimizzante del linguaggio Python (sebbene provino a renderlo un'implementazione altamente ottimizzata , se segui la differenza).
La parte davvero innovativa del progetto PyPy è che non scrivono a mano sofisticati schemi GC o compilatori JIT. Scrivono l'interprete in modo relativamente semplice in RPython, e per tutti RPython è di livello inferiore rispetto a Python è ancora un linguaggio di raccolta dei rifiuti orientato agli oggetti, molto più alto livello di C. Quindi il framework di traduzione aggiunge automaticamente cose come GC e JIT. Quindi il framework di traduzione è enormesforzo, ma si applica ugualmente bene all'interprete PyPy Python, tuttavia modificano la loro implementazione, consentendo molta più libertà nella sperimentazione per migliorare le prestazioni (senza preoccuparsi di introdurre bug GC o aggiornare il compilatore JIT per far fronte alle modifiche). Significa anche che quando riescono a implementare un interprete Python3, otterranno automaticamente gli stessi vantaggi. E qualsiasi altro interprete scritto con il framework PyPy (di cui esiste un numero in varie fasi di polacco). E tutti gli interpreti che utilizzano il framework PyPy supportano automaticamente tutte le piattaforme supportate dal framework.
Quindi il vero vantaggio del progetto PyPy è quello di separare (il più possibile) tutte le parti dell'implementazione di un interprete efficiente indipendente dalla piattaforma per un linguaggio dinamico. E poi escogita una buona implementazione di essi in un unico posto, che può essere riutilizzato in molti interpreti. Non è una vittoria immediata come "il mio programma Python funziona più velocemente ora", ma è una grande prospettiva per il futuro.
E può eseguire il tuo programma Python più velocemente (forse).