Tại sao phân tích cú pháp nghiêm ngặt không được chọn cho HTML?


38

Tôi thường tự hỏi tại sao phân tích cú pháp nghiêm ngặt không được chọn khi tạo HTML. Trong hầu hết lịch sử Internet, các trình duyệt đã chấp nhận bất kỳ loại đánh dấu nào và cố gắng hết sức để phân tích nó. Quá trình làm giảm hiệu suất, cho phép mọi người viết vô nghĩa và gây khó khăn cho việc ngừng các tính năng lỗi thời.

Có một lý do cụ thể tại sao HTML không được phân tích cú pháp nghiêm ngặt không?


7
Bạn có thể tìm thấy bài viết Joels, Tai nghe sao Hỏa được quan tâm. Cũng cần lưu ý đặc biệt là RFC 793: Nguyên tắc mạnh mẽ , trong đó nêu rõ rằng việc triển khai TCP nên cố gắng hết sức để phân tích rác. Nguyên tắc này đã được áp dụng cho các trình duyệt.
Brian

25
@Brian: Mạnh mẽ có nghĩa là bạn không nên ngã khi nhận được tào lao. Điều đó không có nghĩa là bạn phải hiểu chuyện tào lao.
Marjan Venema

2
XHTML không sử dụng phân tích cú pháp nghiêm ngặt.
dùng16764

3
Có phải chỉ có tôi, hoặc không có câu trả lời nào trong số này rất thỏa mãn?
gsingh2011

2
@ gsingh2011 Không có câu trả lời nào thỏa mãn, nhưng câu trả lời của tôi là sự thật. Một số người trong chúng ta đã hoạt động trên mạng từ lâu :-) Nhưng vâng, thật đáng ngạc nhiên khi chúng ta còn lại bao nhiêu rác vì những lý do đơn giản như vậy.
Ross Patterson

Câu trả lời:


39

Lý do rất đơn giản: Tại thời điểm các trình duyệt đồ họa đầu tiên, NCSA Mosiac và sau đó là Netscape Navigator, hầu như tất cả HTML đều được viết bằng tay. Các tác giả trình duyệt (Netscape được xây dựng bởi những người cũ của khảm) đã nhanh chóng nhận ra rằng việc từ chối hiển thị HTML không chính xác sẽ bị người dùng và voila chống lại họ !


7
+1 có, đó là cách tất cả bắt đầu, bằng vi hoặc notepad. Với hầu hết các trang được sao chép từ mã ví dụ xấu, nó không bao giờ tốt hơn. Cộng với WWW bùng nổ, vì vậy bất cứ ai có thể gõ trở thành nhà phát triển web và tất cả đều được hoàn thành nhanh chóng.
jqa

1
Rõ ràng, câu trả lời này kết hợp với nhận xét của @ Jukka đưa ra lời giải thích tốt nhất có thể
Shubham

35

Bởi vì đưa ra dự đoán tốt nhất là điều nên làm, từ quan điểm của một nhà sản xuất trình duyệt. Xem xét tình huống: lý tưởng nhất là HTML bạn nhận được là hoàn toàn chính xác và theo thông số kỹ thuật. Thật tuyệt. Nhưng phần thú vị là những gì xảy ra khi HTML không chính xác; vì chúng tôi đang xử lý đầu vào từ một nguồn mà chúng tôi không có ảnh hưởng đến, thực sự, chúng tôi phải chuẩn bị cho việc này. Bây giờ khi điều đó xảy ra, chúng ta có thể làm gì? Chúng tôi có hai lựa chọn: a) thất bại và b) nỗ lực hết sức để khắc phục lỗi. Nếu chúng tôi thất bại, người dùng không có gì ngoài một thông báo lỗi vô dụng và họ không thể làm gì được vì họ không kiểm soát máy chủ. Nếu chúng tôi nỗ lực hết sức, người dùng có ít nhất những gì chúng tôi có thể tạo ra cho trang và thường thì dự đoán là chủ yếu.

Vấn đề thực sự duy nhất với vấn đề này là khi bạn cần thông báo lỗi, thường là trong tình huống phát triển - bạn muốn đảm bảo rằng HTML bạn tạo là chính xác và vì "hoạt động trong trình duyệt X" không tương đương với "chính xác", chúng tôi không thể đơn giản chạy nó thông qua trình duyệt và xem nó có hoạt động không: chúng tôi không thể phân biệt sự khác biệt giữa HTML chính xác và HTML không chính xác mà trình duyệt đã sửa cho bạn. Đây là một vấn đề có thể giải quyết được mặc dù; có các plugin trình duyệt báo cáo các vi phạm tiêu chuẩn, có trình xác nhận W3C và nhiều công cụ tương tự khác.


7
Chà, tôi không nghĩ ai sẽ phục vụ HTML mà phát sinh lỗi. Tại sao bạn nghĩ rằng một trình biên dịch giả định mã là bất kỳ khác với trình duyệt giả định HTML.
Shubham

1
Tôi đồng ý với Shubham ở đây - "vì chúng tôi đang xử lý đầu vào từ một nguồn mà chúng tôi không có ảnh hưởng" là sai, ảnh hưởng là gián tiếp nhưng một số trang web vẫn hỗ trợ IE6 vì ảnh hưởng đó.
Steve314

2
@Shubham: Trình biên dịch khác nhau vì mục đích của nó không phải là chuyển đổi mã nguồn có thể đọc được bằng máy thành dạng dễ tiêu hóa của con người, mà là để chuyển đổi mã nguồn có thể đọc được của con người thành thứ gì đó thuận tiện hơn cho máy tính (mã máy hoặc một số trung gian định dạng). Với trình biên dịch, bạn sửa lỗi đầu vào và bạn rất vui vì mã không được đưa vào sản xuất. Với trình duyệt, bạn nguyền rủa nhà sản xuất trình duyệt hoặc tác giả trang web, nhưng bằng cách nào đó, bạn không được xem trang.
tdammers

2
@Shubham: Nói chung, người dùng trình biên dịch sẽ có quyền kiểm soát mã nguồn đang được biên dịch. Đó thường không phải là trường hợp với các trang web.
supercat

17

Các tác giả HTML và các công cụ tác giả tạo ra đánh dấu crappy. Các trình duyệt làm hết sức mình với nó vì lý do cạnh tranh: một trình duyệt không hiển thị hầu hết các trang web theo bất kỳ cách hợp lý nào sẽ bị người dùng từ chối, những người không quan tâm đến việc đó là lỗi của ai.

Nó khá khác với những gì việc triển khai ngôn ngữ lập trình làm. Trình biên dịch và trình thông dịch làm việc trên mã có thể được giả định là do người lập trình viết, trong khi mọi người và anh trai của anh ta có thể viết HTML mà không cần đào tạo tối thiểu hoặc không có. Theo một nghĩa nào đó, đánh dấu HTML là mã, nhưng đó là dữ liệu chứ không phải là hướng dẫn ngôn ngữ lập trình và truyền thống (tốt) trong phần mềm là chấp nhận dữ liệu.

Về nguyên tắc XHTML áp đặt các quy tắc phân tích cú pháp (XML) nghiêm ngặt, do đó, một tài liệu XHTML được cung cấp với loại nội dung XML sẽ chỉ được hiển thị nếu nó được định dạng tốt theo nghĩa XML - nếu không, chỉ có lỗi đầu tiên được truyền đến người dùng. Điều này không bao giờ trở nên phổ biến trong việc soạn thảo web - hầu như tất cả các XHTML, xung quanh được phục vụ dưới dạng văn bản / html và được xử lý như súp thẻ truyền thống theo cách rất tự do, chỉ với một số độ lệch tâm mới.


15
HTML authors and authoring tools produce crappy markup.- họ làm vì trình duyệt chấp nhận nó. Nếu ngay từ đầu các trình duyệt đã không chấp nhận nó - thì các công cụ & tác giả này sẽ không thể thoát khỏi việc tạo ra đánh dấu
tào lao

3
@GrandmasterB - Tôi nghĩ rằng bạn bỏ lỡ vấn đề - Ngay cả khi chỉ có một trình duyệt trên thị trường - nó không thực hiện phân tích cú pháp nghiêm ngặt.
dùng93353

3
Lưu ý hài hước: bạn nói rằng nếu một trình duyệt không thể phân tích một trang web không hợp lệ, nó sẽ mất thị phần. Nhưng chỉ cần nhìn vào tức là: tuy nhiên nó tệ, nó không mất thị phần. Nó chỉ buộc các nhà phát triển nghèo viết ra các bản hack bẩn trong việc sử dụng các API cũ ... Và đừng để tôi bắt đầu với sơ đồ phiên bản của nó ...
Max

3
Ban đầu, các trình duyệt được viết vội vàng để đối phó với một ngôn ngữ đánh dấu chưa được hoàn thiện và không có thông số kỹ thuật chính thức - không có quy tắc phân tích nghiêm ngặt. (HTML 2.0, vào năm 1995, trên danh nghĩa là SGML, nhưng đã quá muộn để thực hiện điều đó.)
Jukka K. Korpela

2
IE thực sự đã mất khá nhiều thị phần. Nhưng điều này có lẽ có ít nếu có bất cứ điều gì để làm với phân tích nghiêm ngặt. IE, với sự kỳ quặc của nó, đã cai trị web đủ lâu để buộc các trình duyệt khác bắt chước phần lớn sự kỳ lạ của nó, bởi vì rất nhiều trang sẽ bị sụp đổ.
Jukka K. Korpela

9

Tóm lại, HTML sẽ dựa trên một ngôn ngữ đánh dấu không liên kết khác có tên là SGML thường được sử dụng cho tài liệu và hướng dẫn sử dụng và những thứ tương tự.

Từ một bài viết về lịch sử của HTML:

Tim đã đề cập rằng một số tài liệu HTML ban đầu dựa trên ngôn ngữ SGML cũ mà CERN đã sử dụng: - Chúng tôi đã đưa vào HTML một số thẻ từ bộ thẻ SGML được sử dụng tại và từng được hỗ trợ tại CERN [...] Trình phân tích cú pháp HTML sẽ bỏ qua các thẻ mà nó không hiểu và sẽ bỏ qua các thuộc tính mà nó không hiểu về các thẻ CERN-SGML .

[...] hầu hết các thẻ HTML ban đầu thực sự được lấy từ ngôn ngữ CML SGMLGuid, bản thân nó là một biến thể của AAP (ngôn ngữ SGML ban đầu). Ví dụ, tiêu đề, hn, p, ol, v.v ... tất cả đều được lấy từ ngôn ngữ này. Sự thay đổi căn bản duy nhất là việc bổ sung tất cả các liên kết neo () quan trọng mà WWW sẽ không thực hiện.

Về cơ bản, đã lưu ý đến phần tôi đã in đậm, họ đã triển khai một tập hợp con các thẻ có sẵn trong hệ thống SGML mà họ quen thuộc, thêm thẻ <a> neo mới và chọn bỏ qua bất kỳ thẻ nào trong số nhiều thẻ họ đã không ' Không quan tâm hoặc muốn hỗ trợ cho lý do wahtever (chẳng hạn như thẻ cho danh sách thư mục, xmp cho thẻ "ví dụ", "hộp" để vẽ một hộp xung quanh một khối văn bản, v.v.). Vì vậy, cách đơn giản nhất để làm điều đó là tha thứ cho đánh dấu mà trình phân tích cú pháp không biết và bỏ qua đánh dấu không xác định tốt nhất có thể, bất kể nguyên nhân là do người dùng nhập đánh dấu xấu hay cách nhanh nhất dễ dàng nhất để chuyển đổi tài liệu hiện có sang định dạng HTML mới này là để thêm một số siêu liên kết vào các tài liệu SGML hiện có và bỏ qua mọi thẻ không được hỗ trợ hoặc triển khai.


Cú pháp HTML thực sự dựa trên Cú pháp cụ thể tham chiếu SGML cho hình thức đánh dấu của nó. Nhưng bản thân SGML không có các yếu tố để đánh dấu các tài liệu mà HTML có thể mượn, Bộ phần tử HTML thực sự giống với ngôn ngữ đánh dấu tài liệu GML của IBM , được chuyển thành RCS SGML.
Ross Patterson

5

Đây là một phần tàn dư lịch sử của cuộc chiến trình duyệt

IE và Netscape đang cạnh tranh để chiếm lĩnh thị trường và tiếp tục phát hành các tính năng mới ngày càng trở nên "tuyệt vời" hơn và buộc phải chấp nhận các trang được thiết kế cho trình duyệt khác.

Điều này có nghĩa là trình duyệt chấp nhận và bỏ qua các thẻ không xác định một cách im lặng, sau khi các ủy ban bắt đầu tham gia ... bạn cũng có một ủy ban thiết kế công cụ và kết quả là rất nhiều phiên bản khác nhau (với một số thông số kỹ thuật mơ hồ) mà trình duyệt muốn hỗ trợ hầu hết chúng và tạo một trình phân tích cú pháp riêng cho từng phiên bản sẽ rất lớn. Vì vậy, dễ dàng hơn (tương đối) để sử dụng một trình phân tích cú pháp duy nhất với các chế độ khác nhau.

Đối với một phần khác, Netscape và IE muốn html có thể truy cập được đối với người bình thường (cũng như mốt ngày nay), điều đó có nghĩa là cố gắng làm những gì người dùng muốn thực hiện thay vì những gì anh ta nói phải làm và vấp phải mọi thẻ lủng lẳng.

Làm cho vấn đề tồi tệ hơn là cũng có một số trang web "hướng dẫn" dạy sai và nghĩ rằng họ đúng vì những gì họ dạy đều hiệu quả.

Cuối cùng, điều này có nghĩa là nếu bây giờ bạn tạo một trình duyệt chỉ phân tích cú pháp html nghiêm ngặt thì 99% các trang web ngoài đó sẽ không hoạt động.


6
Ngay cả trước khi IE xuất hiện trên thị trường, Netscape chưa bao giờ phân tích cú pháp nghiêm ngặt. Tôi nhớ Netscape từ đầu năm 1997.
user93353

Ngay cả khi có các tiêu chuẩn rõ ràng, trình duyệt sẽ khó phân biệt giữa các thẻ được xác định hợp pháp sau khi trình duyệt được phát hành, so với các thẻ chưa bao giờ và sẽ không bao giờ hợp pháp. Nếu các thẻ "tùy chọn" nâng cao tài liệu nhưng không bắt buộc về tính chính xác ngữ nghĩa của nó bao gồm số phiên bản của tiêu chuẩn đã triển khai chúng, thì trình duyệt triển khai phiên bản 23 của tiêu chuẩn có thể âm thầm bỏ qua <o24wowzo>thẻ nhưng chùn bước <o23wowzo>, nhưng như vậy một thiết kế sẽ làm suy yếu khía cạnh "con người có thể đọc được" của HTML.
supercat

2

Vâng, chúng tôi đã cố gắng thiết lập một tùy chọn nghiêm ngặt tốt đẹp trong những năm 000 nhưng điều đó không thành công vì mọi người tuân theo "thực tiễn tốt nhất" một cách mù quáng, đổ lỗi cho các trình duyệt khi đánh dấu không chính xác của họ đi vào chế độ nghiêm ngặt. Và các nhà cung cấp trình duyệt không muốn bị đổ lỗi.

Họ tuyên bố đó là vì họ muốn web dễ truy cập hơn đối với những người không chuyên nhưng không ai bị ngừng sử dụng HTML 4 ở dạng nhẹ nhàng nhất.

Điều đó nói rằng, bạn vẫn có thể phục vụ HTML5 dưới dạng XML nếu bạn muốn bố cục theo kiểu nghiêm ngặt. IMO có thể là một cách tốt để gặt hái những lợi ích của việc bố trí hoặc giao diện người dùng làm việc ở chế độ chặt chẽ hơn trước khi bạn chuyển nó cho những người khác, những người có thể hoặc không muốn nó nghiêm ngặt mà không có bất kỳ rủi ro thực sự nào (cấm họ loại bỏ tài liệu vì họ thực sự ủng hộ chế độ kỳ quặc - vào năm 2017 (thời điểm chỉnh sửa này) họ nên bị bắn. Vì vậy, về cơ bản nó vẫn còn một số nghiên cứu. Tôi dường như nhớ lại rằng có một số cảnh báo mà chúng tôi không có với XHTML mà không Thực sự không ảnh hưởng đến công việc bố trí. Chỉ cần đừng lan truyền rằng đó là "cách duy nhất để làm đúng" hoặc những người sinh đôi mua vào kiểu nói chuyện đó sẽ đánh cắp ý tưởng, đổ lỗi cho các trình duyệt một lần nữa và họ sẽ lấy răng trong số các lựa chọn nghiêm ngặt duy nhất chúng tôi còn lại. (chỉnh sửa năm 2017:

http://mathiasbynens.be/notes/xhtml5

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.