Un aspetto della completezza di Turing è l' arresto del problema .
Ciò significa che, se CSS è Turing completo, allora non esiste un algoritmo generale per determinare se un programma CSS finirà per funzionare o eseguire il ciclo per sempre.
Ma possiamo derivare un tale algoritmo per CSS! Ecco qui:
Se il foglio di stile non dichiara alcuna animazione , si interromperà.
Se ha animazioni, allora:
Questo è tutto. Dato che abbiamo appena risolto il problema di arresto per CSS, ne consegue che CSS non è completo di Turing .
(Altre persone hanno menzionato IE 6, che consente di incorporare espressioni JavaScript arbitrarie nei CSS; questo ovviamente aggiungerà completezza a Turing. Ma quella funzionalità non è standard e nessuno nella loro mente corretta la usa comunque.)
Daniel Wagner ha sollevato un punto che mi mancava nella risposta originale. Nota che mentre ho coperto le animazioni , anche altre parti del motore di stile come la corrispondenza dei selettori o il layout possono portare alla completezza di Turing. Sebbene sia difficile formulare un'argomentazione formale in merito, cercherò di spiegare perché è improbabile che la completezza di Turing accada.
Primo: le lingue complete di Turing hanno un modo per reinserire i dati in se stessi , sia attraverso la ricorsione che il looping. Ma il design del linguaggio CSS è ostile a questo feedback:
@media
le query possono controllare solo le proprietà del browser stesso, come le dimensioni della finestra o la risoluzione dei pixel. Queste proprietà possono cambiare tramite l'interazione dell'utente o il codice JavaScript (ad es. Ridimensionamento della finestra del browser), ma non solo tramite CSS.
::before
e gli ::after
pseudo-elementi non sono considerati parte del DOM e non possono essere abbinati in nessun altro modo.
I combinatori selettori possono solo ispezionare gli elementi sopra e prima dell'elemento corrente, quindi non possono essere utilizzati per creare cicli di dipendenza.
È possibile spostare un elemento quando ci si passa sopra , ma la posizione si aggiorna solo quando si sposta il mouse.
Ciò dovrebbe essere sufficiente per convincerti che la corrispondenza del selettore, da sola, non può essere Turing completa . Ma per quanto riguarda il layout?
Il moderno algoritmo di layout CSS è molto complesso, con funzionalità come Flexbox e Grid che confondono le acque. Ma anche se fosse possibile innescare un loop infinito con layout, sarebbe difficile sfruttarlo per eseguire utili calcoli. Questo perché i selettori CSS controllano solo la struttura interna del DOM, non il modo in cui questi elementi sono disposti sullo schermo. Pertanto, qualsiasi prova di completezza di Turing che utilizza il sistema di layout deve dipendere solo dal layout .
Infine - e questa è forse la ragione più importante - i venditori di browser hanno interesse a mantenere CSS non Turing completo . Limitando la lingua, i fornitori consentono ottimizzazioni intelligenti che rendono il Web più veloce per tutti. Inoltre, Google dedica un'intera server farm alla ricerca di bug in Chrome. Se ci fosse un modo per scrivere un ciclo infinito usando i CSS, probabilmente lo avrebbero già trovato 😉