Якщо ми підемо за книгою (або будь-якою іншою версією специфікації мови, якщо вам зручніше), яку обчислювальну потужність може мати реалізація C?
Зауважте, що "реалізація C" має технічне значення: це особливе опис специфікації мови програмування C, де документально визначена поведінка. Реалізація змінного струму не повинна працювати на фактичному комп’ютері. Він повинен реалізувати всю мову, включаючи кожен об'єкт, що має представлення бітових рядків і типи, що мають розмір, визначений реалізацією.
Для цього питання немає зовнішнього сховища. Єдиний вхід / вихід, який ви можете виконати, - це getchar
(для читання введення програми) та putchar
(для запису програмного результату). Також недійсна будь-яка програма, яка викликає невизначене поведінку: дійсна програма повинна мати свою поведінку, визначену специфікацією C плюс опис реалізації поведінки, визначеної в додатку J (для C99). Зауважте, що виклики функцій бібліотеки, які не згадуються у стандарті, є невизначеною поведінкою.
Моя початкова реакція полягала в тому, що реалізація C - це не що інше, як обмежений автомат, оскільки він має обмеження на кількість адресируемой пам'яті (ви не можете адресувати більше sizeof(char*) * CHAR_BIT
бітів пам’яті, оскільки окремі адреси пам'яті повинні мати чіткі бітові шаблони при зберіганні у байтовому покажчику).
Однак я думаю, що реалізація може зробити більше, ніж це. Наскільки я можу сказати, стандарт не встановлює обмежень на глибину рекурсії. Таким чином, ви можете робити стільки рекурсивних викликів функцій, скільки вам потрібно, лише всі, окрім обмеженої кількості дзвінків, повинні використовувати register
аргументи, що не адресовані ( ). Таким чином, реалізація C, яка дозволяє довільну рекурсію і не обмежує кількість register
об'єктів, може кодувати детерміновані автоматичні витиски.
Це правильно? Чи можете ви знайти більш потужну реалізацію C? Чи існує реалізація системи Turing?