Часто удобно иметь каноническое представление языка (в моем случае это обычно языки, специфичные для предметной области); однако я считаю, что существуют строгие ограничения на выразительность участвующих языков, которые определяют, можно ли определить и / или создать каноническую форму для произвольной программы на этом языке. К сожалению, мне не удалось найти ссылки, о которых я (смутно) вспоминаю, читая об этом.
С одной стороны, кажется разумным, что создание канонического представления языка имеет сопоставимую сложность со многими сложными задачами о графах (например, изоморфизм графов), но с другой стороны, iirc, компиляторы, такие как gcc, yhc и ghc используйте промежуточные представления для генерации выходных данных в различных форматах (сборка, javascript и т. д.), так что, по крайней мере, в некоторых формах это решаемая проблема.
Когда можно определить / сгенерировать каноническую форму для данного языка? (Насколько выразительным может быть этот язык и как языковая выразительность влияет на полезность канонических форм?) Пожалуйста, предоставьте ссылки или доказательства, если это вообще возможно.
Редактировать: Например, Regular Language (например, «чистая» форма регулярных выражений) не может выразить многие из тех вещей, которые Turing- полный язык может. Другими словами, вы не можете написать веб-сервер на обычном языке, но вы можете сделать это с помощью лямбда-исчисления). Мой вопрос о теоретических возможностях и имеет конкретный ответ, касающийся теории сложности. Если у меня есть DSL, который необходимо передать в другую систему, часто будет полезно сгенерировать каноническую форму этого кода перед его передачей, поскольку это будет разъединять независимые представления, используемые двумя разными системами. Однако , если это P-Space complete или NP-Complete для перевода полного по Тьюрингу языка в каноническую форму, то вам не следует тратить время на создание канонической формы - либо найдите другую способ сделать это или уменьшить сложность языка до того, что можно канонизировать за полиномиальное время.