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.