Per Python è stato proposto un compilatore JIT che utilizza la tecnica copy-and-patch

Brandt Bucher di Microsoft, uno dei core developer di CPython e membro del team che si occupa dell'ottimizzazione delle prestazioni dell'interprete CPython, ha pubblicato un'implementazione del compilatore JIT per Python che utilizza la tecnica Copy-and-Patch. La pubblicazione del JIT è stata programmata per Natale e l'annuncio è stato scritto in versi.

Il JIT proposto è notevole per l'alta velocità di generazione del codice, la semplicità di manutenzione e l'integrazione completa con l'interprete. Il metodo proposto consente di trasformare automaticamente l'interprete, scritto in linguaggio C, in un compilatore JIT, senza la necessità di creare separatamente la logica di generazione del codice e senza la creazione manuale di rappresentazioni in assembly. Con questo approccio, la correzione di un errore nell'interprete porta automaticamente alla risoluzione dello stesso problema nel JIT, poiché viene utilizzato un generatore di codice comune.

Il funzionamento del metodo Copy-and-Patch si basa sul fatto che la rilocalizzazione del codice in memoria durante il caricamento da parte del linker dei file oggetto e la sostituzione delle istruzioni macchina al posto del bytecode nel JIT rappresentano compiti simili. Durante l'esecuzione del programma, il JIT analizza le istruzioni bytecode create dall'interprete e copia per ciascuna istruzione il codice macchina precompilato nell'area di memoria in cui risiede il codice eseguibile, nonché modifica al volo le istruzioni per sostituirvi i dati elaborati (il JIT copia modelli pronti di funzioni già compilate e inserisce in essi i valori necessari, come argomenti e costanti). Anche durante il caricamento dei file oggetto avviene la copia del codice macchina in memoria e la sostituzione dei simboli esterni.

Nel Copy-and-Patch JIT, utilizzando LLVM, viene generato un file oggetto in formato ELF, che contiene informazioni sulle istruzioni del bytecode e dettagli sulla sostituzione dei dati necessari. Il JIT sostituisce le istruzioni del bytecode generate durante l'interpretazione del programma con rappresentazioni nel codice macchina, inserendo nel contempo i dati necessari per i calcoli. L'implementazione del JIT richiede LLVM come dipendenza durante la fase di compilazione, ma i componenti runtime non sono legati a dipendenze esterne e si riducono a circa 300 righe scritte a mano in C e 3000 righe di codice C generate.

Rispetto agli strumenti JIT tradizionali (LLVM -O0), il JIT proposto offre una generazione di codice 100 volte più veloce e codice risultante più veloce del 15%. Rispetto alla compilazione in WebAssembly (Liftoff), il nuovo JIT genera codice 5 volte più velocemente e il codice risultante funziona il 50% più rapidamente. Confrontando il nuovo JIT con il JIT ottimizzante (LuaJIT), che utilizza codice assembly scritto a mano, la versione proposta è risultata più veloce in 13 dei 44 test, mentre in media ha mostrato un calo delle prestazioni del 35%, pur semplificando notevolmente la manutenzione e riducendo il livello di complessità di implementazione.

Riproduci video


Fonte: opennet.ru
Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista un hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster