Troff Turing è completo?


9

Troff supporta entrambe le definizioni di macro usando .dee ramificando usando .if(vedere le pagine 5 e 6 del manuale dell'utente di Troff ). Sotto questi due aspetti, è molto simile a TeX. Tuttavia, non conosco programmi molto complessi scritti in Troff (a differenza di TikZ per TeX). Troff Turing è completo?

Risposte:


12

The Art of Unix Programming di ESR afferma che è:

Esamineremo troff in modo più dettagliato nel capitolo 18; per ora, è sufficiente notare che è un buon esempio di un minilingue imperativo che rasenta l'essere un interprete a tutti gli effetti (ha condizionali e ricorsione, ma non loop; è accidentalmente Turing-completo).

("Accidentalmente" al contrario di m4, che si dice sia "deliberatamente Turing-completo".)


13

Sì, Troff è Turing completo. Supporta la ricorsione arbitraria e la ramificazione condizionale, il che è sufficiente. Ha anche registri e vari altri modi per archiviare i dati, il che ti dà di nuovo un altro percorso.

La completezza di Turing non implica che programmi molto complessi siano pratici - solo che teoricamente sono possibili, in qualche modo, a un certo livello di rimozione - e nemmeno la sua assenza implica che non lo siano, quindi né Troff è Turing-completo né il l'assenza di programmi complessi non suggerisce nulla in un modo o nell'altro.


La completezza di Turing non è, in genere, una proprietà che significa qualcosa di utile per l'utente. Tutto ciò che significa è che puoi simulare una macchina Turing con essa, non che vorresti, e non che l'output che otterrai da esso è qualcosa di simile a quello che ti aspetteresti di leggere. L'input o l'output potrebbero essere solo un numero, o anche il numero di volte in cui appare qualcosa, piuttosto che qualcosa di utile, e il tipo di macchina che finisci per simulare e i loro programmi sono spesso appena comprensibili per cominciare.

Molte lingue e sistemi sono casualmente completi di Turing ma non ragionevolmente applicabili per qualsiasi programmazione effettiva in quel sottoinsieme (ad esempio, Game of Life o CSS di Conway), e alcuni linguaggi che sono utili per la vera programmazione non sono completi di Turing (ad esempio, Agda). Le caratteristiche distintive sono davvero che puoi

  • continua per sempre
  • ricorda tutti i dati che vuoi
  • scegli cosa fare, se non altro, dopo

Spesso queste proprietà, in particolare la non terminazione, sono in realtà indesiderabili, probabilmente anche per il troff. A parte l'informatica teorica e la progettazione del linguaggio, la completezza di Turing non è una proprietà terribilmente interessante praticamente del tempo, nonostante sia accattivante.


Sì, certo, non è di per sé una cosa molto utile, ma è comunque interessante, ad esempio anche l'istruzione mov è Turing completa.
cutculus,

4
@theindigamer - Le istruzioni di x86mov sono Turing complete. (A causa delle modalità di indirizzamento che ti consentono di utilizzare le tabelle di ricerca e lo stesso mnemonico viene utilizzato per il caricamento, l'archiviazione e il movimento immediato per la registrazione.) Su molti altri ISA che hanno movun'istruzione (ad esempio ARM) è solo una mossa reg-reg e non è completo. (Anche se su ARM può fare turni / rotazioni.) Inoltre, in realtà è necessario jmpcreare un ciclo attorno al blocco di movistruzioni, a meno che non ci si trovi in ​​modalità 16 bit in cui il puntatore dell'istruzione può spostarsi in un segmento di codice 64k per loop implicitamente.
Peter Cordes,

6
@SpaceBison Naturalmente c'è :-) github.com/Battelle/movfuscator
Daniel Näslund

2
@PeterCordes: Ah; ai vecchi tempi esistevano architetture MOV che avevano memoria mappata ALU e IP era solo un altro registro, quindi JMP era un altro MOV.
Joshua,

1
@Joshua: fatto divertente: ARM a 32 bit espone il PC come uno dei 16 registri interi per tutti gli usi. push {r4, lr}/ pop {r4,pc}è comune nelle funzioni che devono salvare / ripristinare un registro conservato per le chiamate e mantenere lo stack allineato: salvano anche il registro dei collegamenti e lo fanno rientrare nel contatore del programma per tornare. (Le istruzioni multiple di memorizzazione / caricamento di ARM a 32 bit utilizzano un campo di bit per indicare quali registri archiviare / caricare.) E sì, è possibile utilizzare il PC come destinazione di una movo qualsiasi istruzione. Non sapevo che fosse comune in passato, però. Ma avevo sentito parlare di ISA innescati dai trasporti.
Peter Cordes,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.