Um aspecto da integridade de Turing é o problema da parada .
Isso significa que, se o CSS for Turing completo, não haverá algoritmo geral para determinar se um programa CSS terminará a execução ou o loop para sempre.
Mas podemos derivar esse algoritmo para CSS! Aqui está:
Se a folha de estilo não declarar nenhuma animação , ela será interrompida.
Se houver animações, então:
Se qualquer um animation-iteration-count
é infinite
, e o seletor contendo é correspondida no HTML, então ele irá não parar.
Caso contrário, ele será interrompido.
É isso aí. Como acabamos de resolver o problema de interrupção do CSS, segue-se que o CSS não é Turing completo .
(Outras pessoas mencionaram o IE 6, que permite incorporar expressões arbitrárias em JavaScript no CSS; isso obviamente adicionará a integridade de Turing. Mas esse recurso não é padrão e ninguém em sã consciência o usa de qualquer maneira.)
Daniel Wagner levantou um ponto que eu perdi na resposta original. Ele observa que, enquanto eu abordei animações , outras partes do mecanismo de estilo, como a correspondência de seletores ou o layout, também podem levar à perfeição de Turing. Embora seja difícil argumentar formalmente sobre isso, tentarei descrever por que é improvável que a integridade de Turing ocorra.
Primeiro: Turing linguagens completas têm alguma maneira de alimentar dados de volta , seja através de recursão ou loop. Mas o design da linguagem CSS é hostil a esse feedback:
@media
as consultas podem apenas verificar as propriedades do próprio navegador, como tamanho da janela de exibição ou resolução de pixels. Essas propriedades podem mudar através da interação do usuário ou código JavaScript (por exemplo, redimensionando a janela do navegador), mas não apenas através do CSS.
::before
e ::after
pseudoelementos não são considerados parte do DOM e não podem ser correspondidos de nenhuma outra maneira.
Os combinadores de seletor podem inspecionar apenas os elementos acima e antes do elemento atual, portanto, eles não podem ser usados para criar ciclos de dependência.
É possível afastar um elemento quando você passa o mouse sobre ele , mas a posição só é atualizada quando você move o mouse.
Isso deve ser suficiente para convencê-lo de que a correspondência de seletor, por si só, não pode ser Turing completa . Mas e o layout?
O moderno algoritmo de layout CSS é muito complexo, com recursos como Flexbox e Grid turvando as águas. Mas mesmo que fosse possível disparar um loop infinito com layout, seria difícil aproveitar isso para executar cálculos úteis. Isso ocorre porque os seletores de CSS inspecionam apenas a estrutura interna do DOM, não como esses elementos são dispostos na tela. Portanto, qualquer prova de completude de Turing usando o sistema de layout deve depender apenas do layout .
Finalmente - e talvez este seja o motivo mais importante - os fornecedores de navegadores têm interesse em manter o CSS não Turing completo . Ao restringir o idioma, os fornecedores permitem otimizações inteligentes que tornam a web mais rápida para todos. Além disso, o Google dedica todo um farm de servidores à pesquisa de bugs no Chrome. Se houvesse uma maneira de escrever um loop infinito usando CSS, eles provavelmente já o teriam encontrado.