Sí, troff es Turing completo. Es compatible con la recursión arbitraria y la ramificación condicional, que es suficiente. También tiene registros y varias otras formas de almacenar datos, lo que le brinda otra ruta de acceso nuevamente.
La integridad de Turing no implica que los programas altamente complejos sean prácticos , solo que son teóricamente posibles, de alguna manera, en algún nivel de eliminación, y su ausencia tampoco implica que no lo sean, por lo que ni Troff está siendo Turing completo ni el la ausencia de programas complejos no sugiere mucho de una manera u otra al respecto.
La integridad de Turing no es, en general, una propiedad que signifique algo útil para el usuario. Lo único que significa es que se puede simular una máquina de Turing con él, no es que te gustaría, y no es que la salida que se obtendría de ella es algo parecido a lo que cabría esperar para leer. La entrada o salida puede ser solo un número, o incluso la cantidad de veces que aparece algo, en lugar de algo útil, y el tipo de máquina que termina simulando y sus programas a menudo apenas son comprensibles para comenzar.
Por cierto, muchos lenguajes y sistemas son Turing completos pero no son razonablemente aplicables para cualquier programación real en ese subconjunto (por ejemplo, Conway's Game of Life o CSS), y algunos lenguajes que son útiles para la programación real no son Turing completos (por ejemplo, Agda). Las características definitorias realmente son que puedes
- sigue para siempre
- recuerda tantos datos como quieras
- elegir qué, si algo, hacer a continuación
A menudo, esas propiedades, particularmente la no terminación, son realmente indeseables, posiblemente incluso para troff. Fuera de la informática teórica y el diseño del lenguaje, la integridad de Turing no es una propiedad terriblemente interesante prácticamente de la época, a pesar de ser pegadiza.
mov
es Turing-complete. (Debido a los modos de direccionamiento que le permiten usar tablas de búsqueda, y el mismo mnemónico se usa para cargar, almacenar y mover inmediatamente para registrarse). En muchos otros ISA que tienen unamov
instrucción (por ejemplo, ARM) es solo un movimiento de registro regular y no está completo (Aunque en ARM puede hacer cambios / rotaciones). Además, en realidad necesita unjmp
para crear un bucle alrededor de su bloque demov
instrucciones, a menos que esté en modo de 16 bits donde el puntero de instrucción puede ajustarse en un segmento de código de 64k para bucle implícitamente.push {r4, lr}
/pop {r4,pc}
es común en funciones que necesitan guardar / restaurar un registro conservado de llamadas y mantener la pila alineada: también guardan el registro de enlace y lo vuelven a meter en el contador del programa para volver. (Las instrucciones de almacenamiento / carga múltiple de ARM de 32 bits usan un campo de bits para indicar qué registros almacenar / cargar). Y sí, puede usar la PC como destino de unamov
o cualquier instrucción. Sin embargo, no sabía que era común en el pasado. Pero había oído hablar de los ISA activados por el transporte.