Se seguiamo il libro (o qualsiasi altra versione della specifica del linguaggio, se preferisci), quanta potenza computazionale può avere un'implementazione C?
Si noti che "implementazione C" ha un significato tecnico: è un'istanza particolare della specifica del linguaggio di programmazione C in cui è documentato il comportamento definito dall'implementazione. L'implementazione in CA non deve poter essere eseguita su un computer reale. Deve implementare l'intero linguaggio, inclusi tutti gli oggetti con una rappresentazione in stringa di bit e tipi con dimensioni definite dall'implementazione.
Ai fini di questa domanda, non esiste memoria esterna. L'unico input / output che è possibile eseguire è getchar
(per leggere l'input del programma) e putchar
(per scrivere l'output del programma). Inoltre, qualsiasi programma che invoca comportamenti indefiniti non è valido: un programma valido deve avere il suo comportamento definito dalla specifica C più la descrizione dell'implementazione dei comportamenti definiti dall'implementazione elencati nell'appendice J (per C99). Si noti che chiamare le funzioni di libreria che non sono menzionate nello standard è un comportamento indefinito.
La mia reazione iniziale è stata che un'implementazione C non è altro che un automa finito, perché ha un limite alla quantità di memoria indirizzabile (non è possibile indirizzare più di sizeof(char*) * CHAR_BIT
bit di memoria, poiché indirizzi di memoria distinti devono avere schemi di bit distinti quando memorizzati in un puntatore di byte).
Tuttavia, penso che un'implementazione possa fare di più. Per quanto ne so, lo standard non impone alcun limite alla profondità della ricorsione. Quindi puoi effettuare tutte le chiamate ricorsive alle funzioni che desideri, solo tutte le chiamate, tranne un numero finito, devono usare register
argomenti non indirizzabili ( ). Pertanto un'implementazione C che consente la ricorsione arbitraria e non ha limiti al numero di register
oggetti può codificare automi pushdown deterministici.
È corretto? Riesci a trovare un'implementazione C più potente? Esiste un'implementazione C completa di Turing?