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_BIT
bity 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ć register
argumentów nieadresowalnych ( ). Zatem implementacja C, która pozwala na dowolną rekurencję i nie ma ograniczenia liczby register
obiektó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?