O CSS não é, na medida em que sei, Turing completo. Mas meu conhecimento de CSS é muito limitado.
- O CSS Turing está completo?
- Algum dos rascunhos ou comitês existentes está considerando recursos de linguagem que podem permitir a integridade de Turing, se não estiver no momento?
css
turing-complete
Adam Davis
fonte
fonte
Respostas:
Você pode codificar a Regra 110 no CSS3, para que seja concluída com Turing, desde que considere que um arquivo HTML que acompanha o produto e as interações do usuário sejam parte da "execução" do CSS. Uma implementação muito boa está disponível e outra implementação está incluída aqui:
fonte
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.
fonte
De acordo com este artigo, não é . O artigo também argumenta que não é uma boa ideia torná-lo um.
Para citar um dos comentários:
fonte
Turing-completeness não é apenas "definir funções" ou "ter ifs / loops / etc". Por exemplo, Haskell não possui "loop", lambda-calculus não possui "ifs", etc ...
Por exemplo, este site: http://experthuman.com/programming-with-nothing . O autor usa Ruby e cria um programa "FizzBuzz" com apenas fechamentos (sem strings, números ou qualquer coisa assim) ...
Existem exemplos em que as pessoas calculam algumas funções aritméticas no Scala usando apenas o sistema de tipos
Então, sim, na minha opinião, CSS3 + HTML está completo (mesmo que você não possa fazer exatamente nenhum cálculo real sem ficar louco)
fonte
A questão fundamental aqui é que qualquer máquina escrita em HTML + CSS não pode avaliar infinitamente muitas etapas (ou seja, não pode haver recursão "real"), a menos que o código seja infinitamente longo. E a questão de esta máquina alcançar a configuração
H
emn
etapas ou menos é sempre responsável sen
for finita.fonte
H
?" é sempre decidível e, portanto, não é Turing completo. Uma implementação de um autômato celular que só pode executar um número finito de iterações nunca pode ser concluída.Esta resposta não é precisa porque combina a descrição do UTM e do próprio UTM (Universal Turing Machine).
Temos uma boa resposta, mas sob uma perspectiva diferente e ela não mostra falhas diretamente na resposta atual atual.
Antes de tudo, podemos concordar que humanos podem funcionar como UTM. Isso significa que se fizermos
Então
CSS
parte é inútil, porque todo o trabalho pode ser feito porHuman
quem fará a parte UTM. O ato de clicar pode ser UTM, porque você não clica aleatoriamente, mas apenas em locais específicos.Em vez de CSS, eu poderia usar este texto ( Regra 110 ):
Orientar minhas ações e resultados será o mesmo. Isso significa esse texto UTM? Não, isso é apenas uma entrada (descrição) que outro UTM (humano ou computador) pode ler e executar. Clicar é suficiente para executar qualquer UTM.
Parte crítica que falta ao CSS é a capacidade de alterar seu próprio estado de maneira arbitrária; se o CSS gerar cliques, seria UTM. O argumento de que seus cliques são "crank" para CSS não é preciso, porque o "crank" real para CSS é o Layout Engine que o executa e deve ser suficiente para provar que CSS é UTM.
fonte
R
- estado de leitura eW
- estado de gravação, CA normal: sequência infinitaRWRWRWRW...
no caso de CSS que temos apenasR
, e não o temosW
porque modifica coisas que não pode ler, apenas se adicionarmosB
- ação do navegador, então poderíamos ter,RBRBRBR...
mas entãoBBBBBB
é por conta própria UTM.O CSS não é uma linguagem de programação; portanto, a questão da perfeição turing é sem sentido. Se extensões de programação são adicionadas ao CSS, como foi o caso no IE6, essa nova síntese é uma coisa totalmente diferente.
CSS é apenas uma descrição de estilos; não possui lógica e sua estrutura é plana.
fonte