Насколько я знаю, CSS не завершен. Но мои знания CSS очень ограничены.
- CSS Тьюринг завершен?
- Рассматривает ли какой-либо из существующих проектов или комитетов языковые функции, которые могли бы обеспечить полноту Тьюринга, если это не сейчас?
css
turing-complete
Адам Дэвис
источник
источник
Ответы:
Вы можете закодировать Правило 110 в CSS3, так что оно завершено по Тьюрингу, если вы считаете, что соответствующий сопровождающий файл HTML и взаимодействие с пользователем являются частью «исполнения» CSS. Довольно хорошая реализация доступна, а другая реализация включена здесь:
источник
Одним из аспектов полноты по Тьюрингу является проблема остановки .
Это означает, что, если CSS завершен по Тьюрингу, тогда не существует общего алгоритма для определения того, будет ли программа CSS завершена или цикл будет длиться вечно.
Но мы можем вывести такой алгоритм для CSS! Вот:
Если таблица стилей не объявляет анимацию , она остановится.
Если у него есть анимация, то:
Если таковое
animation-iteration-count
естьinfinite
, и содержащийся селектор сопоставлен в HTML, то он не остановится.В противном случае он остановится.
Вот и все. Поскольку мы только что решили проблему остановки для CSS, из этого следует, что CSS не является полным по Тьюрингу .
(Другие люди упоминали IE 6, который позволяет встраивать произвольные выражения JavaScript в CSS; это, очевидно, добавит полноту Тьюринга. Но эта функция нестандартна, и никто в здравом уме не использует ее в любом случае.)
Даниэль Вагнер поднял вопрос, который я упустил в первоначальном ответе. Он отмечает, что, хотя я рассмотрел анимацию , другие части движка стилей, такие как подбор селектора или макет, также могут привести к полноте Тьюринга. Хотя трудно привести формальные аргументы по этому поводу, я попытаюсь обрисовать, почему полнота по Тьюрингу все еще вряд ли произойдет.
Во-первых: у полных языков Turing есть некоторый способ вернуть данные обратно в себя , будь то через рекурсию или зацикливание. Но дизайн языка CSS враждебен этой обратной связи:
@media
запросы могут проверять только свойства самого браузера, такие как размер области просмотра или разрешение в пикселях. Эти свойства могут изменяться с помощью взаимодействия с пользователем или кода JavaScript (например, изменение размера окна браузера), но не только с помощью CSS.::before
и::after
псевдоэлементы не считаются частью DOM и не могут быть сопоставлены другим способом.Комбинаторы селекторов могут проверять только элементы выше и перед текущим элементом, поэтому их нельзя использовать для создания циклов зависимости.
Можно сместить элемент, когда вы наводите на него курсор , но положение обновляется только при перемещении мыши.
Этого должно быть достаточно, чтобы убедить вас, что сопоставление селектора само по себе не может быть завершено по Тьюрингу . Но как насчет макета?
Современный алгоритм верстки CSS очень сложен, с такими функциями, как Flexbox и Grid, которые мутят воду. Но даже если бы можно было запустить бесконечный цикл с компоновкой, было бы трудно использовать это для выполнения полезных вычислений. Это потому, что CSS-селекторы проверяют только внутреннюю структуру DOM, а не то, как эти элементы расположены на экране. Поэтому любое доказательство полноты по Тьюрингу с использованием системы макетов должно зависеть только от макета .
Наконец - и это, пожалуй, самая важная причина - производители браузеров заинтересованы в том, чтобы CSS не был завершен по Тьюрингу . Ограничивая язык, поставщики допускают умные оптимизации, которые делают Интернет быстрее для всех. Кроме того, Google выделяет целую ферму серверов для поиска ошибок в Chrome. Если бы был способ написать бесконечный цикл с использованием CSS, то они, вероятно, нашли бы его уже 😉
источник
Согласно этой статье это не так . В статье также утверждается, что это не очень хорошая идея.
Цитировать из одного из комментариев:
источник
Полнота Тьюринга заключается не только в «определении функций» или «иметь ifs / loops / etc». Например, в Haskell нет «цикла», в лямбда-исчислении нет «ifs» и т. Д.
Например, этот сайт: http://experthuman.com/programming-with-nothing . Автор использует Ruby и создает программу «FizzBuzz» только с замыканиями (без строк, чисел или чего-то в этом роде) ...
Есть примеры, когда люди вычисляют некоторые арифметические функции в Scala, используя только систему типов
Так что, да, по моему мнению, CSS3 + HTML завершен по принципу Тьюринга (даже если вы не можете сделать какие-либо реальные вычисления, не сходя с ума)
источник
Фундаментальная проблема здесь заключается в том, что любая машина, написанная на HTML + CSS, не может оценивать бесконечно много шагов (т. Е. Не может быть «реальной» рекурсии), если код не бесконечно длинный. И вопрос, будет ли эта машина достигать конфигурации
H
заn
этапы или меньше, всегда отвечает, еслиn
он конечен.источник
H
?» всегда разрешима, и поэтому она не является полной по Тьюрингу. Реализация клеточного автомата, который может выполнять только конечное число итераций, никогда не будет полной.Этот ответ не является точным, потому что он смешивает описание UTM и самого UTM (универсальной машины Тьюринга).
У нас есть хороший ответ, но с другой точки зрения, и он не показывает прямых недостатков в текущем топ-ответе.
Прежде всего мы можем согласиться, что человек может работать как UTM. Это значит, что если мы сделаем
Тогда
CSS
часть бесполезна, потому что всю работу может выполнять тот,Human
кто будет выполнять UTM. Акт нажатия может быть UTM, потому что вы нажимаете не случайно, а только в определенных местах.Вместо CSS я мог бы использовать этот текст ( Правило 110 ):
Направлять мои действия и результат будет таким же. Это значит этот текст UTM? Нет, это только ввод (описание), который может прочитать и запустить другой UTM (человек или компьютер). Нажатие достаточно для запуска любого UTM.
Критическая часть, которой не хватает в CSS, - это возможность произвольного изменения своего состояния, если бы CSS мог генерировать щелчки, то это было бы UTM. Аргумент, что ваши щелчки являются «провальными» для CSS, не является точным, потому что реальным «провалом» для CSS является Layout Engine, который его запускает, и этого должно быть достаточно, чтобы доказать, что CSS является UTM.
источник
R
- состояние чтения иW
- состояние записи, нормальный CA делает бесконечную последовательностьRWRWRWRW...
в случае, если у нас есть только CSSR
, а у нас его нет,W
потому что он изменяет вещи, которые он не может прочитать, только если мы добавимB
- Действие браузера, то мы могли бы иметь,RBRBRBR...
но тогдаBBBBBB
это само по себе UTM.CSS не является языком программирования, поэтому вопрос о полноте Тьюринга не имеет смысла. Если программные расширения добавляются в CSS, как это было в IE6, тогда этот новый синтез - это совсем другое.
CSS это просто описание стилей; у него нет никакой логики, и его структура плоская.
источник