据我所知,CSS 不是图灵完备的。但是我对 CSS 的了解非常有限。
CSS Turing 是否完整?
是否有任何现有的草案或委员会正在考虑可能实现图灵完整性的语言特性,如果它不是现在的话?
您可以在 CSS3 中对 Rule 110 进行编码,因此只要您将适当的随附 HTML 文件和用户交互视为 CSS“执行”的一部分,它就是图灵完备的。 pretty good implementation 可用,此处包含另一个实现:
body { -webkit-animation: 错误修复无限 1s;保证金:0.5em 1em; } @-webkit-keyframes 错误修正 { from { padding: 0; } 到 { 填充:0; } } /* * 111 110 101 100 011 010 001 000 * 0 1 1 0 1 1 1 0 */ body > input { -webkit-appearance: none;显示:块;向左飘浮;右边框:1px 实心#ddd;边框底部:1px 实心#ddd;填充:0px 3px;边距:0; font-family:Consolas,“Courier New”,等宽字体;字体大小:7pt; } 正文 > 输入::之前 { 内容:“0”; } p { 字体系列:Verdana,无衬线;字体大小:9pt;边距底部:0.5em; } body > input:nth-of-type(-n+30) {border-top: 1px solid #ddd; } body > input:nth-of-type(30n+1) { border-left: 1px solid #ddd;清除:左; } 正文 > 输入::之前 { 内容:“0”; } 正文 > 输入:checked::before { 内容:“1”; } 正文 > 输入:检查 { 背景:#afa !重要的; } 输入:not(:checked) + *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+* +*+*+*+*+*+*+*+*+*+ input::before { content: "1"; } 输入:not(:checked) + *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+* +*+*+*+*+*+*+*+*+*+ 输入{ 背景:#fa0; } 输入:选中 + *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+* +*+*+*+*+*+*+ input::before { content: "1"; } 输入:选中 + *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+* +*+*+*+*+*+*+ 输入{ 背景:#fa0; } 输入:选中 + *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+* +*+*+*+*+*+ input::before { content: "1"; } 输入:选中 + *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+* +*+*+*+*+*+ 输入{ 背景:#fa0; } 输入:已检查 + 输入:已检查 + 输入:已检查 + *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+* +*+*+*+*+*+*+*+*+*+ input::before { content: "0"; } 输入:已检查 + 输入:已检查 + 输入:已检查 + *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+* +*+*+*+*+*+*+*+*+*+ 输入{ 背景:#fff; } 输入:未(:已检查) + 输入:未(:已检查) + 输入:未(:已检查) + *+*+*+*+*+*+*+*+*+*+*+*+* +*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+ input::before { content: "0"; } 输入:未(:已检查) + 输入:未(:已检查) + 输入:未(:已检查) + *+*+*+*+*+*+*+*+*+*+*+*+* +*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+输入{背景:#fff; } 正文 > 输入:nth-child(30n) { 显示:无!重要的; } 正文 > 输入:nth-child(30n) + 标签 { 显示:无!重要的; }
Rule 110 在 (webkit) CSS 中,证明图灵完备性。
< input type="checkbox"/>< input type="checkbox"/> < input type="checkbox"/> < input type="checkbox"/>< input type="checkbox"/> < input type="checkbox"/> < input type="checkbox"/>< input type="checkbox"/> < input type="checkbox"/> < input type="checkbox"/>< input type="checkbox"/> < input type="checkbox"/> < input type="checkbox"/>< input type="checkbox"/> < input type="checkbox"/> < input type="checkbox"/>< input type="checkbox"/> < input type="checkbox"/> < input type="checkbox"/>< input type="checkbox"/>
图灵完备性的一个方面是 halting problem。
这意味着,如果 CSS 是图灵完备的,那么就没有通用算法来确定 CSS 程序是完成运行还是永远循环。
但是我们可以为 CSS 推导出这样的算法!这里是:
如果样式表没有声明任何动画,那么它将停止。
如果它确实有动画,那么: 如果任何动画迭代计数是无限的,并且包含的选择器在 HTML 中匹配,那么它不会停止。否则,它将停止。
如果任何动画迭代计数是无限的,并且包含的选择器在 HTML 中匹配,那么它不会停止。
否则,它将停止。
而已。由于我们刚刚解决了 CSS 的停止问题,因此 CSS 不是图灵完备的。
(其他人提到了 IE 6,它允许在 CSS 中嵌入任意 JavaScript 表达式;这显然会增加图灵完备性。但该功能是非标准的,无论如何没有人在他们的头脑中使用它。)
丹尼尔瓦格纳提出了我在原始答案中遗漏的一点。他指出,虽然我已经介绍了动画,但样式引擎的其他部分(例如选择器匹配或布局)也可以导致图灵完备。虽然很难对这些进行正式的论证,但我将尝试概述为什么图灵完备性仍然不太可能发生。
首先:图灵完备的语言有某种方式将数据反馈给自身,无论是通过递归还是循环。但是 CSS 语言的设计对这种反馈是敌对的:
@media 查询只能检查浏览器本身的属性,例如视口大小或像素分辨率。这些属性可以通过用户交互或 JavaScript 代码(例如调整浏览器窗口的大小)进行更改,但不能仅通过 CSS。
::before 和 ::after 伪元素不被视为 DOM 的一部分,并且不能以任何其他方式匹配。
选择器组合器只能检查当前元素之上和之前的元素,因此它们不能用于创建依赖循环。
当您将鼠标悬停在某个元素上时,可以将其移开,但该位置仅在您移动鼠标时才会更新。
这应该足以让您相信选择器匹配本身不能是图灵完备的。但是布局呢?
现代 CSS 布局算法非常复杂,有 Flexbox 和 Grid 之类的特性搅浑水。但即使可以通过布局触发无限循环,也很难利用它来执行有用的计算。这是因为 CSS 选择器只检查 DOM 的内部结构,而不检查这些元素在屏幕上的布局方式。因此任何使用布局系统的图灵完备性证明都必须仅依赖于布局。
最后——这也许是最重要的原因——浏览器供应商有兴趣保持 CSS 不图灵完备。通过限制语言,供应商允许 clever optimizations 让每个人都能更快地上网。此外,Google 将 a whole server farm 专门用于搜索 Chrome 中的错误。如果有办法使用 CSS 编写无限循环,那么他们可能已经找到了 😉
As per this article, it's not。这篇文章还认为,把它变成一个不是一个好主意。
引用其中一条评论:
所以,我不相信 CSS 是图灵完备的。没有在 CSS 中定义函数的能力。为了使系统具有图灵完备性,必须能够编写解释器:解释表示要执行的程序的表达式的函数。 CSS 没有用户可以直接访问的变量;因此,您甚至无法对表示要在 CSS 中解释的程序的结构进行建模。
图灵完备性不仅与“定义函数”或“具有 ifs/loops/etc”有关。例如,Haskell 没有“循环”,lambda 演算没有“ifs”,等等......
例如,此站点:http://experthuman.com/programming-with-nothing。作者使用 Ruby 并创建了一个“FizzBuzz”程序,只有闭包(没有字符串、数字或类似的东西)......
有些例子是人们只使用类型系统在 Scala 上计算一些算术函数
所以,是的,在我看来,CSS3+HTML 是图灵完备的(即使你不能完全用 then 进行任何真正的计算而不会变得疯狂)
这里的根本问题是任何用 HTML+CSS 编写的机器都不能计算无限多的步骤(即不可能有“真正的”递归),除非代码无限长。如果 n
是有限的,那么这台机器会在 n
步或更短的时间内达到配置 H
的问题总是可以回答的。
H
?”总是可判定的,因此它不是图灵完备的。只能进行有限次数迭代的元胞自动机的实现永远不可能是图灵完备的。
This 答案不准确,因为它混合了 UTM 和 UTM 本身(通用图灵机)的描述。
我们有 good answer,但从不同的角度来看,它并没有直接显示当前最佳答案中的缺陷。
首先,我们可以同意人类可以作为 UTM 工作。这意味着如果我们这样做
CSS + Human == UTM
然后 CSS
部分是无用的,因为所有工作都可以由 Human
完成,他们将完成 UTM 部分。点击的行为可以是 UTM,因为你不是随机点击,而是只在特定的地方点击。
我可以使用以下文本(Rule 110)代替 CSS:
000 -> 0
001 -> 1
010 -> 1
011 -> 1
100 -> 0
101 -> 1
110 -> 1
111 -> 0
指导我的行动和结果将是相同的。这意味着这个文本UTM?不,这只是其他 UTM(人或计算机)可以读取和运行的输入(描述)。单击足以运行任何 UTM。
CSS 缺乏的关键部分是能够以任意方式改变自己的状态,如果 CSS 可以产生点击,那么它就是 UTM。认为您的点击是 CSS 的“曲柄”的论点是不准确的,因为 CSS 的真正“曲柄”是运行它的布局引擎,它应该足以证明 CSS 是 UTM。
R
- 读取状态和 W
- 写入状态,普通 CA 执行无限序列 RWRWRWRW...
在 CSS 的情况下我们只有 R
,而我们没有 W
因为它修改了它无法读取的内容,只有当我们添加 B
- 浏览器操作时,我们才能拥有 RBRBRBR...
但 BBBBBB
在其自己的 UTM 上。
CSS 不是一种编程语言,所以图灵完备性的问题是没有意义的。如果将编程扩展添加到 CSS 中,例如 IE6 中的情况,那么新的合成就完全不同了。
CSS 只是样式的描述;它没有任何逻辑,结构扁平。