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 di migliorare le 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 in occasione del Natale e l'annuncio è scritto in versi.

Il JIT proposto si distingue per l'alta velocità di generazione del codice, la semplicità di manutenzione e la completa integrazione con l'interprete. Il metodo proposto consente di trasformare automaticamente un interprete scritto in linguaggio C in un compilatore JIT, senza la necessità di formare separatamente la logica di generazione del codice e senza creare manualmente rappresentazioni in assembly. Con questo approccio, la correzione di un errore nell'interprete porterà 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 riallocazione 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 sono compiti simili. Durante l'esecuzione del programma, il JIT esegue un'analisi delle istruzioni bytecode create dall'interprete e copia per ciascuna istruzione il codice macchina precaricato nell'area di memoria con codice eseguibile, modificando al contempo le istruzioni in tempo reale per inserire i dati in elaborazione (il JIT copia modelli già compilati di funzioni e sostituisce i valori necessari, come argomenti e costanti). Durante il caricamento dei file oggetto avviene anche la copia del codice macchina in memoria e la sostituzione dei simboli esterni.

Nel Copy-and-Patch JIT, tramite LLVM, viene creato un file oggetto in formato ELF, contenente dati sulle istruzioni del bytecode e informazioni sulle necessarie sostituzioni di dati. Il JIT sostituisce le istruzioni del bytecode generate durante l'interpretazione del programma con rappresentazioni in codice macchina, inserendo nel contesto i dati necessari per i calcoli. L'implementazione del JIT richiede LLVM come dipendenza nella fase di build, ma i componenti runtime non sono legati a dipendenze esterne e si riducono a circa 300 righe di codice 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 del codice 100 volte più veloce e un 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ù velocemente. Se confrontiamo il nuovo JIT con il JIT ottimizzante (LuaJIT), che utilizza codice scritto a mano in assembly, la variante proposta si è rivelata più veloce in 13 su 44 test, mentre mediamente ha mostrato prestazioni inferiori del 35%, con un notevole semplificarsi della manutenzione e una riduzione del livello di complessità dell'implementazione.

Guarda il video


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