Un aspecto de la integridad de Turing es el problema de la detención .
Esto significa que, si CSS está completando Turing, entonces no hay un algoritmo general para determinar si un programa CSS terminará de ejecutarse o se repetirá para siempre.
¡Pero podemos derivar tal algoritmo para CSS! Aquí está:
Si la hoja de estilo no declara ninguna animación , se detendrá.
Si tiene animaciones, entonces:
Si alguno animation-iteration-count
es infinite
, y que contiene el selector está adaptada en el HTML, entonces no se detenga.
De lo contrario, se detendrá.
Eso es. Como acabamos de resolver el problema de detención de CSS, se deduce que CSS no está completo .
(Otras personas han mencionado IE 6, que permite incrustar expresiones arbitrarias de JavaScript en CSS; eso obviamente agregará la integridad de Turing. Pero esa característica no es estándar, y nadie en su sano juicio la usa de todos modos).
Daniel Wagner trajo a colación un punto que no entendí en la respuesta original. Señala que si bien he cubierto animaciones , otras partes del motor de estilo, como la coincidencia de selector o el diseño, también pueden conducir a la integridad de Turing. Si bien es difícil argumentar formalmente sobre esto, intentaré describir por qué la integridad de Turing aún es poco probable.
Primero: los idiomas completos de Turing tienen alguna forma de retroalimentar los datos , ya sea a través de la recursión o el bucle. Pero el diseño del lenguaje CSS es hostil a esta retroalimentación:
@media
las consultas solo pueden verificar las propiedades del navegador en sí, como el tamaño de la ventana gráfica o la resolución de píxeles. Estas propiedades pueden cambiar mediante la interacción del usuario o el código JavaScript (por ejemplo, cambiar el tamaño de la ventana del navegador), pero no solo a través de CSS.
::before
y los ::after
pseudoelementos no se consideran parte del DOM y no se pueden combinar de ninguna otra manera.
Los combinadores selectores solo pueden inspeccionar los elementos anteriores y anteriores al elemento actual, por lo que no se pueden usar para crear ciclos de dependencia.
Es posible alejar un elemento cuando pasa el mouse sobre él , pero la posición solo se actualiza cuando mueve el mouse.
Eso debería ser suficiente para convencerte de que la coincidencia del selector, por sí sola, no puede completarse con Turing . ¿Pero qué hay del diseño?
El algoritmo de diseño CSS moderno es muy complejo, con características como Flexbox y Grid que enturbian las aguas. Pero incluso si fuera posible activar un bucle infinito con diseño, sería difícil aprovechar esto para realizar cálculos útiles. Esto se debe a que los selectores de CSS inspeccionan solo la estructura interna del DOM, no cómo se presentan estos elementos en la pantalla. Por lo tanto, cualquier prueba de integridad de Turing que use el sistema de diseño debe depender solo del diseño .
Finalmente, y esta es quizás la razón más importante, los proveedores de navegadores tienen interés en mantener CSS completo y no Turing completo . Al restringir el idioma, los proveedores permiten optimizaciones inteligentes que hacen que la web sea más rápida para todos. Además, Google dedica una granja de servidores completa a la búsqueda de errores en Chrome. Si hubiera una manera de escribir un bucle infinito usando CSS, entonces probablemente ya lo habrían encontrado 😉