Ein Aspekt der Vollständigkeit von Turing ist das Problem des Anhaltens .
Dies bedeutet, dass es keinen allgemeinen Algorithmus gibt, um zu bestimmen, ob ein CSS-Programm für immer beendet wird oder eine Schleife ausführt , wenn CSS abgeschlossen ist .
Aber wir können einen solchen Algorithmus für CSS ableiten! Hier ist es:
Wenn das Stylesheet keine Animationen deklariert , wird es angehalten.
Wenn es Animationen gibt, dann:
Wenn dies der Fall animation-iteration-count
ist infinite
und der enthaltende Selektor im HTML-Code übereinstimmt, wird er nicht angehalten.
Andernfalls wird es angehalten.
Das ist es. Da wir gerade das Stoppproblem für CSS gelöst haben, ist CSS nicht vollständig .
(Andere Leute haben IE 6 erwähnt, mit dem beliebige JavaScript-Ausdrücke in CSS eingebettet werden können. Dies erhöht natürlich die Vollständigkeit von Turing. Diese Funktion ist jedoch nicht Standard, und niemand, der bei klarem Verstand ist, verwendet sie trotzdem.)
Daniel Wagner brachte einen Punkt vor, den ich in der ursprünglichen Antwort übersehen habe. Er merkt an, dass, während ich Animationen behandelt habe , andere Teile der Style-Engine wie Selector Matching oder Layout ebenfalls zur Vollständigkeit von Turing führen können. Obwohl es schwierig ist, ein formelles Argument dafür zu liefern, werde ich versuchen zu skizzieren, warum die Vollständigkeit von Turing immer noch unwahrscheinlich ist.
Erstens: Turing vollständige Sprachen haben eine Möglichkeit , Daten in sich selbst zurückzugeben , sei es durch Rekursion oder Schleife. Das Design der CSS-Sprache widerspricht jedoch diesem Feedback:
@media
Abfragen können nur die Eigenschaften des Browsers selbst überprüfen, z. B. die Größe des Ansichtsfensters oder die Pixelauflösung. Diese Eigenschaften können sich über Benutzerinteraktion oder JavaScript-Code (z. B. Ändern der Größe des Browserfensters) ändern, jedoch nicht nur über CSS.
::before
und ::after
Pseudoelemente werden nicht als Teil des DOM betrachtet und können auf keine andere Weise abgeglichen werden.
Selektorkombinatoren können nur Elemente über und vor dem aktuellen Element untersuchen, sodass sie nicht zum Erstellen von Abhängigkeitszyklen verwendet werden können.
Es ist möglich, ein Element wegzuschieben, wenn Sie mit der Maus darüber fahren , aber die Position wird nur aktualisiert, wenn Sie die Maus bewegen.
Das sollte ausreichen, um Sie davon zu überzeugen, dass die Auswahl der Selektoren allein nicht vollständig sein kann . Aber was ist mit dem Layout?
Der moderne CSS-Layout-Algorithmus ist sehr komplex und bietet Funktionen wie Flexbox und Grid, die das Wasser trüben. Aber selbst wenn es möglich wäre, eine Endlosschleife mit Layout auszulösen, wäre es schwierig, dies zu nutzen, um nützliche Berechnungen durchzuführen. Dies liegt daran, dass CSS-Selektoren nur die interne Struktur des DOM überprüfen und nicht, wie diese Elemente auf dem Bildschirm angeordnet sind. Daher muss jeder Turing-Vollständigkeitsnachweis, der das Layoutsystem verwendet, nur vom Layout abhängen .
Schließlich - und dies ist vielleicht der wichtigste Grund - haben Browser-Anbieter ein Interesse daran, CSS nicht vollständig zu halten . Durch die Einschränkung der Sprache ermöglichen Anbieter clevere Optimierungen , die das Web für alle schneller machen. Darüber hinaus widmet Google eine ganze Serverfarm der Suche nach Fehlern in Chrome. Wenn es eine Möglichkeit gäbe, eine Endlosschleife mit CSS zu schreiben, hätten sie sie wahrscheinlich bereits gefunden 😉