Jeśli przejdziemy do tej książki (lub innej wersji specyfikacji języka, jeśli wolisz), ile mocy obliczeniowej może mieć implementacja języka C?
Należy zauważyć, że „implementacja C” ma znaczenie techniczne: jest to szczególna instancja specyfikacji języka programowania C, w której udokumentowano zachowanie zdefiniowane w implementacji. Implementacja AC nie musi być w stanie działać na rzeczywistym komputerze. Musi implementować cały język, w tym każdy obiekt mający reprezentację ciągu bitowego i typy o rozmiarze zdefiniowanym przez implementację.
Na potrzeby tego pytania nie ma pamięci zewnętrznej. Jedyne wejście / wyjście, które możesz wykonać, to getchar(aby odczytać wejście programu) i putchar(aby zapisać wyjście programu). Również każdy program, który wywołuje niezdefiniowane zachowanie, jest nieprawidłowy: jego zachowanie musi być zdefiniowane w specyfikacji C plus opis implementacji zachowań zdefiniowanych w implementacji wymieniony w załączniku J (dla C99). Zauważ, że wywoływanie funkcji bibliotecznych, które nie są wymienione w standardzie, jest niezdefiniowanym zachowaniem.
Moja początkowa reakcja była taka, że implementacja C jest niczym więcej niż automatem skończonym, ponieważ ma ograniczenie ilości adresowalnej pamięci (nie można adresować więcej niż sizeof(char*) * CHAR_BITbity pamięci, ponieważ różne adresy pamięci muszą mieć różne wzorce bitów podczas przechowywania we wskaźniku bajtowym).
Myślę jednak, że wdrożenie może zrobić więcej. O ile mi wiadomo, standard nie nakłada żadnych ograniczeń na głębokość rekurencji. Możesz więc wykonywać tyle rekurencyjnych wywołań funkcji, ile chcesz, tylko wszystkie oprócz ograniczonej liczby wywołań muszą używać registerargumentów nieadresowalnych ( ). Zatem implementacja C, która pozwala na dowolną rekurencję i nie ma ograniczenia liczby registerobiektów, może kodować deterministyczne automaty wypychające.
Czy to jest poprawne? Czy możesz znaleźć mocniejszą implementację C? Czy istnieje kompletna implementacja C Turinga?