In che modo gli interpreti JIT gestiscono i nomi delle variabili?

7

Diciamo che devo progettare un interprete JIT che traduca IL o bytecode in istruzioni eseguibili in fase di runtime. Ogni volta che nel codice si incontra un nome di variabile, l'interprete JIT deve tradurlo nel rispettivo indirizzo di memoria, giusto?

Quale tecnica usano gli interpreti JIT per risolvere i riferimenti variabili in modo performante? Usano l'hashing, le variabili compilate per gli indirizzi prima del tempo, o mi manca qualcosa del tutto?

    
posta MathuSum Mut 13.06.2016 - 00:42
fonte

2 risposte

8

Dai un'occhiata a questo esempio di Wikipedia :

for (int i = 2; i < 1000; i++) {
    for (int j = 2; j < i; j++) {
        if (i % j == 0)
            continue outer;
    }
    System.out.println (i);
}

che si traduce approssimativamente nel seguente codice byte:

0:   iconst_2
1:   istore_1
2:   iload_1
3:   sipush          1000
6:   if_icmpge       44
9:   iconst_2
10:  istore_2
11:  iload_2
12:  iload_1
13:  if_icmpge       31
16:  iload_1
17:  iload_2
18:  irem
19:  ifne            25
22:  goto            38
25:  iinc            2, 1
28:  goto            11
31:  getstatic       #84;           // Field java/lang/System.out:Ljava/io/PrintStream;
34:  iload_1
35:  invokevirtual   #85;           // Method java/io/PrintStream.println:(I)V
38:  iinc            1, 1
41:  goto            2
44:  return

Si noti che legge molto come linguaggio assembly, in cui le variabili sono memorizzate in indirizzi locali e indirizzate direttamente dal loro indirizzo. Non c'è traccia dei nomi delle variabili originali.

Per scoprire come funziona il bytecode Java in dettagli strazianti, puoi consultare la documentazione di Oracle.

Ulteriori letture
Specifica Java Virtual Machine

    
risposta data 13.06.2016 - 01:28
fonte
5

Le variabili sono per lo più note al momento del parsing e il loro binding e scope sono rilevanti per l'analisi. Le librerie JIT che compongono non gestiscono realmente le variabili (e non si preoccupano molto del loro nome, tipo e forse lo scopo).

Il punto principale è che una squadra investigativa avrebbe a che fare con "posizioni" o "valori" non con "variabili". Quindi il tuo bytecode non conoscerà le "variabili" (eccetto forse attraverso i meta-dati relativi al debugging).

Se stai progettando un JIT (e non progettando e implementando il tuo linguaggio di programmazione) dovresti pensare in termini di posizioni e valori, e non di variabili. Forse dovresti pensare in termini di semantica (guarda SECD per esempio di una VM astratta).

Se conosci qualche Schema o Lisp, ti consiglio di leggere il libro Lisp In Small Pïeces di Queinnec . Si tratta dei molti modi per implementare le lingue Lisp come il bytecode.

    
risposta data 13.06.2016 - 07:07
fonte

Leggi altre domande sui tag