Одним из аспектов полноты по Тьюрингу является проблема остановки.
Это означает, что если CSS завершен по Тьюрингу, то не существует общего алгоритма для определения того, завершит ли программа CSS выполнение или будет бесконечный цикл.
Но мы можем вывести такой алгоритм для CSS! Вот:
Вот и все. Поскольку мы только что решили проблему остановки для CSS, отсюда следует, что CSS не завершен по Тьюрингу.
(Другие люди упоминали IE 6, который позволяет встраивать произвольные выражения JavaScript в CSS; это, очевидно, добавит полноты по Тьюрингу. Но эта функция нестандартна, и никто в здравом уме ее все равно не использует.)
Даниэль Вагнер поднял вопрос, который я упустил в первоначальном ответе. Он отмечает, что, хотя я рассмотрел анимацию, другие части механизма стилей, такие как сопоставление селекторов или макет, также могут привести к полноте по Тьюрингу. . Хотя сложно привести формальные аргументы по этому поводу, я попытаюсь обрисовать, почему полнота по Тьюрингу все еще маловероятна.
Во-первых: полные языки по Тьюрингу имеют некоторый способ подавать данные обратно в себя, будь то рекурсия или цикл. Но дизайн языка CSS враждебен этой обратной связи:
@media
запросы могут проверять только свойства самого браузера, например, размер области просмотра или разрешение в пикселях. Эти свойства могут изменяться посредством взаимодействия с пользователем или кода JavaScript (например, изменения размера окна браузера), но не только с помощью CSS.
Псевдоэлементы ::before
и ::after
не считаются частью DOM и не могут быть сопоставлены никаким другим способом.
Комбинаторы селектора могут проверять только элементы выше < / em> и перед текущим элементом, поэтому их нельзя использовать для создания циклов зависимости.
Можно сдвинуть элемент при наведении на него курсора, но положение обновляется только при перемещении мыши.
Этого должно быть достаточно, чтобы убедить вас, что сопоставление селекторов само по себе не может быть полным по Тьюрингу. А как насчет макета?
Современный алгоритм макета CSS очень сложен и включает такие функции, как Flexbox и Grid замутняют воду. Но даже если бы можно было запустить бесконечный цикл с макетом, было бы трудно использовать это для выполнения полезных вычислений. Это потому, что селекторы CSS проверяют только внутреннюю структуру DOM, а не то, как эти элементы расположены на экране. Поэтому любое доказательство полноты по Тьюрингу с использованием системы макета должно зависеть только от макета.
Наконец, и это, пожалуй, самая важная причина, по которой производители браузеров заинтересованы в том, чтобы CSS не был завершен по Тьюрингу. Ограничивая язык, поставщики допускают умную оптимизацию, которые делают Интернет быстрее для всех. Кроме того, Google выделяет целую ферму серверов для поиска ошибок в Хром. Если бы существовал способ написать бесконечный цикл с помощью CSS, то они, вероятно, уже нашли бы его ????
person
Lambda Fairy
schedule
19.10.2014