Estoy creando una máquina virtual orientada a la pila, así que comencé a aprender Forth para una comprensión general sobre cómo funcionaría. Luego seleccioné las operaciones esenciales de manipulación de la pila que necesitaría implementar en mi máquina virtual:
drop ( a -- )
dup ( a -- a a )
swap ( a b -- b a )
rot ( a b c -- b c a )
Creo que las siguientes cuatro operaciones de manipulación de la pila se pueden utilizar para simular cualquier otra operación de manipulación de la pila. Por ejemplo:
nip ( a b -- b ) swap drop
-rot ( a b c -- c a b ) rot rot
tuck ( a b -- b a b ) dup -rot
over ( a b -- a b a ) swap tuck
Dicho esto, sin embargo, quería saber si he enumerado todas las operaciones fundamentales de manipulación de la pila necesarias para manipular la pila de alguna manera posible.
¿Hay más operaciones fundamentales de manipulación de pila que necesitaría implementar, sin las cuales mi máquina virtual no estaría completa?
rot rot
como una alternativa para-rot
? ¿Qué sucede cuando hay más de 3 artículos en la pila? ¿No tendrías que hacerlorot
tan a menudo como losLength-1
tiempos para lograrlo-rot
?dup
,swap
yrot
yo usopick ( a_n ... a_0 n -- a_n ... a_0 a_n)
y en suroll ( a_n ... a_0 n i )
lugar. Sii
es negativo,roll
desplaza los elementos hacia la izquierda; más a la derecha.Respuestas:
roll
También se usan muchos lenguajes basados en la pila , que se generalizarot
en un número arbitrario de elementos en la pila. También implementan la operación inversa para girar la pila hacia el otro lado.Yo diría que
roll
es más fundamental querot
.Aunque no tengo respuesta sobre Turingness de esto.
fuente
Brent Kirby establece una serie de bases computacionalmente completas de operaciones de apilamiento en su Teoría de los Combinadores Concatenativos . Necesita alguna noción de "cita" de los términos de la pila. Usando su nomenclatura, los siguientes conjuntos de combinadores son todos completos de Turing:
Usando mi nomenclatura preferida, un conjunto completo conveniente para implementar es:
fuente