Si nous nous en remettons au livre (ou à toute autre version de la spécification du langage si vous préférez), quelle puissance de calcul une implémentation C peut-elle avoir?
Notez que «implémentation C» a une signification technique: il s'agit d'une instanciation particulière de la spécification du langage de programmation C où le comportement défini par l'implémentation est documenté. L'implémentation AC ne doit pas pouvoir fonctionner sur un ordinateur réel. Il doit implémenter le langage entier, y compris chaque objet ayant une représentation de chaîne de bits et les types ayant une taille définie par l'implémentation.
Aux fins de cette question, il n'y a pas de stockage externe. La seule entrée / sortie que vous pouvez effectuer est getchar
(pour lire l'entrée de programme) et putchar
(pour écrire la sortie de programme). De même, tout programme qui invoque un comportement non défini n'est pas valide: un programme valide doit avoir son comportement défini par la spécification C plus la description de l'implémentation des comportements définis par l'implémentation répertoriés dans l'annexe J (pour C99). Notez que l'appel de fonctions de bibliothèque non mentionnées dans la norme est un comportement non défini.
Ma première réaction a été qu'une implémentation C n'est rien de plus qu'un automate fini, car elle a une limite sur la quantité de mémoire adressable (vous ne pouvez pas adresser plus de sizeof(char*) * CHAR_BIT
bits de stockage, car les adresses de mémoire distinctes doivent avoir des modèles de bits distincts lorsqu'elles sont stockées dans un pointeur d'octets).
Cependant, je pense qu'une mise en œuvre peut faire plus que cela. Autant que je sache, la norme n'impose aucune limite à la profondeur de récursivité. Vous pouvez donc effectuer autant d'appels de fonction récursifs que vous le souhaitez, mais tous, sauf un nombre fini d'appels, doivent utiliser des register
arguments non adressables ( ). Ainsi, une implémentation C qui permet une récursion arbitraire et n'a pas de limite sur le nombre d' register
objets peut coder des automates déterministes de refoulement.
Est-ce correct? Pouvez-vous trouver une implémentation C plus puissante? Existe-t-il une implémentation C de Turing complète?