O Troff Turing está completo?

9

O Troff suporta as definições de macro usando .dee ramificando usando .if(consulte as páginas 5 e 6 do manual do usuário do Troff ). Nesses dois aspectos, é muito parecido com o TeX. No entanto, não conheço programas altamente complexos escritos em Troff (ao contrário do TikZ for TeX). O Troff Turing está completo?

cutícula
fonte

Respostas:

12

A Arte da Programação Unix da ESR afirma que é:

Examinaremos o troff com mais detalhes no capítulo 18; por enquanto, basta observar que é um bom exemplo de uma minilíngua imperativa que se limita a ser um intérprete de pleno direito (possui condicionais e recursão, mas não loops; é acidentalmente concluído por Turing).

("Acidentalmente", em oposição a m4, que se diz "deliberadamente completo de Turing".)

muru
fonte
13

Sim, o troff é Turing completo. Ele suporta recursão arbitrária e ramificação condicional, o que é suficiente. Ele também possui registradores e várias outras maneiras de armazenar dados, o que fornece outro caminho novamente.

A completude de Turing não implica que programas altamente complexos sejam práticos - apenas que eles são teoricamente possíveis, de alguma forma, em algum nível de remoção - e nem sua ausência implica que não sejam, de modo que nem o troff é Turing-complete nem o a ausência de programas complexos não sugere nada de um jeito ou de outro sobre isso.


Turing completude não é, geralmente, uma propriedade que significa algo útil para você, usuário. Tudo o que isso significa é que você pode simular uma máquina de Turing com ela, não que você queira, e não que a saída que você obteria seja algo parecido com o que você esperaria ler. A entrada ou saída pode ser apenas um número, ou mesmo o número de vezes que algo aparece, em vez de algo útil, e os tipos de máquina que você acaba simulando e seus programas geralmente são pouco compreensíveis para começar.

Muitas línguas e sistemas são Turing-complete aliás, mas não razoavelmente aplicável para qualquer tipo de programação real em que subconjunto (por exemplo, o jogo de Conway da vida ou CSS), e algumas línguas que são úteis para a programação real não são Turing completo (por exemplo, Agda). As características definidoras são realmente que você pode

  • continue indo para sempre
  • lembre-se da quantidade de dados que desejar
  • escolha o que fazer, se houver, a seguir

Frequentemente, essas propriedades - principalmente a não rescisão - são realmente indesejáveis, possivelmente incluindo troff. Fora da ciência da computação teórica e do design da linguagem, a integridade de Turing não é uma propriedade muito interessante praticamente da época, apesar de cativante.

Michael Homer
fonte
Sim, é claro, não é uma coisa muito útil por si só, mas ainda é interessante - por exemplo, mesmo a instrução mov é Turing completa.
Cutculus
4
@theindigamer - x86 's movinstrução é Turing completo. (Devido aos modos de endereçamento que permitem usar tabelas de pesquisa, o mesmo mnemônico é usado para carregar, armazenar e mover imediatamente para registrar.) Em muitos outros ISAs que possuem movinstruções (por exemplo, ARM), é apenas uma mudança reg-reg e não está completo. (Embora no ARM ele possa alternar / girar.) Além disso, você realmente precisa jmpcriar um loop em torno do seu bloco de movinstruções, a menos que esteja no modo de 16 bits em que o ponteiro da instrução possa envolver um segmento de código de 64k para loop implicitamente.
Peter Cordes
6
@SpaceBison É claro que existe :-) github.com/Battelle/movfuscator
Daniel Näslund
2
@ PeterCordes: Ah; antigamente, as arquiteturas MOV que tinham ALUs e IP mapeadas na memória eram apenas mais um registro; portanto, o JMP era outro MOV.
Joshua
1
@ Josué: curiosidade: o ARM de 32 bits expõe o PC como um dos 16 registros inteiros de uso geral. push {r4, lr}/ pop {r4,pc}é comum em funções que precisam salvar / restaurar um registro preservado de chamada e manter a pilha alinhada: eles também salvam o registro de link e o colocam de volta no contador do programa para retornar. (As instruções de armazenamento / carregamento múltiplo do ARM de 32 bits usam um campo de bits para indicar quais registros armazenar / carregar.) E sim, você pode usar o PC como destino de uma movou de qualquer instrução. Eu não sabia que isso era comum no passado. Mas eu tinha ouvido falar de ISAs acionados por transporte.
Peter Cordes