Código enhebrado

En ciencias de la computación, el término código enhebrado se refiere a una técnica de implementación del compilador donde el código generado tiene una forma que esencialmente consiste enteramente en llamadas a subrutinas.

Similarmente, un programa lo suficientemente pequeño para caber enteramente en el caché del procesador de la computadora puede correr más rápido que un programa menos compacto que sufra fallas de caché constantes.

En estos programas, la aplicación del nivel superior puede consistir de nada más que llamadas a subrutinas.

Los mainframes y algunos microprocesadores tempranos tales como el RCA 1802 requerían varias instrucciones para llamar a una subrutina.

Por ejemplo: En este caso, la decodificación de los bytecodes se realiza una sola vez, durante la compilación o la carga de programa, así que no es repetida cada vez que una instrucción es ejecutada.

Observe, sin embargo, que las direcciones en thread para &pushA, &pushB, etc., tienen dos o más bytes, comparados a típicamente un byte, para el intérprete de decodificar (decode) y enviar (dispath) descrito arriba.

Así, el enhebrado a menudo tiene un costo de espacio más alto que los bytecodes.

[2]​ En 1970, Charles H. Moore inventó una notación más compacta para su máquina virtual Forth: el código enhebrado indirecto (ITC).

Eso puede ser traducido al enhebrado y rutinas siguientes, donde el tp es inicializado apuntando hacia la dirección de &thread.

Esto puede remover alguna indirección necesaria arriba, pero hace el enhebrado más grande: El enhebrado indirecto usa punteros que apuntan hacia localizaciones que a su vez apuntan al código de máquina.

Donde los operandos del handler incluyen tanto valores como tipos, los ahorros de espacio sobre el código enhebrado directo pueden ser significativos.

Los compiladores tempranos para el ALGOL, FORTRAN, COBOL y algunos sistemas Forth produjeron a menudo código enhebrado de subrutina.

El código enhebrado de token es notablemente compacto, sin mucho esfuerzo especial por un programador.

Tiene usualmente entre la mitad y tres cuartas partes el tamaño de otros códigos enhebrados, los cuales a su vez tienen entre la cuarta y la octava parte del tamaño del código compilado.

Históricamente, un acercamiento común es el bytecode, que utiliza opcodes de 8 bits y, a menudo, una máquina virtual basada en pila.

Un interpretador típico es conocido como "decode and dispatch interpreter" y sigue la forma: Si la máquina virtual usa solamente instrucciones del tamaño de un byte, el decode() es simplemente un ferch desde el bytecode, pero a menudo hay instrucciones comunes de 1 byte más instrucciones menos comunes de múltiples bytes (ver CISC), en este caso, decode() es más complejo.

Sin embargo para instrucciones ("compuestas") más complejas, el porcentaje de sobrecarga es proporcionalmente menos significativo.

Como ejemplo, una bifurcación condicional cuando el valor tope de la pila es cero puede ser codificada como sigue.

Esas son: En una máquina virtual de enhebrado indirecto, la que está dada aquí, las operaciones es: Éste es quizás el intérprete más simple y más rápido o máquina virtual.