Một khía cạnh của tính đầy đủ của Turing là vấn đề tạm dừng .
Điều này có nghĩa là, nếu CSS hoàn thành Turing, thì không có chung thuật toán để xác định liệu một chương trình CSS sẽ kết thúc chạy hay lặp mãi mãi.
Nhưng chúng ta có thể rút ra một thuật toán như vậy cho CSS! Đây là:
Nếu biểu định kiểu không khai báo bất kỳ hình động nào , thì nó sẽ dừng lại.
Nếu nó có hình động, thì:
Nếu animation-iteration-count
có infinite
, và bộ chọn chứa được khớp trong HTML, thì nó sẽ không dừng lại.
Nếu không, nó sẽ dừng lại.
Đó là nó. Vì chúng ta vừa giải quyết vấn đề tạm dừng cho CSS, nên CSS không hoàn thành .
.
Daniel Wagner đã đưa ra một điểm mà tôi đã bỏ lỡ trong câu trả lời ban đầu. Anh ấy lưu ý rằng trong khi tôi bao phủ các hình ảnh động , các phần khác của công cụ kiểu như kết hợp bộ chọn hoặc bố cục cũng có thể dẫn đến tính hoàn chỉnh của Turing. Mặc dù rất khó để đưa ra một lập luận chính thức về những điều này, tôi sẽ cố gắng phác thảo lý do tại sao Turing hoàn toàn không có khả năng xảy ra.
Thứ nhất: Các ngôn ngữ hoàn chỉnh Turing có một số cách cung cấp dữ liệu trở lại chính nó , cho dù đó là thông qua đệ quy hoặc lặp. Nhưng thiết kế của ngôn ngữ CSS là không phù hợp với phản hồi này:
@media
truy vấn chỉ có thể kiểm tra các thuộc tính của chính trình duyệt, chẳng hạn như kích thước khung nhìn hoặc độ phân giải pixel. Các thuộc tính này có thể thay đổi thông qua tương tác người dùng hoặc mã JavaScript (ví dụ: thay đổi kích thước cửa sổ trình duyệt), nhưng không chỉ thông qua CSS.
::before
và ::after
các phần tử giả không được coi là một phần của DOM và không thể được so khớp theo bất kỳ cách nào khác.
Bộ kết hợp chọn chỉ có thể kiểm tra các phần tử ở trên và trước phần tử hiện tại, vì vậy chúng không thể được sử dụng để tạo chu kỳ phụ thuộc.
Bạn có thể dịch chuyển một yếu tố khi bạn di chuột qua nó , nhưng vị trí chỉ cập nhật khi bạn di chuyển chuột.
Điều đó đủ để thuyết phục bạn rằng , chính nó, không thể hoàn thành Turing . Nhưng còn bố cục thì sao?
Thuật toán bố trí CSS hiện đại rất phức tạp, với các tính năng như Flexbox và Grid làm vấy bẩn vùng biển. Nhưng ngay cả khi có thể kích hoạt một vòng lặp vô hạn với bố cục, thật khó để tận dụng điều này để thực hiện tính toán hữu ích. Đó là bởi vì các bộ chọn CSS chỉ kiểm tra cấu trúc bên trong của DOM chứ không phải cách các phần tử này được trình bày trên màn hình. Vì vậy, bất kỳ bằng chứng hoàn chỉnh Turing sử dụng hệ thống bố trí phải phụ thuộc vào bố trí một mình .
Cuối cùng - và đây có lẽ là lý do quan trọng nhất - các nhà cung cấp trình duyệt có mối quan tâm đến việc giữ CSS không hoàn thành Turing . Bằng cách hạn chế ngôn ngữ, các nhà cung cấp cho phép tối ưu hóa thông minh giúp web nhanh hơn cho mọi người. Hơn nữa, Google dành toàn bộ trang trại máy chủ để tìm kiếm các lỗi trong Chrome. Nếu có một cách để viết một vòng lặp vô hạn bằng CSS, thì có lẽ họ đã tìm thấy nó rồi