È effettivamente possibile avere un linguaggio di programmazione 'utile' che non sia completo di Turing?


37

Laddove si accetta che una lingua deve essere completa di Turing per essere valida, è effettivamente possibile avere un linguaggio di programmazione "utile" che non sia completo di Turing?

Dovrei chiarire che si tratta in modo abbastanza specifico della "programmazione" dei linguaggi in senso tradizionale e non dei linguaggi di markup o query.


3
@PhonicUK All'inizio SQL non era completo
Ryathal

4
@Ryathal SQL non è un linguaggio di programmazione, è un linguaggio di query.
yannis,

2
@PhonicUK la tua domanda nel commento è effettivamente utile, cambia la domanda pubblicata in quella o verrà chiusa come non costruttiva. Esistono in realtà lingue complete non turing utili e sarei interessato a sentirne i dettagli.
Jimmy Hoffa,

5
regex non è completo ma è ampiamente usato
maniaco del cricchetto

3
@DavidHammen Le implementazioni effettive sono limitate, sì, a causa dei limiti del nostro universo fisico (può solo costruire memoria finita, può far funzionare la macchina solo per un tempo limitato prima che non funzioni correttamente). Ma ciò non significa che le lingue siano limitate. IOW le specifiche di un linguaggio completo non richiedono un'implementazione dall'imposizione di tali limiti a un programma, mentre un linguaggio non TC richiede, ad esempio, una prova della risoluzione.

Risposte:


48

Coq , Agda , HOL e ACL2 sono linguaggi molto utili ed estremamente potenti, sebbene non siano completi di Turing.

Una caratteristica comune che li rende non completi di Turing è il fatto che è sempre possibile provare la risoluzione. È sufficiente una limitazione molto semplice: le chiamate ricorsive sono consentite solo a condizioni notevolmente più piccole strutturalmente. Pertanto, sebbene non sia possibile implementare un interprete per un linguaggio completo di Turing o anche per il linguaggio stesso, sono ancora possibili molte altre cose utili , come un compilatore C certificato .


2
Per coloro che non hanno familiarità con quelle lingue, potresti approfondire ciò che manca che non le rende complete e alcuni esempi di cose costruite con quelle lingue?
PhonicUK,

8
@PhonicUK: un compilatore C non è un'implementazione C . È uno strumento che trasforma il codice in una lingua (C) in un'altra (di solito codice macchina). Ciò non significa che il compilatore C stesso sia equivalente a qualsiasi programma C casuale.
Joachim Sauer,

9
@PhonicUK, non è possibile implementare un interprete per una lingua completa di Turing in una lingua non completa di Turing. Ma puoi ovviamente implementare un compilatore (dal momento che una CPU completa di Turing farà una valutazione effettiva).
SK-logic,

11
@ SK-logic: "Certo?" È possibile solo per C perché è un linguaggio abbastanza semplice. Non è possibile per C ++ perché un compilatore deve interpretare il codice modello (che è Turing completo al momento della compilazione).
MSalters,

11
@MSalters Sì, se la compilazione della lingua è in fase di completamento, un compilatore deve essere scritto in una lingua completa. Anche questo è abbastanza ovvio (per non dire tautologico). Tuttavia, si noti che lo standard C ++ consente limiti ai programmi di input, come una profondità di valutazione massima per le istanze di template (e le implementazioni esistenti si prendono questa libertà). Se non sbaglio ciò significa che potrebbe essere possibile un compilatore C ++ completo senza turing (salvo problemi non correlati, ovviamente).

12

Penserei che il termine "mini-lingua" di Yegge si riferisca al fatto che spesso è utile usare una lingua per problemi specifici in cui la lingua non richiede completezza turing per svolgere il compito, e questo va al cuore di come non -turare lingue complete può essere utile. https://sites.google.com/site/steveyegge2/language-grubbing

Wikipedia risponde molto bene, proprio in linea con quanto affermato dal mio istinto. Prima stavo pensando alla matematica pura, poi mi sono ricordato di regexp, e Wikipedia elenca Epigram che credo sarebbe nella vena della "matematica pura".

http://en.wikipedia.org/wiki/Turing_completeness#Non-Turing-complete_languages

Lingue non complete di Turing

Esistono molti linguaggi computazionali che non sono completi di Turing. Uno di questi esempi è l'insieme di linguaggi regolari, più comunemente espressioni regolari, che sono generati da automi finiti. Un'estensione più potente ma ancora non completa di Turing di automi finiti è la categoria di automi pushdown e grammatiche senza contesto, che sono comunemente utilizzate per generare alberi di analisi in una fase iniziale di compilazione del programma. Ulteriori esempi includono alcune delle prime versioni dei linguaggi pixel shader incorporati nelle estensioni Direct3D e OpenGL o una serie di formule matematiche in un foglio di calcolo senza cicli. [Citazione necessaria] Nei linguaggi di programmazione funzionale totale, tutte le funzioni sono totali e devono terminare, come Charity ed Epigram. La carità utilizza un sistema di tipi e controlla i costrutti basati sulla teoria delle categorie,

Lingue dei dati

La nozione di completezza di Turing non si applica a linguaggi come XML, JSON, YAML e espressioni S, poiché sono generalmente utilizzati per rappresentare dati strutturati, non per descrivere il calcolo. Talvolta vengono definiti linguaggi di markup o più correttamente "linguaggi di descrizione dei dati".

Indica anche che le rappresentazioni della struttura dei dati non sono linguaggi, ma penso che XSLT debba essere considerato come una rappresentazione del calcolo, forse XPath non si basa su ciò che Yannis ha detto sopra sul fatto che SQL sia un linguaggio di query e non un linguaggio di calcolo. Forse T-SQL o PL / SQL contano come linguaggi di calcolo anche se dal momento che è possibile eseguire una grande quantità di calcoli usando i loro aggregati, dove la forma generalizzata di SQL non specifica forse aggregati.


8

Capisco che SQL è abbastanza popolare tra i tipi di business


3
SQL è un linguaggio di query, non un linguaggio di programmazione.
PhonicUK,

4
@PhonicUK: e qual è esattamente la differenza tra un linguaggio di query e un linguaggio di programmazione?
Joachim Sauer,

8
@PhonicUK - Tex è un linguaggio di markup di testo ed è completo Turing
Martin Beckett,

3
le implementazioni sql moderne, per quanto ne so, sono in via di completamento.
shabunc,

6
@shabunc IIRC solo con procedure memorizzate. L'argomento diventa un po 'circolare, se non è Turing completo, allora non è un linguaggio di programmazione - quindi tutti i linguaggi di "programmazione" sono TC
Martin Beckett,

5

La completezza di Turing è necessaria affinché una lingua sia adatta all'uso come lingua di uso generale. Ma non è sufficiente , ovvero solo perché è Turing completo, non è adatto a tutti i domini problematici:

  • Whitespace ha dimostrato di essere Turing completo ma ovviamente non è adatto per qualsiasi dominio problematico al di fuori dell'intrattenimento del programmatore.
  • I modelli C ++ sono stati dimostrati completi di Turing, ma in realtà non avresti mai scritto interi programmi con loro.

Al contrario, una DSL è adatta al dominio problematico per cui è stata progettata (supponendo che sia stata effettivamente progettata in modo decente), anche senza completezza di Turing:

  • HTML * fornisce un modo conciso per descrivere un albero DOM. Mentre JavaScript è Turing completo e può essere usato per fare lo stesso, è molto più rumoroso e poco chiaro
  • XPath e altri linguaggi di query, PCRE senza codice incorporato e simili sono tutti strumenti potenti per il singolo lavoro per cui sono stati progettati

* IIRC è stato dimostrato che l'HTML con animazioni CSS è Turing completo utilizzandole per implementare il gioco della vita di Conway su una serie di caselle di controllo. Ma l'utilità dell'HTML è valida anche nei browser che non supportano le animazioni CSS.


2
Hai un link a Conway's Life implementato in CSS?
RBerteig,

Non conosco un'implementazione CGOL nei CSS, ma so che la regola 110 è stata implementata. Non riesco a trovarlo, sembra che sia stato spostato.
Christian Mann,


-1 Molto interessante ma non affronta la domanda posta
mattnz,

2
@mattnz: sbagliato. Fornisco esempi concreti di linguaggi non completi di Turing che sono utili, che ritengo sia una risposta appropriata a "È effettivamente possibile avere un linguaggio di programmazione" utile "che non sia completo di Turing?", Non diversamente da un'altra risposta qui
back2dos,

3

In realtà esistono linguaggi di programmazione, in cui è possibile scrivere solo programmi "efficienti". Efficiente in questo senso significa che ogni programma scritto in una tale lingua rappresenta una lingua in P. Bellantoni, Niggl e Schwichtenberg descrivono un linguaggio del genere qui .


1

Il preprocessore C non è completo di Turing (in base alla progettazione), ma può comunque implementare un interprete per una lingua che è completa di Turing (Ordinare il linguaggio, come descritto nella documentazione, è fondamentalmente solo un run-of-the- macinare cose di tipo ML / Schema puramente funzionali, e sarebbe relativamente irrilevante - probabilmente abbastanza bello da usare - se non fosse per l'implementazione insolita).

Il trucco dietro è simile agli argomenti sopra sull'implementazione di qualsiasi macchina di Turing in un universo fisico finito: il preprocessore C non può fornire un numero infinito di passaggi, o celle di dati, al linguaggio, ma può:

  1. fornire un numero dinamico irragionevolmente grande (2 ^ 64 circa per impostazione predefinita), abbastanza grande per risolvere i problemi più realistici usando un processo di espansione esponenziale ( mumble mumble life of the world mumble ).

  2. utilizzare un limite statico arbitrario per il numero sopra indicato, ovvero mentre il numero di passaggi deve essere un numero finito, è possibile modificare il limite specifico in fase di "compilazione" modificando le impostazioni statiche del motore dell'interprete. Poiché non esiste un limite (teorico) al valore effettivo di questo limite, esso può (teoricamente) essere esteso per adattarsi ai requisiti di spazio per qualsiasi programma di terminazione.

Non sostenere che l'Ordine sia necessariamente "utile" in sé o che qualsiasi motore implementato da CPP lo sarebbe, ma è una prova interessante del concetto. È anche presumibilmente tipizzato in modo dinamico , il che è insolito per questa zona.


Voto per borbottare nel mezzo della lezione.
jpaugh

-1

Sì, in effetti è possibile avere un linguaggio utile che non è completo di Turing. Vedi qui: http://tkatchev.bitbucket.org/tab/examples.html

Un altro esempio di un utile linguaggio incompleto di Turing è SQL. (E ancora un altro sono fogli di calcolo come Gnumeric o Excel, anche se in realtà non sono linguaggi di programmazione.)

Per quanto riguarda il motivo per cui vorresti una lingua che non fosse completa di Turing: perché ciò ti consente di fare delle forti garanzie sul comportamento in fase di esecuzione.

Completare Turing, in parole povere, significa avere una capacità di ricorsione. Avere la ricorsione significa avere strutture potenzialmente illimitate in memoria. Poiché nel mondo reale la memoria non è infinita, la completezza di Turing richiede la gestione della memoria e / o la raccolta dei rifiuti.

Vietare la ricorsione è un ottimo modo per evitare il problema davvero, davvero difficile della gestione delle risorse.

Nota bene! Essere Turing incompleto non implica necessariamente che qualsiasi programma verrà necessariamente interrotto. Un linguaggio incompleto di Turing potrebbe consentire di valutare un elenco pigro infinito.


-1

Un interessante "linguaggio di programmazione sub-Turing" non è stato menzionato fino ad ora, quindi lo aggiungerò.

Si chiama "Crema" . Si descrive come:

Crema è un front-end LLVM che mira specificamente a eseguire nello spazio completo sub-Turing. Progettato per essere semplice da imparare e pratico per la maggior parte delle attività di programmazione necessarie, Crema può limitare la complessità computazionale del programma al minimo necessario per migliorare la sicurezza.

È piuttosto minimalista e piuttosto basso livello.

Dovrebbe apparire familiare agli sviluppatori C.

Inizialmente è stato finanziato dalla Defense Advanced Research Projects Agency (DARPA), ma al momento non sembra abbastanza mantenuto. Ma forse qualcuno è comunque interessato.

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.