Un aspect de l'exhaustivité de Turing est le problème de l' arrêt .
Cela signifie que, si CSS est Turing complet, il n'y a pas d' algorithme général pour déterminer si un programme CSS finira de s'exécuter ou de boucler indéfiniment.
Mais nous pouvons dériver un tel algorithme pour CSS! C'est ici:
Si la feuille de style ne déclare aucune animation , elle s'arrêtera.
S'il a des animations, alors:
C'est tout. Puisque nous venons de résoudre le problème d'arrêt pour CSS, il s'ensuit que CSS n'est pas Turing complet .
(D'autres personnes ont mentionné IE 6, qui permet d'incorporer des expressions JavaScript arbitraires dans CSS; cela ajoutera évidemment l'intégralité de Turing. Mais cette fonctionnalité n'est pas standard, et personne de bon sens ne l'utilise de toute façon.)
Daniel Wagner a soulevé un point que j'ai manqué dans la réponse originale. Il note que même si j'ai couvert les animations , d'autres parties du moteur de style telles que la mise en correspondance des sélecteurs ou la mise en page peuvent également conduire à l'exhaustivité de Turing. Bien qu'il soit difficile de faire un argument formel à ce sujet, je vais essayer de souligner pourquoi il est peu probable que l'exhaustivité de Turing se produise.
Premièrement: les langages complets de Turing ont un moyen de réinjecter des données en eux-mêmes , que ce soit par récursivité ou en boucle. Mais la conception du langage CSS est hostile à ces retours:
@media
les requêtes peuvent uniquement vérifier les propriétés du navigateur lui-même, telles que la taille de la fenêtre d'affichage ou la résolution en pixels. Ces propriétés peuvent changer via l'interaction de l'utilisateur ou le code JavaScript (par exemple, le redimensionnement de la fenêtre du navigateur), mais pas uniquement via CSS.
::before
et les ::after
pseudo-éléments ne sont pas considérés comme faisant partie du DOM et ne peuvent être mis en correspondance d'aucune autre manière.
Les combinateurs de sélecteur peuvent uniquement inspecter les éléments au - dessus et avant l'élément en cours, ils ne peuvent donc pas être utilisés pour créer des cycles de dépendance.
Il est possible de déplacer un élément lorsque vous le survolez , mais la position ne se met à jour que lorsque vous déplacez la souris.
Cela devrait suffire à vous convaincre que l' appariement des sélecteurs, à lui seul, ne peut pas être complet . Mais qu'en est-il de la mise en page?
L'algorithme de mise en page CSS moderne est très complexe, avec des fonctionnalités telles que Flexbox et Grid brouillant les eaux. Mais même s'il était possible de déclencher une boucle infinie avec mise en page, il serait difficile d'en tirer parti pour effectuer un calcul utile. C'est parce que les sélecteurs CSS inspectent uniquement la structure interne du DOM, pas la façon dont ces éléments sont disposés à l'écran. Ainsi, toute preuve d'exhaustivité de Turing utilisant le système de mise en page doit dépendre de la mise en page seule .
Enfin - et c'est peut-être la raison la plus importante - les fournisseurs de navigateurs ont intérêt à garder CSS non Turing complet . En restreignant la langue, les fournisseurs permettent des optimisations intelligentes qui accélèrent le Web pour tout le monde. De plus, Google consacre toute une batterie de serveurs à la recherche de bogues dans Chrome. S'il y avait un moyen d'écrire une boucle infinie en utilisant CSS, alors ils l'auraient probablement déjà trouvé 😉