Jednym z aspektów kompletności Turinga jest problem zatrzymania .
Oznacza to, że jeśli CSS jest ukończony przez Turinga, nie ma ogólnego algorytmu określającego, czy program CSS zakończy działanie lub zapętli na zawsze.
Ale możemy uzyskać taki algorytm dla CSS! Oto on:
Otóż to. Ponieważ właśnie rozwiązaliśmy problem zatrzymania CSS, wynika z tego, że CSS nie jest kompletny w Turingu .
(Inni wspominali o IE 6, która pozwala na osadzanie dowolnych wyrażeń JavaScript w CSS; to oczywiście doda kompletność Turinga. Ale ta funkcja jest niestandardowa i nikt przy zdrowych zmysłach i tak z niej nie korzysta).
Daniel Wagner poruszył kwestię, której mi brakowało w pierwotnej odpowiedzi. Zauważa, że chociaż omówiłem animacje , inne części silnika stylu, takie jak dopasowanie selektora lub układ, mogą również prowadzić do kompletności Turinga. Chociaż trudno o formalny spór na ten temat, postaram się wyjaśnić, dlaczego kompletność Turinga nadal jest mało prawdopodobna.
Po pierwsze: Turing z kompletnymi językami ma jakiś sposób na przekazywanie danych z powrotem do siebie , czy to poprzez rekurencję czy zapętlanie. Ale konstrukcja języka CSS jest wrogo nastawiona do tej opinii:
@media
zapytania mogą sprawdzać tylko właściwości samej przeglądarki, takie jak rozmiar rzutni lub rozdzielczość pikseli. Te właściwości można zmienić za pomocą interakcji użytkownika lub kodu JavaScript (np. Zmiana rozmiaru okna przeglądarki), ale nie tylko za pomocą CSS.
::before
a ::after
pseudoelementy nie są uważane za część DOM i nie można ich dopasowywać w żaden inny sposób.
Kombinatory selektorów mogą sprawdzać tylko elementy powyżej i przed bieżącym elementem, więc nie można ich używać do tworzenia cykli zależności.
Można przesunąć element, gdy najedziesz na niego kursorem , ale pozycja jest aktualizowana tylko po przesunięciu myszy.
To powinno wystarczyć, aby przekonać cię, że samo dopasowanie selektora nie może być zakończone przez Turinga . Ale co z układem?
Nowoczesny algorytm układu CSS jest bardzo złożony, z takimi funkcjami jak Flexbox i Grid mętniącymi wody. Ale nawet gdyby można było uruchomić nieskończoną pętlę z układem, trudno byłoby to wykorzystać do wykonania użytecznego obliczenia. Dzieje się tak, ponieważ selektory CSS sprawdzają tylko wewnętrzną strukturę DOM, a nie to, jak te elementy są rozmieszczone na ekranie. Tak więc każdy dowód kompletności Turinga przy użyciu systemu układu musi zależeć od samego układu .
Wreszcie - i jest to być może najważniejszy powód - producenci przeglądarek mają interes w tym, aby CSS nie był kompletny . Ograniczając język, dostawcy pozwalają na sprytne optymalizacje , dzięki którym internet jest szybszy dla wszystkich. Co więcej, Google poświęca całą farmę serwerów na wyszukiwanie błędów w Chrome. Gdyby istniał sposób na napisanie nieskończonej pętli za pomocą CSS, prawdopodobnie już by ją znaleźli 😉