Трофф Тьюринг завершен?

9

Troff поддерживает как определения макросов, так .deи ветвления .if(см. Стр. 5 и 6 в руководстве пользователя Troff ). В этих двух отношениях он очень похож на TeX. Однако я не знаю очень сложных программ, написанных на Troff (в отличие, скажем, от TikZ для TeX). Трофф Тьюринг завершен?

cutculus
источник

Ответы:

12

ESR's Art of Unix Programming утверждает, что это:

Мы рассмотрим troff более подробно в главе 18; пока достаточно отметить, что это хороший пример императивного миниязыка, который граничит с тем, что является полноценным интерпретатором (у него есть условные выражения и рекурсия, но нет циклов; он случайно завершен по Тьюрингу).

(«Случайно» в противоположность тому m4, что называется «намеренно завершенным по Тьюрингу».)

Мур
источник
13

Да, troff завершен по Тьюрингу. Он поддерживает произвольную рекурсию и условное ветвление, что достаточно. Он также имеет регистры и различные другие способы хранения данных, что снова дает вам другой путь.

Полнота Тьюринга не означает, что очень сложные программы являются практичными - просто они теоретически возможны, так или иначе, на некотором уровне удаления - и при этом их отсутствие не подразумевает, что они не являются таковыми, поэтому ни troff не является Turing-complete или Отсутствие сложных программ ничего не говорит об этом.


Полнота Тьюринга, как правило, не является свойством, которое означает что-то полезное для пользователя. Все это означает, что вы можете имитировать машину Тьюринга с ее помощью, а не то, что вам хотелось бы, и не то, что выходные данные, которые вы получите от нее, не похожи на то, что вы ожидаете прочитать. Входные или выходные данные могут быть просто числом или даже числом раз, когда что-то появляется, а не что-то полезное, и виды машин, которые вы в конечном итоге моделируете, и их программы зачастую едва различимы для начала.

Многие языки и системы являются случайно полными по Тьюрингу, но неприемлемо применимыми для любого реального программирования в этом подмножестве (например, Игра жизни Конвея или CSS), а некоторые языки, которые полезны для реального программирования, не полны по Тьюрингу (например, Agda). Определяющими характеристиками действительно являются то, что вы можете

  • продолжать идти вечно
  • запомните столько данных, сколько вы хотите
  • выбрать, что делать дальше

Часто эти свойства - особенно недопущение - на самом деле нежелательны, возможно, в том числе и для troff. Вне теоретической информатики и языкового дизайна, полнота по Тьюрингу не очень интересна практически в то время, несмотря на то, что она запоминающаяся.

Майкл Гомер
источник
Да, конечно, это не очень полезная вещь сама по себе, но она все еще интересна - например, даже инструкция mov завершена по Тьюрингу.
cutculus
4
@theindigamer - X86 «сек movинструкция по Тьюрингу. (Из-за режимов адресации, которые позволяют вам использовать таблицы поиска, и та же самая мнемоника используется для загрузки, сохранения и перемещения непосредственно для регистрации.) На многих других ISA, у которых есть movинструкция (например, ARM), это просто перемещение reg-reg и не полный по Тьюрингу. (Хотя в ARM он может выполнять сдвиги / повороты.) Кроме того, вам действительно нужно jmpсоздать цикл вокруг блока movинструкций, если только вы не находитесь в 16-битном режиме, где указатель инструкций может обернуться в сегменте кода 64 Кб, чтобы цикл неявно.
Питер Кордес
6
@SpaceBison Конечно, есть :-) github.com/Battelle/movfuscator
Даниэль Нэслунд
2
@PeterCordes: Ах; в старые времена существовали архитектуры MOV, которые отображали в памяти ALU, а IP был просто еще одним регистром, поэтому JMP был еще одним MOV.
Джошуа
1
@Joshua: забавный факт: 32-битный ARM представляет ПК как один из 16 целочисленных регистров общего назначения. push {r4, lr}/ pop {r4,pc}часто встречается в функциях, которым необходимо сохранить / восстановить один регистр, сохраняющий вызовы, и сохранить стек выровненным: они также сохраняют ссылку reg и возвращают ее обратно в счетчик программы для возврата. (32-битные инструкции ARM для сохранения / загрузки нескольких используют битовое поле, чтобы указать, какие регистры хранить / загружать.) И да, вы можете использовать ПК в качестве пункта назначения movили любой инструкции. Я не знал, что это было распространено в прошлом, хотя. Но я слышал о ISA, запускаемых транспортом.
Питер Кордес