¿Está completo Troff Turing?

9

Troff admite el uso de definiciones de macro .dey el uso de ramificaciones .if(consulte las páginas 5 y 6 del manual del usuario de Troff ). En estos dos aspectos, es muy parecido a TeX. Sin embargo, no conozco programas altamente complejos escritos en Troff (a diferencia de decir TikZ para TeX). ¿Está completo Troff Turing?

cutculus
fuente

Respuestas:

12

The Art of Unix Programming de ESR afirma que es:

Examinaremos troff con más detalle en el Capítulo 18; por ahora, es suficiente tener en cuenta que es un buen ejemplo de un impecable minilenguaje que raya en ser un intérprete completo (tiene condicionales y recurrencia pero no bucles; accidentalmente se completa con Turing).

("Accidentalmente" en lugar de m4, que se dice que es "deliberadamente completo de Turing").

muru
fuente
13

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.

Michael Homer
fuente
Sí, por supuesto, no es una cosa muy útil por sí misma, pero sigue siendo interesante, por ejemplo, incluso la instrucción mov está completa.
cutculus
44
@theindigamer - la instrucción de x86mov 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 una movinstrucció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 un jmppara crear un bucle alrededor de su bloque de movinstrucciones, 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.
Peter Cordes
66
@SpaceBison Por supuesto que hay :-) github.com/Battelle/movfuscator
Daniel Näslund
2
@ PeterCordes: Ah; en los viejos tiempos había arquitecturas de MOV de almacén que tenían ALU mapeadas en memoria e IP era solo otro registro, por lo que JMP era otro MOV.
Joshua
1
@Joshua: hecho curioso: el ARM de 32 bits expone a la PC como uno de los 16 registros enteros de propósito general. 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 una movo 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.
Peter Cordes