CSS n'est pas, pour autant que je sache, Turing complet. Mais ma connaissance de CSS est très limitée.
- CSS Turing est-il complet?
- Est-ce que certains projets ou comités existants envisagent des fonctionnalités linguistiques qui pourraient permettre l'exhaustivité de Turing si ce n'est pas le cas actuellement?
css
turing-complete
Adam Davis
la source
la source
Réponses:
Vous pouvez coder la règle 110 dans CSS3, c'est donc Turing-complete tant que vous considérez qu'un fichier HTML d'accompagnement approprié et les interactions utilisateur font partie de l '«exécution» de CSS. Une assez bonne implémentation est disponible, et une autre implémentation est incluse ici:
la source
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:
Si
animation-iteration-count
c'est le casinfinite
, et que le sélecteur contenant correspond au code HTML, il ne s'arrêtera pas .Sinon, cela s'arrêtera.
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é 😉
la source
Selon cet article, ce n'est pas le cas . L'article soutient également que ce n'est pas une bonne idée d'en faire un.
Pour citer un des commentaires:
la source
L'exhaustivité n'est pas seulement une question de "définition de fonctions" ou de "présence d'if / boucles / etc". Par exemple, Haskell n'a pas de "boucle", lambda-calcul n'a pas de "ifs", etc ...
Par exemple, ce site: http://experthuman.com/programming-with-nothing . L'auteur utilise Ruby et crée un programme "FizzBuzz" avec seulement des fermetures (pas de chaînes, de nombres, ou quelque chose comme ça) ...
Il y a des exemples où les gens calculent certaines fonctions arithmétiques sur Scala en utilisant uniquement le système de type
Donc, oui, à mon avis, CSS3 + HTML est complet (même si vous ne pouvez pas exactement faire de calcul réel sans devenir fou)
la source
Le problème fondamental ici est que toute machine écrite en HTML + CSS ne peut pas évaluer un nombre infini d'étapes (c'est-à-dire qu'il ne peut pas y avoir de "vraie" récursivité) à moins que le code ne soit infiniment long. Et la question de savoir si cette machine atteindra la configuration
H
parn
étapes ou moins est toujours répondable si ellen
est finie.la source
H
?" est toujours décidable et il n'est donc pas Turing complet. Une implémentation d'un automate cellulaire qui ne peut effectuer qu'un nombre fini d'itérations ne peut jamais être complète.Cette réponse n'est pas exacte car elle mélange la description de l'UTM et de l'UTM elle-même (Universal Turing Machine).
Nous avons une bonne réponse, mais d'un point de vue différent et elle ne montre pas directement de défauts dans la première réponse actuelle.
Tout d'abord, nous pouvons convenir que l'homme peut fonctionner comme UTM. Cela signifie que si nous le faisons
Ensuite, la
CSS
partie est inutile car tout le travail peut être effectué parHuman
qui fera la partie UTM. Le fait de cliquer peut être UTM, car vous ne cliquez pas au hasard, mais uniquement à des endroits spécifiques.Au lieu de CSS, je pouvais utiliser ce texte ( règle 110 ):
Pour guider mes actions et le résultat sera le même. Cela signifie ce texte UTM? Non, ce n'est qu'une entrée (description) que d'autres UTM (humains ou informatiques) peuvent lire et exécuter. Il suffit de cliquer pour exécuter une UTM.
La partie critique que CSS manque est la capacité de changer son propre état de manière arbitraire, si CSS pouvait générer des clics, ce serait UTM. L'argument selon lequel vos clics sont "excentriques" pour CSS n'est pas précis car le véritable "excentrique" pour CSS est le moteur de mise en page qui l'exécute et cela devrait suffire pour prouver que CSS est UTM.
la source
R
- l'état de lecture etW
- l'état d'écriture, l'autorité de certification normale fait une séquence infinieRWRWRWRW...
dans le cas de CSS que nous avons seulementR
, et nous n'en avons pasW
parce qu'elle modifie des choses qu'elle ne peut pas lire, seulement si nous ajoutonsB
- l'action du navigateur alors nous pourrions avoirRBRBRBR...
maisBBBBBB
est alors sur son propre UTM.CSS n'est pas un langage de programmation, donc la question de la complétude de turing est vide de sens. Si des extensions de programmation sont ajoutées à CSS comme c'était le cas dans IE6, cette nouvelle synthèse est une toute autre chose.
CSS n'est qu'une description des styles; il n'a pas de logique et sa structure est plate.
la source