Domanda

Se faccio un JVM in Java, ad esempio, è possibile realizzare l'implementazione che ho effettivamente fatto Più veloce rispetto all'implementazione originale ero solito Per creare questa implementazione, anche se la mia implementazione è basata sull'implementazione originale e potrebbe persino dipendere da tale implementazione?

(Confuso ...)

Guarda a Pypy. È un compilatore JIT per Python realizzato a Python. Va bene, ma come può affermare di esserlo Più veloce rispetto all'implementazione originale di Python da cui sta usando e dipende?

È stato utile?

Soluzione

Sei confuso tra un linguaggio e il Apparato di esecuzione per quella lingua.

Uno dei motivi per cui la pypy può essere più veloce di Cpython è perché la pypy viene compilata in un eseguibile nativo completamente separato e non dipende, né esegui in cpython.

Tuttavia, sarebbe possibile che un'implementazione inefficiente di una lingua fosse superata da un interprete scritto in quella stessa lingua e ospitata nell'interprete inefficiente, se l'interprete di livello superiore facesse uso di strategie di esecuzione più efficienti.

Altri suggerimenti

Assolutamente, è possibile. L'implementazione JVM potrebbe compilare bytecode Java per il codice macchina ottimizzato. Se il tuo ottimizzatore era più sofisticato che nell'implementazione JVM su cui si esegue il compilatore Java, il risultato finale potrebbe essere più veloce.

In tal caso, potresti eseguire il tuo compilatore Java Sul suo codice sorgente, e beneficiare di velocità di compilazione più rapide da allora in poi.

Hai detto che Pypy è un compilatore JIT per Python (non ho familiarità con me stesso). In tal caso, converte un programma Python al codice macchina e quindi esegue il codice macchina. Un altro poster ha detto che il compilatore Pypy funziona come eseguibile autonomo, separato da Cpython. Ma anche se dovesse essere eseguito su CPYTHON, una volta che il programma è stato per il codice della macchina e il codice della macchina compilato è in esecuzione, le prestazioni del compilatore non sono più importanti. La velocità del compilatore ha solo un effetto sul tempo di avvio.

Pypy non è l'interprete di Python implementato in Python, ITS Python Interpreter e compilatore implementato in Rpython, che è un sottoinsieme tipografico staticamente limitato di Python:

Rpython è un sottoinsieme limitato di Python che è suscettibile di analisi statiche. Sebbene ci siano aggiunte alla lingua e alcune cose potrebbero funzionare sorprendentemente, questo è un approssimativo di restrizioni che dovrebbero essere considerate. Nota che ci sono tonnellate di speciali restrizioni a cottura che incontrerai mentre vai.

La vera differenza di velocità deriva dal fatto che, a differenza di Cpython che sta interpretando l'intero programma come bytecode, Pypy usa Compilation just-in-time (JIT) (in codice macchina) per parti rpython.

Non credo che sia possibile implementare un interprete per una lingua in quella lingua (chiamarlo a), quindi eseguirlo in cima a un altro interprete esistente (chiama questo b) per quella lingua ed eseguire un programma (chiama questo p), e avere p in esecuzione (a correre su b) essere più veloce di p in esecuzione su B.

Ogni operazione di A dovrà essere implementata con almeno un'operazione di B. Quindi anche se B è atrocemente cattiva e A, è ottimalmente buono, il fatto che A venga eseguito su B significa che la cattiva di B rallenterà A .

Potrebbe essere possibile implementare un compilatore Interpreter + JIT per una lingua nella lingua stessa, in cui il compilatore JIT produce qualche altro codice più veloce in fase di esecuzione e far funzionare P (A in esecuzione su B) essere più veloce di P in esecuzione su B. La parte del runtime di P che non è compilato JIT sarà più lenta (tanto più lento, normalmente) ma se il compilatore JIT identifica correttamente le parti "calde" di P ed le esegue più rapidamente di B, l'intero sistema potrebbe funzionare più velocemente.

Ma non è davvero interessante. È anche possibile implementare un compilatore per una lingua in quella lingua (C), compilarlo con un compilatore esistente (D) e avere il nuovo codice di produzione del linguaggio del compilatore che è più veloce di quello che il compilatore originale avrebbe prodotto. Spero che non ti sentano; Dovrebbe essere chiaro che la velocità del codice emesso da D avrà solo un effetto sul tempo di esecuzione di C, non sul tempo di esecuzione di altri programmi compilati con C.

Scrivere compilatori nelle lingue che compilano è stato fatto per decenni (GCC è scritto in C, per esempio) e non è davvero rilevante per la vera domanda che penso stai ponendo; Nessuno dei due è un linguaggio di Jit che si sta usando se stesso. In entrambi i casi l'esecuzione sottostante è qualcosa di diverso dalla lingua che stai prendendo in considerazione; di solito codice macchina.

Tuttavia, la fonte della tua domanda è un malinteso. L'interprete di Python di Pypy non è effettivamente implementato in Python. Il progetto Pypy ha un interprete per Python scritto Rpython. Rpython è un sottoinsieme di Python, scelto in modo che possa essere compilato in modo efficiente al codice della macchina; Come un linguaggio Rpython è molto più simile a Java con inferenza di tipo e blocchi rientrati anziché parentesi graffe. Il progetto Pypy ha anche un compilatore per rpython che è scritto in Python ed è in grado di aggiungere (principalmente) l'aggiunta automatica di un compilatore JIT a qualunque Interpreter IT Compila.

Quando stai effettivamente utilizzando l'interprete PYPY in produzione, si utilizza un interprete di codice macchina compilato dalle sorgenti RPYTHON, proprio come quando si utilizza l'interprete CPYTHON, si utilizza un interprete del codice macchina compilato dal codice sorgente C. Se si esegue l'interprete PYPY in cima a un altro interprete di Python (cosa che puoi fare perché il codice rpython valido è anche un codice Python valido; ma non il contrario), quindi funziona estremamente più lento del interprete di Cpython.

Il processo di traduzione di Pypy funziona su CPYTHON, ma l'output è un elenco di file .c (19 file l'ultima volta che ho controllato) che vengono quindi compilati in un binario: Pypy-C. In runtime Pypy-C non ha alcuna relazione con Cpython, ecco perché può essere più veloce.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top