Tak, troff jest ukończony przez Turinga. Obsługuje dowolną rekurencję i rozgałęzienie warunkowe, co jest wystarczające. Posiada również rejestry i różne inne sposoby przechowywania danych, co daje kolejną ścieżkę.
Kompletność Turinga nie oznacza, że wysoce złożone programy są praktyczne - po prostu, że są teoretycznie możliwe, w jakiś sposób, na pewnym poziomie usunięcia - i nie oznacza to, że ich brak, więc ani troff nie jest Turingiem kompletnym, ani brak skomplikowanych programów nie sugeruje niczego w ten czy inny sposób.
Kompletność Turinga nie jest na ogół właściwością, która oznacza coś przydatnego dla użytkownika. Oznacza to tylko, że możesz na nim symulować maszynę Turinga, a nie to, że chcesz, i że wynik, który z niej uzyskasz, jest podobny do tego, co możesz przeczytać. Dane wejściowe lub wyjściowe mogą być po prostu liczbą, a nawet liczbą pojawień się czegoś, a nie czymś użytecznym, a rodzajami maszyn, które symulujesz, a ich programy są często ledwo zrozumiałe.
Wiele języków i systemów są incydentalnie Turinga kompletne, ale nie dość do jakiegokolwiek rzeczywistego programowania w tej podgrupie (np Gra w życie lub CSS), a niektóre z języków, które są przydatne dla prawdziwego programowania nie są Turing-complete (na przykład, Agda). Charakterystyczne cechy naprawdę są takie, że możesz
- idź wiecznie
- zapamiętaj tyle danych, ile chcesz
- wybierz, co jeszcze zrobić
Często te właściwości - szczególnie brak zakończenia - są w rzeczywistości niepożądane, być może nawet w przypadku troffa. Poza teoretyczną informatyką i projektowaniem języka, kompletność Turinga nie jest tak naprawdę interesującą właściwością w danym czasie, mimo że jest chwytliwa.
mov
instrukcja jest Turing-zupełny. (Ze względu na tryby adresowania, które pozwalają korzystać z tabel odnośników, a ten sam mnemonik służy do ładowania, przechowywania i mov-natychmiastowego do rejestracji.) Na wielu innych programach ISA, które mająmov
instrukcję (np. ARM), jest to po prostu rejestr reg i nie jest kompletny. (Chociaż w ARM może zmieniać / obracać.) Ponadto, naprawdę potrzebujeszjmp
utworzyć pętlę wokół blokumov
instrukcji, chyba że jesteś w trybie 16-bitowym, w którym wskaźnik instrukcji może zawijać się w segmencie kodu 64k pętla niejawnie.push {r4, lr}
/pop {r4,pc}
jest powszechny w funkcjach, które muszą zapisywać / przywracać jeden rejestr zachowany na wywołanie i utrzymywać stos w wyrównaniu: zapisują również link reg i wrzucają go z powrotem do licznika programu, aby zwrócić. (32-bitowe instrukcje ARM do przechowywania / ładowania-wielu używają pola bitowego, aby wskazać, które rejestry mają przechowywać / ładować.) Tak, możesz użyć komputera jako miejsca docelowegomov
instrukcji lub dowolnej instrukcji. Nie wiedziałem jednak, że w przeszłości było to powszechne. Ale słyszałem o ISA uruchamianych przez transport.