Como referencia, Burroughs B5000 y Inmos Transputer eran máquinas de pila. DEC PDP11 tenían modos de direccionamiento tan flexibles que se podían usar como una máquina de apilamiento. Creo que Niklaus Wirth's Lilith puede haber sido una máquina de apilar (hace más de 20 años, mi mente está cayendo :-)
Realmente no tenían ningún nombre/número de registro en las instrucciones para encontrar operandos, porque estaban en la pila.
Las instrucciones podrían cargar valores inmediatos (constantes) en la pila, o cargar/almacenar en la memoria.
Así que no era add.w r0, r1, r5
o add.w eax, [#fe34]
. Hubo add.w
.
Así un ejemplo (no en todos exacta, que era más compleja) de una secuencia de ensamblador podría ser
loadstack 0xfe34 -- got fe34 onto stack
loadstackindirect -- use address on the stack, to load the value at that address
add.w -- assumes we already have the other operand on the stack
-- result back onto the stack
Para calcular y cargar un valor en una matriz, la pila podría ser utilizada porque puede haber sin modo de direccionamiento indexado.
De modo que las instrucciones eran pequeñas, y se realizaba mucho trabajo implícitamente con el puntero de la pila y la pila. Transputers IIRC en realidad tenía una pila de solo tres valores, y el compilador (o desarrolladores) tenía que asegurarse de que se mantuviera.
XMOS ahora vendemos un "equivalente" moderno, y empleamos a algunas de las mismas personas.
Han pasado más de 20 años desde que escribí el código de Transputer, así que lo siento por ser un poco vago.
El sistema UCSD Pascal usaba una máquina virtual definida por software, que era una máquina de pila. La idea era hacer algo que fuera portátil para las computadoras nuevas, pero también fácil de escribir, fácil de compilar y un rendimiento razonable. Su máquina virtual se definió en su propio dialecto de Pascal. Cuando fue portado a computadoras reales, los registros se usarían para mantener el puntero de la pila, y es probable que haya algo de ingenio en cómo se manejó la parte superior de la pila (por registros), para obtener un rendimiento razonable.
Ellos * podrían * emularlo en el software, las JVM antiguas lo hicieron. Por lo general, el código de máquina de la pila se compila con código nativo (cualquiera que sea la arquitectura). El código de pila de la máquina es bueno porque tiene una codificación concisa, es fácil de generar a partir de AST y relativamente fácil de analizar. – harold