CSS no es, hasta donde sé, Turing completo. Pero mi conocimiento de CSS es muy limitado.
- ¿Está completo CSS Turing?
- ¿Alguno de los borradores o comités existentes está considerando las características del lenguaje que podrían permitir la integridad de Turing si no es ahora?
css
turing-complete
Adam Davis
fuente
fuente
Respuestas:
Puede codificar la Regla 110 en CSS3, por lo que se completa con Turing siempre que considere que un archivo HTML apropiado y las interacciones del usuario forman parte de la "ejecución" de CSS. Una muy buena aplicación está disponible, y otra implementación se incluye aquí:
fuente
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
esinfinite
, 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 😉
fuente
Según este artículo, no lo es . El artículo también argumenta que no es una buena idea hacerlo uno.
Para citar uno de los comentarios:
fuente
La integridad de Turing no se trata solo de "definir funciones" o "tener ifs / loops / etc". Por ejemplo, Haskell no tiene "bucle", el cálculo lambda no tiene "ifs", etc.
Por ejemplo, este sitio: http://experthuman.com/programming-with-nothing . El autor usa Ruby y crea un programa "FizzBuzz" con solo cierres (sin cadenas, números ni nada de eso) ...
Hay ejemplos cuando las personas calculan algunas funciones aritméticas en Scala usando solo el sistema de tipos
Entonces, sí, en mi opinión, CSS3 + HTML está completo (incluso si no puedes hacer ningún cálculo real sin volverte loco)
fuente
El problema fundamental aquí es que cualquier máquina escrita en HTML + CSS no puede evaluar infinitamente muchos pasos (es decir, no puede haber una recursión "real") a menos que el código sea infinitamente largo. Y la pregunta de si esta máquina alcanzará la configuración
H
enn
pasos o menos siempre es responsable sin
es finita.fuente
H
?" siempre es decidible y, por lo tanto, no está completo. Una implementación de un autómata celular que solo puede hacer un número finito de iteraciones nunca puede completarse.Esta respuesta no es precisa porque combina la descripción de UTM y UTM (Universal Turing Machine).
Tenemos una buena respuesta pero desde una perspectiva diferente y no muestra fallas directas en la respuesta principal actual.
En primer lugar, podemos estar de acuerdo en que los humanos pueden funcionar como UTM. Esto significa que si lo hacemos
Entonces
CSS
parte es inútil porque todo el trabajo puede ser realizado porHuman
quién hará la parte UTM. El acto de hacer clic puede ser UTM, porque no hace clic al azar sino solo en lugares específicos.En lugar de CSS, podría usar este texto ( Regla 110 ):
Para guiar mis acciones y resultados será lo mismo. Esto significa este texto UTM? No, esto es solo una entrada (descripción) que otros UTM (humanos o computadoras) pueden leer y ejecutar. Hacer clic es suficiente para ejecutar cualquier UTM.
La parte crítica de la que carece CSS es la capacidad de cambiar su propio estado de manera arbitraria, si CSS pudiera generar clics, entonces sería UTM. El argumento de que sus clics son "inestables" para CSS no es exacto porque el verdadero "inestable" para CSS es Layout Engine que lo ejecuta y debería ser suficiente para demostrar que CSS es UTM.
fuente
R
- estado de lectura, yW
- estado de escritura, CA normal, secuencia infinitaRWRWRWRW...
en el caso de CSS que solo tenemosR
, y no tenemosW
porque modifica cosas que no puede leer, solo si agregamosB
- acción del navegador que podríamos tener,RBRBRBR...
pero luegoBBBBBB
está en su propio UTM.CSS no es un lenguaje de programación, por lo que la cuestión de la integridad de turing no tiene sentido. Si se agregan extensiones de programación a CSS, como fue el caso en IE6, entonces esa nueva síntesis es algo completamente diferente.
CSS es simplemente una descripción de estilos; no tiene ninguna lógica, y su estructura es plana.
fuente