what ultima programing powered payton language developing actual python language-design language-theory language-implementation

ultima - version actual de python



¿Qué es exactamente una "máquina de registro"? (6)

De http://code.google.com/p/unladen-swallow/wiki/ProjectPlan cito:

"El uso de un JIT también nos permitirá mover Python de una máquina basada en pila a una máquina de registro, que ha demostrado mejorar el rendimiento en otros idiomas similares (Ierusalimschy et al, 2005; Shi et al, 2005)".

En la universidad construí un compilador simple para un lenguaje con procedimientos recursivos, que mantenía cuadros de apilamiento para cada procedimiento llamado, para que puedan llamarse de forma recursiva y para que los parámetros y los valores de retorno funcionen ...

2 cosas:

1) ¿Tengo razón al pensar que lo que implementé se consideraría una "máquina basada en pila" dada la terminología utilizada en la cita anterior?

2) Si mi suposición en el punto (1) era correcta, ¿cómo funciona una "máquina de registro"? Es decir, ¿en qué se diferencia de una máquina basada en pila?

¡Gracias!


1) ¿Tengo razón al pensar que lo que implementé se consideraría una "máquina basada en pila" dada la terminología utilizada en la cita anterior?

Realmente no. Una pila de algún tipo es prácticamente la única forma de implementar llamadas a funciones recursivas. Pero una "máquina basada en la pila" va mucho más allá al hacer todo a través de la pila. No solo llamadas a funciones, sino también operaciones aritméticas. En cierto modo, se comportan como si todas las instrucciones de la máquina fueran una llamada a la función que se maneja a través de la pila. Es un diseño de máquina muy simple, pero más difícil de escribir ensamblador / código de máquina.

2) Si mi suposición en el punto (1) era correcta, ¿cómo funciona una "máquina de registro"? Es decir, ¿en qué se diferencia de una máquina basada en pila?

Una máquina de registro tiene un almacenamiento interno rápido (registros) y realiza la mayoría de sus operaciones con los datos de estos registros. Hay instrucciones adicionales de la máquina para copiar datos entre los registros y la memoria principal.

IIRC hay dos tipos de máquinas de pila:

  • Las máquinas acumuladoras tienen un "acumulador", que es básicamente un registro único que contiene el resultado de los cálculos (y también puede suministrar un operando), con la mayoría de las instrucciones de la máquina operando en el acumulador.
  • Las máquinas de pila "puras" ponen el resultado de los cálculos en la parte superior de la pila después de consumir los operandos.

¿Tu compilador generó código de máquina? Si es así, entonces su objetivo era una máquina de registro (casi todos los diseños de CPU son máquinas de registro).

Las máquinas de pila almacenan todos los valores en una pila, mientras que las máquinas de registro tienen un número fijo de ranuras de almacenamiento cuyas "direcciones" no cambian (a diferencia de las máquinas de pila).


Una máquina de registro casi siempre tiene una pila, también.

Pero una máquina de pila rara vez tiene registros arquitectónicamente visibles, o puede que solo tenga uno o dos.

Una máquina de registro puede tener algunas operaciones de pila e incluso puede tener un modo de direccionamiento de pila.

La diferencia es de orientación. La máquina de registro tendrá en su mayoría instrucciones que operan en los registros, y tendrá un puñado de operaciones para cargar y almacenar entre los registros y la pila o la memoria.

Una máquina de pila ... y estas son muy raras ya que los dispositivos de hardware reales ... operarán directamente en la pila con sus instrucciones y tendrán un montón de operaciones para cargar y almacenar entre la pila y la memoria.

Ahora, las razones por las que las máquinas de registro de hardware son más rápidas que las máquinas de pila de hardware posiblemente no estén relacionadas con las razones por las que las máquinas virtuales de "registro" de software son más rápidas, según el documento citado, que las máquinas de "pila" de software.

Para las máquinas virtuales de software, parece ser que hay que ejecutar menos instrucciones. Esto se determinó empíricamente de acuerdo con las afirmaciones en el documento citado, pero me imagino que se debe a que se deben realizar muchas menos instrucciones generales como push, pop e intercambio en la máquina de registro, y porque la máquina de registro puede reutilizar los operandos fácilmente si aún están Recostado en el archivo de registro, sin necesidad de cargar ni de ops. Por supuesto, todo es sólo la memoria; Son registros virtuales.


Una máquina de registro es una máquina abstracta cuyos códigos de operación se definen por referencia a su operación en un conjunto de registros con nombre, en lugar de por su operación en la parte superior de una pila.

En una máquina de registro: agregar podría definirse para tomar tres nombres de registro como operandos, agregar el contenido de los dos primeros y colocar el resultado en el tercero. (Más común es el diseño donde solo se nombran uno o dos y el resultado siempre va en un registro especial del acumulador, pero ese no es el punto).

En una máquina de pila: agregar podría definirse para sacar dos operandos de la pila, agregarlos y empujar el resultado en la pila.


Una máquina de registro es una unidad de hardware o software que, al trabajar con datos, la toma de la memoria, la coloca en un lugar donde puede trabajar rápidamente y luego devuelve el resultado.

Por ejemplo, una CPU normal es una máquina de registro. Desde la ALU (la unidad que trabaja con números en una CPU) solo puede trabajar con números en un registro.

Una máquina basada en pila agrega los datos a una pila y luego hace estallar o inserta cosas en ella.

Por ejemplo, sumar dos números sería

Push 2 // Push 2 onto the stack Push 3 // Push 3 onto the stack Add // Add the top two things on the stack.

Cuando en una máquina de registro sería algo como esto.

Load x, r0 // Load x onto register 0 Load y, r1 // Load y onto register 1 Add r0, r1, r2 // Add 1 and 2 and store the result in register 2


Una máquina de registro utiliza un número fijo de registros o cubos para almacenar valores intermedios para el cálculo. Por ejemplo, la instrucción "agregar" podría agregar los valores en dos registros específicos y almacenar el resultado en otro registro.

Una máquina basada en pila utiliza una pila para almacenar valores intermedios durante el cálculo. Por ejemplo, para agregar dos números, las instrucciones de "agregar" sacan dos valores de la pila, los agregan y devuelven el resultado a la pila.