¿Cómo manejan los intérpretes JIT los nombres de variables?

7

Digamos que debo diseñar un intérprete JIT que traduce IL o bytecode a instrucciones ejecutables en tiempo de ejecución. Cada vez que se encuentra un nombre de variable en el código, el intérprete JIT tiene que traducirlo a la dirección de memoria correspondiente, ¿no?

¿Qué técnica utilizan los intérpretes de JIT para resolver las referencias de variables de una manera suficiente? ¿Utilizan el hash, las variables se compilan en direcciones con anticipación o me falta algo por completo?

    
pregunta MathuSum Mut 13.06.2016 - 00:42

2 respuestas

8

Eche un vistazo a este ejemplo en 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);
}

que se traduce aproximadamente en el siguiente código de 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

Tenga en cuenta que se parece mucho al lenguaje ensamblador, donde las variables se almacenan en direcciones locales y se las menciona directamente por su dirección. No hay rastro de los nombres de las variables originales.

Para averiguar cómo funciona el código de bytes de Java con detalles insoportables, puede consultar la documentación de Oracle.

Lecturas adicionales
La especificación de la máquina virtual de Java®.

    
respondido por el Robert Harvey 13.06.2016 - 01:28
5

Las variables se conocen principalmente en el momento del análisis y su vinculación y alcance son relevantes para el análisis. compilación JIT las bibliotecas no manejan realmente las variables (y no les importa mucho su nombre, tipo y quizás alcance).

El punto principal es que un JIT trataría con "ubicaciones" o "valores" no con "variables". Por lo tanto, su código de bytes no conocerá las "variables" (excepto quizás a través de la depuración de metadatos relacionados).

Si está diseñando un JIT (y no está diseñando e implementando su lenguaje de programación), debe pensar en términos de ubicaciones y valores, y no de variables. Quizás deberías pensar en términos de semántica (mira SECD , por ejemplo, de una máquina virtual abstracta).

Si conoces algún Esquema o Lisp, te recomiendo leer el Lisp In Small Pïeces de Queinnec . Se trata de las muchas formas de implementar lenguajes similares a Lisp, incluido el código de bytes.

    
respondido por el Basile Starynkevitch 13.06.2016 - 07:07

Lea otras preguntas en las etiquetas