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?

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".)


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.