O ile wiem, CSS nie jest kompletny. Ale moja wiedza na temat CSS jest bardzo ograniczona.
- Czy CSS Turing jest kompletny?
- Czy któryś z istniejących projektów lub komitetów rozważa funkcje językowe, które mogłyby umożliwić kompletność Turinga, jeśli nie jest to teraz?
css
turing-complete
Adam Davis
źródło
źródło
Odpowiedzi:
Możesz zakodować Regułę 110 w CSS3, więc jest ona kompletna Turinga, pod warunkiem, że weźmiesz pod uwagę odpowiedni towarzyszący plik HTML i interakcje użytkownika jako część „wykonania” CSS. Dostępna jest całkiem dobra implementacja , a tutaj znajduje się kolejna implementacja:
źródło
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:
Jeśli arkusz stylów nie deklaruje żadnych animacji , zostanie zatrzymany.
Jeśli ma animacje, to:
Jeśli jakakolwiek
animation-iteration-count
jestinfinite
, a przełącznik zawierający dopasowane w HTML, to będzie nie zatrzyma.W przeciwnym razie się zatrzyma.
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 😉
źródło
Zgodnie z tym artykułem tak nie jest . Artykuł twierdzi również, że nie jest dobrym pomysłem, aby to zrobić.
Aby zacytować jeden z komentarzy:
źródło
Kompletność Turinga to nie tylko „definiowanie funkcji” lub „mieć ifs / loops / etc”. Na przykład Haskell nie ma „pętli”, rachunek lambda nie ma „ifs” itp.
Na przykład ta strona: http://experthuman.com/programming-with-nothing . Autor używa Ruby i tworzy program „FizzBuzz” z tylko zamknięciami (bez ciągów, liczb ani niczego podobnego) ...
Istnieją przykłady, w których ludzie obliczają niektóre funkcje arytmetyczne na Scali przy użyciu tylko systemu typów
Tak więc, moim zdaniem, CSS3 + HTML jest turing-complete (nawet jeśli nie możesz wykonać żadnego prawdziwego obliczenia, nie wariując)
źródło
Podstawową kwestią jest to, że żadna maszyna napisana w HTML + CSS nie może ocenić nieskończenie wielu kroków (tzn. Nie może być „prawdziwej” rekurencji), chyba że kod jest nieskończenie długi. Pytanie, czy ta maszyna osiągnie konfigurację
H
wn
krokach lub mniej, zawsze daje odpowiedź, jeślin
jest skończona.źródło
H
?” jest zawsze rozstrzygalne i dlatego nie jest kompletne w Turingu. Implementacja automatu komórkowego, który może wykonywać tylko skończoną liczbę iteracji, nigdy nie będzie kompletna.Ta odpowiedź nie jest dokładna, ponieważ łączy opis UTM i samego UTM (Universal Turing Machine).
Mamy dobrą odpowiedź, ale z innej perspektywy i nie pokazuje ona bezpośrednio wad w bieżącej najlepszej odpowiedzi.
Przede wszystkim możemy się zgodzić, że człowiek może działać jako UTM. To znaczy, jeśli to zrobimy
Wtedy
CSS
część jest bezużyteczna, ponieważ cała praca może być wykonana przezHuman
osobę wykonującą część UTM. Aktem klikania może być UTM, ponieważ nie klikasz losowo, ale tylko w określonych miejscach.Zamiast CSS mógłbym użyć tego tekstu ( Reguła 110 ):
Aby kierować moimi działaniami, a wynik będzie taki sam. Czy to oznacza, że tekst UTM? Nie, to tylko dane wejściowe (opis), które inny UTM (człowiek lub komputer) może odczytać i uruchomić. Kliknięcie wystarczy, aby uruchomić dowolny UTM.
Krytyczną kwestią, której brakuje CSS, jest możliwość zmiany własnego stanu w dowolny sposób, jeśli CSS mógłby generować kliknięcia, byłby to UTM. Argument, że twoje kliknięcia są „korbowe” dla CSS, nie jest dokładny, ponieważ prawdziwy „korbowy” dla CSS to Layout Engine, który je uruchamia i powinno wystarczyć, aby udowodnić, że CSS to UTM.
źródło
R
- stan odczytu iW
- stan zapisu, normalny CA robi nieskończoną sekwencjęRWRWRWRW...
w przypadku CSS, który mamy tylkoR
i nie mamy,W
ponieważ modyfikuje rzeczy, których nie może odczytać, tylko jeśli dodamyB
- akcja przeglądarki może wtedy mieć,RBRBRBR...
ale wtedyBBBBBB
jest na swoim własnym UTM.CSS nie jest językiem programowania, więc kwestia kompletności jest bez znaczenia. Jeśli rozszerzenia CSS są dodawane do CSS, tak jak miało to miejsce w IE6, nowa synteza jest zupełnie inna.
CSS jest jedynie opisem stylów; nie ma żadnej logiki, a jego struktura jest płaska.
źródło