Puoi specificare un linguaggio di programmazione senza implementazione?


11

È teoricamente possibile specificare un linguaggio di programmazione per il quale non potrebbe esistere alcuna implementazione? Un linguaggio di programmazione è un modo per definire le funzioni. Un'implementazione indica un metodo per eseguire un determinato programma in quella lingua su un dato input all'output della funzione corrispondente al programma su quell'input.

Quali sono i requisiti minimi di una tale lingua?


3
Che cos'è una "implementazione" di una lingua?
Raffaello

@Raphael: Sei tu che hai cambiato "language lang" in "language". Prima della tua modifica, era chiaro cosa significasse un'implementazione di una lingua.
Tsuyoshi Ito,

@TsuyoshiIto: Non del tutto; Ho adattato il titolo solo alla domanda, che è stata modificata su cstheory.SE. L'ho cambiato di nuovo, ma non è ancora chiaro cosa significhi. Un compilatore? Un interprete? Ad ogni modo, durante la migrazione di una domanda che ha quasi un anno e da un utente che apparentemente non ha mai rivisitato la domanda, nella migliore delle ipotesi è stato sconsigliato.
Raffaello

@Raphael: Chiedere "cos'è un'implementazione di una lingua?" dopo aver rimosso tutti gli indizi era semplicemente oltre la mia comprensione. Ma sono d'accordo sul fatto che la domanda non era chiara fin dall'inizio.
Tsuyoshi Ito,

Penso che la tua presunta definizione di "linguaggio di programmazione" sia mal concepita. Dovrebbe almeno essere modificato sostituendo "funzioni" con "funzioni calcolabili". Altrimenti, non è chiaro il motivo per cui dovresti scegliere di chiamare la lingua un "linguaggio di programmazione". Una volta modificato, la domanda diventa insignificante, poiché non esistono "linguaggi di programmazione per i quali non esiste alcuna implementazione".
Uday Reddy,

Risposte:


7

Di solito, l'implementazione di un linguaggio di programmazione sta almeno dando un interprete in una lingua (o un compilatore a una lingua) che non è altro che Turing-complete.

Usando questa "definizione" possiamo specificare un linguaggio di programmazione come questo:

  • esiste un solo programma possibile HALT;

  • specifica di HALT: è una funzione che risolve il problema di arresto .

L'implementazione di questo linguaggio di programmazione richiede la risoluzione del problema di arresto con l'implementazione. (Il che è impossibile poiché la nostra implementazione non dovrebbe essere più potente di una macchina Turing).

Le specifiche gestiscono la logica e quindi possono chiedere molto di più. Un'altra specifica che sarà impossibile da implementare è "false". (O qualsiasi frase contraddittoria nella specifica) Ma questa non sembra una specifica, motivo per cui ho usato l'esempio del problema di arresto.


1
Generalizzato: qualsiasi linguaggio che specifica una funzione che risolve un problema indecidibile non può essere implementato.
edA-qa mort-ora-y

@ edA-qamort-ora-y Tecnicamente potrebbe essere implementato. Non puoi decidere il problema dell'arresto, ma una TM può simulare un'altra macchina e accettare se la macchina si ferma; il linguaggio accettato da tale TM è esattamente il linguaggio delle (codifiche di) macchine che si fermano. Ma per scopi pratici normalmente ci piace che le operazioni primitive dei linguaggi di programmazione siano garantite da terminare! (almeno su input "sensibili")
Ben

1
O()

1/0 let loop = loop in loopΩ()

3

Solo una nota a margine curiosa: il motore di template C ++ è Turing-completo

Teorema 1: in assenza di limiti di istanza, i modelli C ++ sono Turing-completi.

Corollario 1: in assenza di limiti di istanza, è indecidibile se un compilatore C ++ si fermerà durante la compilazione di un determinato programma.

... quindi lo stesso C ++ può essere considerato un linguaggio di programmazione per il quale non esiste alcuna "implementazione" ... MrGreen


Quindi un "compilatore" C può essere usato come interprete se non ci si preoccupasse del codice generato ma semplicemente della diagnostica prodotta?
supercat

Sì, come mostrato nel documento, il compilatore si arresta con un elenco di errori che corrispondono alla cronologia di calcolo della macchina Turing (e alla sua configurazione nastro finale). Ovviamente l'input non può essere interattivo (deve essere codificato nel codice sorgente prima di eseguire il compilatore).
Vor

2

Non è chiaro cosa si intende per "linguaggio di programmazione" e "implementazione di un linguaggio". È necessario fornire definizioni rigorose di questi due per ottenere una risposta.

Σ*2Σ*

MM0

Ma questo non è il tipo di linguaggio di specifica che le persone intendono quando usano la frase "linguaggio di programmazione". Un linguaggio di programmazione è in genere inteso come un linguaggio per esprimere funzioni calcolabili (processi, ...) e per comunicare le istruzioni a una macchina e quindi esiste una TM che può simulare quei suoi programmi e produrre i loro risultati. Quindi, in un certo senso, avere un linguaggio di programmazione che non può essere implementato non è significativo.

(La mia ipotesi è che probabilmente stai confondendo i linguaggi di programmazione con linguaggi di specifica o linguaggi formali . In ogni caso, possiamo definire linguaggi che non sono calcolabili.)


Sono abbastanza sicuro che "linguaggio di programmazione" significhi un linguaggio di programmazione come normalmente ne parleremmo, e "un'implementazione di un linguaggio" significa un ambiente per eseguire programmi in quel linguaggio su computer reali. La domanda non è formalizzata , ma sicuramente non è chiara? Posso facilmente scrivere una specifica per un nuovo linguaggio di programmazione senza preoccuparmi di implementarlo; la domanda è semplicemente chiedersi se è possibile farlo in modo tale che la lingua non possa essere implementata.
Ben

@Ben, se guardi alla domanda originale su cstheory vedrai che non c'è nessuna parola di programmazione nella domanda solo nel titolo. La domanda posta da OP è decisamente chiara. ps: Sarei interessato a una definizione rigorosa (non deve essere formale) di cosa sia un linguaggio di programmazione. Non possiamo dimostrare risultati negativi sui linguaggi di programmazione basati esclusivamente su intuizione ed esempi. Se hai un riferimento per una definizione, ti preghiamo di pubblicarlo come modifica o commento alla domanda.
Kaveh,

Abbastanza giusto, anche se SE afferma di aver risposto 9 ore fa, molto tempo dopo che è stato migrato e modificato. Continuerei comunque a fare la stessa interpretazione sulla base della domanda originale. Per quanto riguarda la definizione di un linguaggio di programmazione, direi che un ovvio è una grammatica formale più una riduzione ad un altro modello computazionale ben compreso (calcolo lambda, turing machine, ecc.) O una rigorosa semantica operativa. Il modello di riduzione renderebbe la risposta a questa domanda un banale "no", ovviamente.
Ben

1

Ci sono state molte lingue specificate senza un'implementazione, ad esempio Algol 60 avrebbe dovuto essere una lingua per scrivere algoritmi, da non implementare. Alcuni dei molti linguaggi "solo per divertimento" sono stati specificati molto prima che arrivasse un'implementazione, mi viene in mente Intercal.

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.