Да, troff завершен по Тьюрингу. Он поддерживает произвольную рекурсию и условное ветвление, что достаточно. Он также имеет регистры и различные другие способы хранения данных, что снова дает вам другой путь.
Полнота Тьюринга не означает, что очень сложные программы являются практичными - просто они теоретически возможны, так или иначе, на некотором уровне удаления - и при этом их отсутствие не подразумевает, что они не являются таковыми, поэтому ни troff не является Turing-complete или Отсутствие сложных программ ничего не говорит об этом.
Полнота Тьюринга, как правило, не является свойством, которое означает что-то полезное для пользователя. Все это означает, что вы можете имитировать машину Тьюринга с ее помощью, а не то, что вам хотелось бы, и не то, что выходные данные, которые вы получите от нее, не похожи на то, что вы ожидаете прочитать. Входные или выходные данные могут быть просто числом или даже числом раз, когда что-то появляется, а не что-то полезное, и виды машин, которые вы в конечном итоге моделируете, и их программы зачастую едва различимы для начала.
Многие языки и системы являются случайно полными по Тьюрингу, но неприемлемо применимыми для любого реального программирования в этом подмножестве (например, Игра жизни Конвея или CSS), а некоторые языки, которые полезны для реального программирования, не полны по Тьюрингу (например, Agda). Определяющими характеристиками действительно являются то, что вы можете
- продолжать идти вечно
- запомните столько данных, сколько вы хотите
- выбрать, что делать дальше
Часто эти свойства - особенно недопущение - на самом деле нежелательны, возможно, в том числе и для troff. Вне теоретической информатики и языкового дизайна, полнота по Тьюрингу не очень интересна практически в то время, несмотря на то, что она запоминающаяся.