CSS ist, soweit ich weiß, nicht vollständig. Meine Kenntnisse in CSS sind jedoch sehr begrenzt.
- Ist CSS Turing abgeschlossen?
- Berücksichtigt einer der vorhandenen Entwürfe oder Ausschüsse Sprachfunktionen, die die Vollständigkeit von Turing ermöglichen könnten, wenn dies nicht der Fall ist?
css
turing-complete
Adam Davis
quelle
quelle
Antworten:
Sie können Regel 110 in CSS3 codieren , sodass sie vollständig ist, solange Sie eine geeignete begleitende HTML-Datei und Benutzerinteraktionen als Teil der „Ausführung“ von CSS betrachten. Eine ziemlich gute Implementierung ist verfügbar, und eine andere Implementierung ist hier enthalten:
quelle
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
istinfinite
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 😉
quelle
Laut diesem Artikel ist es nicht . Der Artikel argumentiert auch, dass es keine gute Idee ist, es zu einem zu machen.
Um aus einem der Kommentare zu zitieren:
quelle
Bei der Vollständigkeit der Turing geht es nicht nur darum, "Funktionen zu definieren" oder "ifs / loops / etc zu haben". Zum Beispiel hat Haskell keine "Schleife", Lambda-Kalkül keine "Wenns" usw.
Zum Beispiel diese Seite: http://experthuman.com/programming-with-nothing . Der Autor verwendet Ruby und erstellt ein "FizzBuzz" -Programm mit nur Verschlüssen (keine Zeichenfolgen, Zahlen oder ähnliches) ...
Es gibt Beispiele, bei denen Benutzer einige arithmetische Funktionen in Scala nur mit dem Typsystem berechnen
Also, ja, meiner Meinung nach ist CSS3 + HTML vollständig (auch wenn Sie damit keine wirklichen Berechnungen durchführen können, ohne verrückt zu werden).
quelle
Das grundlegende Problem hierbei ist, dass jede in HTML + CSS geschriebene Maschine nicht unendlich viele Schritte auswerten kann (dh es kann keine "echte" Rekursion geben), es sei denn, der Code ist unendlich lang. Und die Frage , ob diese Maschine
H
inn
Schritten oder weniger die Konfiguration erreicht, ist immer zu beantworten, wenn sien
endlich ist.quelle
H
?" ist immer entscheidbar und damit nicht vollständig. Eine Implementierung eines zellularen Automaten, der nur eine begrenzte Anzahl von Iterationen ausführen kann, kann niemals vollständig sein.Diese Antwort ist nicht korrekt, da sie die Beschreibung von UTM und UTM selbst (Universal Turing Machine) mischt.
Wir haben eine gute Antwort, aber aus einer anderen Perspektive, und es zeigt keine direkten Fehler in der aktuellen Top-Antwort.
Zunächst können wir uns darauf einigen, dass der Mensch als UTM arbeiten kann. Das heißt, wenn wir es tun
Dann ist ein
CSS
Teil nutzlos, da alle Arbeiten von dem erledigt werden können,Human
der den UTM-Teil ausführt. Das Klicken kann UTM sein, da Sie nicht zufällig klicken, sondern nur an bestimmten Stellen.Anstelle von CSS könnte ich diesen Text verwenden ( Regel 110 ):
Meine Handlungen und Ergebnisse zu leiten wird gleich sein. Das heißt dieser Text UTM? Nein, dies ist nur eine Eingabe (Beschreibung), die andere UTM (Mensch oder Computer) lesen und ausführen können. Ein Klick reicht aus, um eine UTM auszuführen.
Ein kritischer Teil, der CSS fehlt, ist die Fähigkeit, seinen eigenen Status auf willkürliche Weise zu ändern. Wenn CSS Klicks generieren könnte, wäre es UTM. Das Argument, dass Ihre Klicks für CSS "kurbelig" sind, ist nicht korrekt, da echte "Kurbel" für CSS die Layout-Engine ist, die es ausführt, und es sollte ausreichen, um zu beweisen, dass CSS UTM ist.
quelle
R
- Lesestatus undW
- Schreibstatus, normale Zertifizierungsstelle führt eine unendliche SequenzRWRWRWRW...
aus, wenn wir nur CSS habenR
, und wir haben keine,W
weil sie Dinge modifiziert, die sie nicht lesen kann, nur wenn wir hinzufügenB
- Browser-Aktion, die wir dann haben könnten,RBRBRBR...
aber dannBBBBBB
auf ihrer eigenen UTM ist.CSS ist keine Programmiersprache, daher ist die Frage der Vollständigkeit der Bedeutung bedeutungslos. Wenn CSS Programmiererweiterungen hinzugefügt werden, wie dies in IE6 der Fall war, ist diese neue Synthese eine ganz andere Sache.
CSS ist lediglich eine Beschreibung von Stilen. es hat keine Logik und seine Struktur ist flach.
quelle