CSS tidak, sejauh yang saya tahu, Turing selesai. Tetapi pengetahuan saya tentang CSS sangat terbatas.
- Apakah CSS Turing lengkap?
- Apakah ada draf atau komite yang ada yang mempertimbangkan fitur bahasa yang memungkinkan kelengkapan Turing jika tidak sekarang?
css
turing-complete
Adam Davis
sumber
sumber
Jawaban:
Anda dapat menyandikan Aturan 110 dalam CSS3, jadi Turing-complete selama Anda menganggap file HTML yang sesuai dan interaksi pengguna sebagai bagian dari "eksekusi" CSS. Sebuah implementasi yang cukup baik tersedia, dan implementasi lain termasuk di sini:
sumber
Salah satu aspek dari kelengkapan Turing adalah masalah penghentian .
Ini berarti bahwa, jika CSS sudah selesai, maka tidak ada algoritma umum untuk menentukan apakah program CSS akan selesai berjalan atau berulang selamanya.
Tapi kita bisa mendapatkan algoritma untuk CSS! Ini dia:
Jika stylesheet tidak menyatakan animasi apa pun , maka itu akan berhenti.
Jika memang memiliki animasi, maka:
Jika ada
animation-iteration-count
adalahinfinite
, dan pemilih yang mengandung cocok di HTML, maka akan tidak menghentikan.Kalau tidak, itu akan berhenti.
Itu dia. Karena kami baru saja menyelesaikan masalah penghentian untuk CSS, itu berarti bahwa CSS tidak Turing lengkap .
(Orang lain telah menyebutkan IE 6, yang memungkinkan untuk menanamkan ekspresi JavaScript sewenang-wenang dalam CSS; yang jelas akan menambah kelengkapan Turing. Tetapi fitur itu tidak standar, dan toh tidak ada orang waras yang menggunakannya).
Daniel Wagner mengemukakan satu hal yang saya lewatkan dalam jawaban aslinya. Dia mencatat bahwa sementara saya sudah membahas animasi , bagian lain dari mesin gaya seperti pencocokan pemilih atau tata letak dapat menyebabkan kelengkapan Turing juga. Meskipun sulit untuk membuat argumen formal tentang ini, saya akan mencoba untuk menguraikan mengapa kelengkapan Turing masih tidak mungkin terjadi.
Pertama: Turing bahasa lengkap memiliki beberapa cara untuk memasukkan data kembali ke dalam dirinya sendiri , apakah itu melalui rekursi atau perulangan. Tetapi desain bahasa CSS memusuhi umpan balik ini:
@media
kueri hanya dapat memeriksa properti browser itu sendiri, seperti ukuran viewport atau resolusi piksel. Properti ini dapat berubah melalui interaksi pengguna atau kode JavaScript (misalnya mengubah ukuran jendela browser), tetapi tidak melalui CSS saja.::before
dan::after
pseudo-elemen tidak dianggap sebagai bagian dari DOM , dan tidak dapat dicocokkan dengan cara lain.Combinator pemilih hanya dapat memeriksa elemen di atas dan sebelum elemen saat ini, sehingga mereka tidak dapat digunakan untuk membuat siklus ketergantungan.
Dimungkinkan untuk menggeser elemen ketika Anda mengarahkan mouse ke atasnya , tetapi posisinya hanya diperbarui ketika Anda menggerakkan mouse.
Itu seharusnya cukup untuk meyakinkan Anda bahwa pencocokan pemilih, sendiri, tidak bisa Turing lengkap . Tapi bagaimana dengan tata letak?
Algoritma tata letak CSS modern sangat kompleks, dengan fitur-fitur seperti Flexbox dan Grid memperkeruh perairan. Tetapi bahkan jika itu mungkin untuk memicu loop tak terbatas dengan tata letak, akan sulit untuk memanfaatkan ini untuk melakukan perhitungan yang bermanfaat. Itu karena penyeleksi CSS hanya memeriksa struktur internal DOM, bukan bagaimana elemen-elemen ini diletakkan di layar. Jadi setiap bukti kelengkapan Turing menggunakan sistem tata letak harus bergantung pada tata letak saja .
Akhirnya - dan ini mungkin alasan paling penting - vendor browser tertarik untuk menjaga agar CSS tidak lengkap . Dengan membatasi bahasa, vendor memungkinkan untuk optimasi pintar yang membuat web lebih cepat untuk semua orang. Selain itu, Google mendedikasikan seluruh server pertanian untuk mencari bug di Chrome. Jika ada cara untuk menulis infinite loop menggunakan CSS, maka mereka mungkin sudah menemukannya 😉
sumber
Sesuai artikel ini, tidak . Artikel itu juga berpendapat bahwa bukan ide yang baik untuk membuatnya.
Mengutip dari salah satu komentar:
sumber
Kelengkapan Turing tidak hanya tentang "mendefinisikan fungsi" atau "memiliki ifs / loop / etc". Misalnya, Haskell tidak memiliki "loop", lambda-calculus tidak memiliki "seandainya", dll ...
Misalnya, situs ini: http://experthuman.com/programming-with-nothing . Penulis menggunakan Ruby dan membuat program "FizzBuzz" dengan hanya penutupan (tanpa string, angka, atau apa pun seperti itu) ...
Ada contoh ketika orang menghitung beberapa fungsi aritmatika pada Scala hanya menggunakan sistem tipe
Jadi, ya, menurut saya, CSS3 + HTML sudah selesai-turing (bahkan jika Anda tidak bisa melakukan perhitungan nyata dengan itu tanpa menjadi gila)
sumber
Masalah mendasar di sini adalah bahwa mesin apa pun yang ditulis dalam HTML + CSS tidak dapat mengevaluasi banyak langkah tanpa batas (yaitu tidak ada rekursi "nyata") kecuali kodenya panjang tak terhingga. Dan pertanyaannya apakah mesin ini akan mencapai konfigurasi
H
dalam beberapan
langkah atau kurang selalu dapat dijawab jikan
terbatas.sumber
H
?" selalu decidable dan karenanya Turing tidak lengkap. Implementasi otomat seluler yang hanya dapat melakukan iterasi terbatas hingga tidak pernah dapat dilakukan secara lengkap.Ini jawabannya tidak akurat karena mencampur deskripsi UTM dan UTM sendiri (Universal Turing Machine).
Kami memiliki jawaban yang baik tetapi dari sudut pandang yang berbeda dan tidak menunjukkan kelemahan langsung pada jawaban teratas saat ini.
Pertama-tama kita dapat sepakat bahwa manusia dapat bekerja sebagai UTM. Ini artinya jika kita melakukannya
Maka
CSS
bagian tidak berguna karena semua pekerjaan dapat dilakukan olehHuman
siapa yang akan melakukan bagian UTM. Tindakan mengklik dapat berupa UTM, karena Anda tidak mengklik secara acak tetapi hanya di tempat tertentu.Alih-alih CSS saya bisa menggunakan teks ini ( Aturan 110 ):
Untuk memandu tindakan dan hasil saya akan sama. Ini berarti teks ini UTM? Tidak, ini hanya input (deskripsi) yang dapat dibaca dan dijalankan UTM (manusia atau komputer) lainnya. Mengklik sudah cukup untuk menjalankan UTM apa pun.
Bagian penting yang tidak dimiliki CSS adalah kemampuan untuk mengubah keadaannya sendiri secara sewenang-wenang, jika CSS dapat menghasilkan klik maka itu adalah UTM. Argumen bahwa klik Anda "engkol" untuk CSS tidak akurat karena "engkol" nyata untuk CSS adalah Layout Engine yang menjalankannya dan itu harus cukup untuk membuktikan bahwa CSS adalah UTM.
sumber
R
- status baca, danW
- status tulis, CA normal melakukan urutan tak terbatasRWRWRWRW...
untuk CSS yang kita miliki sajaR
, dan kita tidak memilikinyaW
karena memodifikasi hal-hal yang tidak dapat dibaca, hanya jika kita menambahkanB
- Tindakan browser maka kita bisaRBRBRBR...
tetapi kemudianBBBBBB
pada UTM sendiri.CSS bukan bahasa pemrograman, jadi pertanyaan tentang kelengkapan-turing adalah yang tidak berarti. Jika ekstensi pemrograman ditambahkan ke CSS seperti yang terjadi di IE6 maka sintesis baru adalah hal yang sama sekali berbeda.
CSS hanyalah deskripsi gaya; tidak memiliki logika, dan strukturnya datar.
sumber