Да, troff завершен по Тьюрингу. Он поддерживает произвольную рекурсию и условное ветвление, что достаточно. Он также имеет регистры и различные другие способы хранения данных, что снова дает вам другой путь.
Полнота Тьюринга не означает, что очень сложные программы являются практичными - просто они теоретически возможны, так или иначе, на некотором уровне удаления - и при этом их отсутствие не подразумевает, что они не являются таковыми, поэтому ни troff не является Turing-complete или Отсутствие сложных программ ничего не говорит об этом.
Полнота Тьюринга, как правило, не является свойством, которое означает что-то полезное для пользователя. Все это означает, что вы можете имитировать машину Тьюринга с ее помощью, а не то, что вам хотелось бы, и не то, что выходные данные, которые вы получите от нее, не похожи на то, что вы ожидаете прочитать. Входные или выходные данные могут быть просто числом или даже числом раз, когда что-то появляется, а не что-то полезное, и виды машин, которые вы в конечном итоге моделируете, и их программы зачастую едва различимы для начала.
Многие языки и системы являются случайно полными по Тьюрингу, но неприемлемо применимыми для любого реального программирования в этом подмножестве (например, Игра жизни Конвея или CSS), а некоторые языки, которые полезны для реального программирования, не полны по Тьюрингу (например, Agda). Определяющими характеристиками действительно являются то, что вы можете
- продолжать идти вечно
- запомните столько данных, сколько вы хотите
- выбрать, что делать дальше
Часто эти свойства - особенно недопущение - на самом деле нежелательны, возможно, в том числе и для troff. Вне теоретической информатики и языкового дизайна, полнота по Тьюрингу не очень интересна практически в то время, несмотря на то, что она запоминающаяся.
mov
инструкция по Тьюрингу. (Из-за режимов адресации, которые позволяют вам использовать таблицы поиска, и та же самая мнемоника используется для загрузки, сохранения и перемещения непосредственно для регистрации.) На многих других ISA, у которых естьmov
инструкция (например, ARM), это просто перемещение reg-reg и не полный по Тьюрингу. (Хотя в ARM он может выполнять сдвиги / повороты.) Кроме того, вам действительно нужноjmp
создать цикл вокруг блокаmov
инструкций, если только вы не находитесь в 16-битном режиме, где указатель инструкций может обернуться в сегменте кода 64 Кб, чтобы цикл неявно.push {r4, lr}
/pop {r4,pc}
часто встречается в функциях, которым необходимо сохранить / восстановить один регистр, сохраняющий вызовы, и сохранить стек выровненным: они также сохраняют ссылку reg и возвращают ее обратно в счетчик программы для возврата. (32-битные инструкции ARM для сохранения / загрузки нескольких используют битовое поле, чтобы указать, какие регистры хранить / загружать.) И да, вы можете использовать ПК в качестве пункта назначенияmov
или любой инструкции. Я не знал, что это было распространено в прошлом, хотя. Но я слышал о ISA, запускаемых транспортом.