Si seguimos el libro (o cualquier otra versión de la especificación del lenguaje si lo prefiere), ¿cuánta potencia computacional puede tener una implementación de C?
Tenga en cuenta que "implementación C" tiene un significado técnico: es una instanciación particular de la especificación del lenguaje de programación C donde se documenta el comportamiento definido por la implementación. La implementación de CA no tiene que poder ejecutarse en una computadora real. Tiene que implementar todo el lenguaje, incluidos todos los objetos que tienen una representación de cadena de bits y los tipos que tienen un tamaño definido por la implementación.
A los efectos de esta pregunta, no hay almacenamiento externo. La única entrada / salida que puede realizar es getchar
(para leer la entrada del programa) y putchar
(para escribir la salida del programa). Además, cualquier programa que invoque un comportamiento indefinido no es válido: un programa válido debe tener su comportamiento definido por la especificación C más la descripción de la implementación de los comportamientos definidos por la implementación enumerados en el apéndice J (para C99). Tenga en cuenta que llamar a funciones de biblioteca que no se mencionan en el estándar es un comportamiento indefinido.
Mi reacción inicial fue que una implementación en C no es más que un autómata finito, ya que tiene un límite en la cantidad de memoria direccionable (no se puede direccionar más que sizeof(char*) * CHAR_BIT
bits de almacenamiento, ya que distintas direcciones de memoria deben tener patrones de bits distintos cuando se almacenan en un puntero de byte).
Sin embargo, creo que una implementación puede hacer más que esto. Por lo que puedo decir, el estándar no impone ningún límite en la profundidad de la recursión. Por lo tanto, puede realizar tantas llamadas a funciones recursivas como desee, solo todas menos un número finito de llamadas deben usar register
argumentos no direccionables ( ). Por lo tanto, una implementación en C que permite la recursión arbitraria y no tiene límite en el número de register
objetos puede codificar autómatas de pushdown determinista.
¿Es esto correcto? ¿Puedes encontrar una implementación de C más potente? ¿Existe una implementación de Turing-complete C?