Если мы пойдем по книге (или любой другой версии спецификации языка, если вы предпочитаете), сколько вычислительной мощности может иметь реализация C?
Обратите внимание, что «реализация C» имеет техническое значение: это конкретный экземпляр спецификации языка программирования C, в котором задокументировано поведение, определяемое реализацией. Реализация AC не должна быть в состоянии работать на реальном компьютере. Он должен реализовывать весь язык, включая каждый объект, имеющий представление битовой строки, и типы, имеющие размер, определенный реализацией.
Для целей этого вопроса нет внешнего хранилища. Единственный ввод / вывод, который вы можете выполнить, - getchar
(для чтения ввода программы) и putchar
(для записи вывода программы). Также любая программа, которая вызывает неопределенное поведение, является недопустимой: допустимая программа должна иметь свое поведение, определенное спецификацией C, плюс описание реализации определенных поведением реализаций, приведенное в приложении J (для C99). Обратите внимание, что вызов библиотечных функций, которые не упомянуты в стандарте, является неопределенным поведением.
Моя первоначальная реакция заключалась в том, что реализация C - это не что иное, как конечный автомат, потому что он имеет ограничение на объем адресуемой памяти (вы не можете адресовать больше, чем sizeof(char*) * CHAR_BIT
биты памяти, так как разные адреса памяти должны иметь разные битовые комбинации при хранении в байтовом указателе).
Однако я думаю, что реализация может сделать больше, чем это. Насколько я могу судить, стандарт не ограничивает глубину рекурсии. Таким образом, вы можете сделать столько рекурсивных вызовов функций, сколько захотите, только все, кроме конечного числа вызовов, должны использовать register
аргументы non-addressable ( ). Таким образом, реализация C, которая допускает произвольную рекурсию и не имеет ограничений на количество register
объектов, может кодировать детерминированные автоматы нажатия.
Это верно? Можете ли вы найти более мощную реализацию C? Существует ли полная реализация Тьюринга C?