Что Тьюринг-полного макро-языки Си/Си++


Преамбула

Один из главных моментов, который шепелявые утверждают в качестве бонуса по сравнению с более "мейнстрим" языками, заключается в том, что макроязык на самом деле является полным Тьюрингом (я не могу вспомнить, был ли это Пол Грэм в On Lisp или это был Конрад Барски в Land of Lisp)1, и постороннему человеку, по крайней мере, это кажется правдой-директивы препроцессора в C/C++ не кажутся завершенными по Тьюрингу (честно говоря, они больше похожи на синтаксис аннотаций).

А теперь... Вопрос

    Является ли это точной оценкой? Поскольку я только баловался с, это поражает меня как еще один момент, когда шепелявые чрезмерно усердны
  1. Существуют ли полные макроязыки Тьюринга (для C/C++), которые заслуживают внимания?
      Есть ли в работах или неудачных попытках что-то такое, что стоило бы искать в будущем?
  2. я слышал, что Python теперь может служить основой для компиляции C / C++ (подразумевая, что Python можно использовать для записи макросы), но я не видел подтверждения этому. Это правда?

(я воздержусь от вопросов о мнении, таких как "что является лучшим...")

1. Кстати, обе книги действительно хороши, просто говорю

2 2

2 ответа:

C макросы фактически являются полными по Тьюрингу, Если обрабатываются более одного раза. Проверьте Этот связанный вопрос и, в частности, реализацию машины Тьюринга, связанную с принятым ответом.

Но да, это обман. Решение, используемое там, сильно подразумевает, что макросы C действительно не являются полными по Тьюрингу.

Оценка того, что препроцессор C не является полным по Тьюрингу, столь же точна, сколь и бессмысленна. Любое вычисление, которое является слишком сложным для препроцессора C, очень вероятно, будет слишком трудным для понимания, если оно сформулировано в терминах препроцессора (например, обработка текста кода) и должно быть закодировано.

Шаблоны C++ являются признанным преемником магии препроцессора, и их немного легче понять, чем те. Итак, шепот опять совершенно прав и упускает суть, как всегда : -).