Questa è un'idea pazzesca che mi è venuta in mente e sono interessato a sapere se sarebbe fattibile, o se qualcuno lo ha già scritto o implementato.
Immagina di essere su una piattaforma (una console di gioco, iOS, ...) dove non è possibile implementare un compilatore JIT a causa di motivi tecnici 1 - non è possibile rendere eseguibile la memoria scrivibile. Puoi scrivere un interprete, ma ti piacerebbe farlo più velocemente. Ora, la memoria è abbastanza economica e il codice è relativamente piccolo rispetto ad altre risorse, quindi puoi sempre aggiungere altro codice precompilato.
Che cosa succede se aggiungi al tuo binario molti pezzi di codice compilati (in anticipo) - uno per ogni sequenza di istruzioni che probabilmente ti serviranno? Puoi rendere i pezzi configurabili passando argomenti attraverso registri o memoria. Un semplice esempio è la sostituzione di un semplice ciclo (pseudocodice)
for i in range(100000):
array[i] = 0;
con memset(&array, 0, 100000)
. Ma puoi fare molto meglio. Compila alcuni programmi tipici, prendi i 1000 migliori N -grammi di istruzioni e inseriscili nel tuo binario. Ora li stringa tutti insieme - usando i salti calcolati (non so se sarebbero disponibili in un tipico sistema bloccato) - o avvolgendo quelli più grandi nelle funzioni, o usando alcuni trucchi basati sulla programmazione di ritorno. / p>
Qui ci sono alcuni compromessi:
-
Uno è che c'è un sovraccarico perché devi compilare molto più codice di quello che effettivamente utilizzerai. Tuttavia, potrebbe essere che il codice critico delle prestazioni (per una determinata piattaforma e caso d'uso) abbia molti pezzi comuni. Pensa ad esempio al codice grafico.
-
Un altro è che, mentre l'esecuzione dei bit di codice compilati è più veloce dell'interpretazione, si ha un sovraccarico dovuto al salto tra i bit di codice. Ho anche la sensazione che la mancanza di localizzazione della cache tra pezzi di codice distanti potrebbe essere una cattiva idea. Entrambi questi dovrebbero essere particolarmente veri per i processori moderni.
Quindi, mi chiedo se qualcuno più intelligente di me ci abbia già pensato e possa parlarmi di questi compromessi e di come funzionerebbe nella realtà.
1) Nota Non sto chiedendo degli aspetti legali , che comunque vanno oltre lo scopo del sito. Qualcuno potrebbe proibirti di scrivere un compilatore JIT e poi inventare qualcosa che tecnicamente non è una JIT, ma la stessa cosa nello spirito, e hai appena creato un sacco di lavoro per gli avvocati. Questa domanda riguarda gli aspetti tecnici: dì che vuoi qualcosa di simile a JIT su un computer con architettura Havard.