Один аспект полноты по Тьюрингу состоит в том, что его проблема остановки неразрешима .
Это означает, что не существует общего алгоритма для определения того, будет ли программа CSS завершена или цикл будет длиться вечно.
Но мы можем вывести такой алгоритм для CSS! Вот оно:
Если таблица стилей не объявляет анимации , то она остановится.
Если у него есть анимация, тогда:
Если любой animation-iteration-count
равен infinite
, и содержащийся селектор сопоставлен в HTML, то он не остановится.
В противном случае он остановится.
Вот и все. Поскольку мы только что показали, что проблема остановки решаема для CSS, из этого следует, что CSS равен , а не Тьюринг завершен .
(Другие люди упоминали IE 6, который позволяет встраивать произвольные выражения JavaScript в CSS; это, очевидно, добавит полноту Тьюринга. Но эта функция нестандартна, и никто в здравом уме не использует ее в любом случае.)
Даниэль Вагнер поднял вопрос, который я упустил в первоначальном ответе. Он отмечает, что хотя я рассмотрел анимаций , другие части движка стилей, такие как соответствие селектора или макет , также могут привести к полноте Тьюринга. Хотя трудно привести формальные аргументы по этому поводу, я попытаюсь обрисовать, почему полнота по Тьюрингу все еще вряд ли произойдет.
Во-первых: у полных языков Тьюринга есть некоторый способ подачи данных обратно в себя , будь то через рекурсию или зацикливание. Но дизайн языка CSS враждебен этой обратной связи:
@media
запросов может проверять только свойства самого браузера, такие как размер области просмотра или разрешение в пикселях. Эти свойства могут изменяться с помощью взаимодействия с пользователем или кода JavaScript (например, изменение размера окна браузера), но не только с помощью CSS.
::before
и ::after
псевдоэлементы не считаются частью DOM и не могут быть сопоставлены другим способом.
Комбинаторы селекторов могут проверять только элементы над и до текущего элемента, поэтому их нельзя использовать для создания циклов зависимости.
Можно сдвинуть элемент при наведении на него , но положение обновляется только при перемещении мыши.
Этого должно быть достаточно, чтобы убедить вас, что сопоставление селектора само по себе не может быть завершено по Тьюрингу . Но как насчет макета?
Современный алгоритм компоновки CSS очень сложен, с такими функциями, как Flexbox и Grid , смачивая воду. Но даже если бы можно было запустить бесконечный цикл с компоновкой, было бы трудно использовать это для выполнения полезных вычислений. Это потому, что CSS-селекторы проверяют только внутреннюю структуру DOM, а не то, как эти элементы располагаются на экране. Так что любое доказательство полноты по Тьюрингу с использованием системы макетов должно зависеть только от макета .
Наконец & ndash; и это, пожалуй, самая важная причина & ndash; Поставщики браузеров заинтересованы в том, чтобы CSS не Turing complete . Ограничивая язык, поставщики допускают умных оптимизаций , которые делают Интернет быстрее для всех. Более того, Google выделяет целую ферму серверов для поиска ошибок в Chrome. Если бы был способ написать бесконечный цикл с использованием CSS, то они, вероятно, нашли бы его уже ?