Mengapa parsing ketat tidak dipilih untuk HTML?

38

Saya sering bertanya-tanya mengapa parsing ketat tidak dipilih saat membuat HTML. Untuk sebagian besar riwayat Internet, browser telah menerima segala jenis markup dan mencoba yang terbaik untuk menguraikannya. Proses ini menurunkan kinerja, memungkinkan orang untuk menulis omong kosong, dan membuatnya sulit menghentikan fitur usang.

Apakah ada alasan khusus mengapa HTML tidak diurai secara ketat?

Shubham
sumber
7
Anda mungkin menemukan artikel Joels, Headset Mars yang menarik. Juga catatan khusus adalah RFC 793: Prinsip Robustness , yang secara eksplisit menyatakan bahwa implementasi TCP harus mencoba yang terbaik untuk mengurai sampah. Prinsip ini telah diterapkan pada browser.
Brian
25
@ Brian: Robustness berarti Anda tidak boleh jatuh ketika Anda menerima omong kosong. Itu tidak berarti Anda harus masuk akal.
Marjan Venema
2
XHTML tidak menggunakan parsing ketat.
user16764
3
Apakah hanya saya, atau tidak ada jawaban yang sangat memuaskan?
gsingh2011
2
@ gsingh2011 Tidak ada jawaban yang memuaskan, tetapi jawaban saya adalah kebenaran. Beberapa dari kita di sini aktif di internet sejak lama :-) Tapi ya, sungguh mengherankan berapa banyak sampah yang tersisa dengan alasan sederhana seperti itu.
Ross Patterson

Jawaban:

39

Alasannya sederhana: Pada saat browser grafis pertama, NCSA Mosiac dan kemudian Netscape Navigator, hampir semua HTML ditulis dengan tangan. Para pembuat browser (Netscape dibangun oleh orang-orang ex-Mosaic) dengan cepat mengakui bahwa menolak untuk membuat HTML yang salah akan ditahan terhadap mereka oleh pengguna, dan voila!

Ross Patterson
sumber
7
+1 ya, begitulah semuanya dimulai, di vi atau notepad. Dengan sebagian besar halaman disalin dari kode contoh yang buruk, itu tidak pernah menjadi lebih baik. Ditambah WWW yang booming, jadi siapa pun yang bisa mengetik menjadi pengembang web dan itu semua tentang melakukannya dengan cepat.
jqa
1
Rupanya, jawaban ini sehubungan dengan komentar @ Jukka memberikan penjelasan sebaik mungkin
Shubham
35

Karena membuat tebakan terbaik adalah hal yang benar untuk dilakukan, dari sudut pandang pembuat browser. Pertimbangkan situasinya: idealnya, HTML yang Anda terima sepenuhnya benar dan spesifik. Itu keren. Tetapi bagian yang menarik adalah apa yang terjadi ketika HTML tidak benar; karena kita berurusan dengan input dari sumber yang tidak memiliki pengaruh, sungguh, kita harus siap untuk ini. Sekarang ketika itu terjadi, apa yang bisa kita lakukan? Kami memiliki dua opsi: a) gagal, dan b) melakukan upaya terbaik untuk pulih dari kesalahan. Jika kami gagal, pengguna tidak memiliki apa-apa selain pesan kesalahan yang tidak berguna, dan tidak ada yang dapat mereka lakukan, karena mereka tidak mengontrol server. Jika kami melakukan upaya terbaik, pengguna memiliki setidaknya apa yang dapat kami buat dari halaman tersebut, dan seringkali tebakannya sebagian besar benar.

Satu-satunya masalah sebenarnya dengan ini adalah ketika Anda memerlukan pesan kesalahan, yang biasanya dalam situasi pengembangan - Anda ingin memastikan HTML yang Anda hasilkan benar, dan karena "berfungsi di browser X" tidak sama dengan "benar", kami tidak bisa hanya menjalankannya melalui browser dan melihat apakah itu berfungsi: kami tidak dapat membedakan antara HTML yang benar dan HTML yang salah yang telah diperbaiki oleh browser untuk Anda. Ini adalah masalah yang bisa dipecahkan; ada plugin browser yang melaporkan pelanggaran standar, ada validator W3C, dan banyak alat serupa lainnya.

tammmer
sumber
7
Yah, saya tidak berpikir siapa pun akan menyajikan HTML yang memunculkan kesalahan. MENGAPA menurut Anda kompiler yang menganggap kode berbeda dari peramban yang menganggap HTML.
Shubham
1
Saya setuju dengan Shubham di sini - "karena kita berurusan dengan input dari sumber yang tidak memiliki pengaruh" salah, pengaruhnya tidak langsung tetapi beberapa situs web masih mendukung IE6 karena pengaruhnya.
Steve314
2
@Shubham: Kompiler berbeda karena tujuannya bukan untuk mengubah kode sumber yang dapat dibaca mesin menjadi bentuk yang dapat dicerna manusia, tetapi untuk mengubah kode sumber yang dapat dibaca manusia menjadi sesuatu yang lebih nyaman untuk komputer (kode mesin atau perantara) format). Dengan kompiler, Anda memperbaiki input dan Anda senang kode tidak membuatnya menjadi produksi. Dengan peramban, Anda mengutuk pembuat peramban atau pembuat situs web, tetapi bagaimanapun, Anda tidak bisa melihat halaman tersebut.
tdammers
2
@ Shubham: Secara umum pengguna kompiler akan memiliki kendali atas kode sumber yang dikompilasi. Itu umumnya tidak terjadi dengan halaman web.
supercat
17

Penulis HTML dan alat pembuat menghasilkan markup jelek. Peramban melakukan yang terbaik dengan alasan kompetitif: peramban yang gagal merender sebagian besar laman web dengan cara apa pun yang masuk akal akan ditolak oleh pengguna, yang tidak akan peduli dengan kesalahan siapa itu.

Ini agak berbeda dari apa yang dilakukan implementasi bahasa pemrograman. Kompiler dan penerjemah bekerja pada kode yang dapat dianggap ditulis oleh seorang programmer, sedangkan semua orang dan saudaranya dapat menulis HTML dengan pelatihan minimal, atau tanpa. Markup HTML adalah kode, dalam arti tertentu, tetapi merupakan data daripada instruksi bahasa pemrograman, dan tradisi (baik) dalam perangkat lunak adalah toleran terhadap data.

XHTML pada prinsipnya menerapkan aturan penguraian yang ketat (XML), sehingga dokumen XHTML yang disajikan dengan tipe konten XML hanya akan ditampilkan jika dokumen tersebut dibuat dengan baik dalam arti XML - jika tidak, hanya kesalahan pertama yang dikomunikasikan kepada pengguna. Ini tidak pernah menjadi populer di web authoring - hampir semua "XHTML" sekitar berfungsi sebagai teks / html dan diproses sebagai sup tag tradisional dengan cara yang sangat liberal, hanya dengan beberapa keanehan baru.

Jukka K. Korpela
sumber
15
HTML authors and authoring tools produce crappy markup.- mereka melakukannya karena browser menerimanya. Jika sejak awal peramban tidak menerimanya - maka alat & penulis ini tidak akan bisa lolos dengan memproduksi markup jelek
user93353
3
@ GrandmasterB - Saya pikir Anda kehilangan intinya - Bahkan di mana hanya ada satu browser di pasar - itu tidak melakukan penguraian yang ketat.
user93353
3
Catatan lucu: Anda mengatakan bahwa jika browser tidak dapat mengurai situs yang tidak valid, itu akan kehilangan pangsa pasar. Tapi lihat saja yaitu: betapapun buruknya, itu tidak kehilangan pangsa pasar. Itu hanya memaksa pengembang miskin untuk menulis hacks kotor menggunakan API lama ... Dan jangan mulai dengan skema versinya ...
Max
3
Pada awalnya, browser ditulis dengan tergesa-gesa untuk berurusan dengan bahasa markup yang tidak diselesaikan dan tidak memiliki spesifikasi resmi - tidak ada aturan penguraian yang ketat. (HTML 2.0, pada 1995, secara nominal berbasis SGML, tetapi sudah terlambat untuk menerapkannya.)
Jukka K. Korpela
2
IE sebenarnya telah kehilangan cukup banyak pangsa pasarnya. Tapi ini mungkin hanya ada sedikit hubungannya dengan penguraian yang ketat. IE, dengan keanehannya, memerintah web cukup lama untuk memaksa browser lain sebagian besar meniru keanehannya, karena begitu banyak halaman akan berantakan.
Jukka K. Korpela
9

Pendeknya adalah bahwa HTML didasarkan pada bahasa markup non-hyperlink lainnya yang disebut SGML yang sering digunakan untuk dokumentasi dan manual dan sejenisnya.

Dari sebuah artikel tentang sejarah HTML:

Tim telah menyebutkan bahwa beberapa dokumen HTML awal didasarkan pada bahasa SGML lama yang sudah digunakan CERN: - Kami telah memasukkan dalam HTML beberapa tag dari tagset SGML yang digunakan di dan pernah didukung di CERN [...] Pengurai HTML akan mengabaikan tag yang tidak dimengerti, dan akan mengabaikan atribut yang tidak mengerti tag CERN-SGML .

[...] sebagian besar tag HTML awal sebenarnya diambil dari bahasa CERN SGMLGuid, yang itu sendiri adalah varian dari AAP (bahasa SGML awal). Sebagai contoh, judul, hn, p, ol dan sebagainya semuanya tampaknya diambil dari bahasa ini. Satu-satunya perubahan radikal adalah penambahan tautan anchor () penting, yang tanpanya WWW tidak akan lepas landas.

Mencatat bagian yang saya cetak tebal, pada dasarnya, mereka menerapkan subset dari tag yang tersedia di sistem SGML yang mereka kenal, menambahkan tag anchor <a> baru, dan memilih untuk mengabaikan salah satu dari banyak tag yang mereka tidak lakukan. t peduli atau ingin mendukung karena alasan apa pun (seperti tag untuk daftar pustaka, xmp untuk tag "contoh", "kotak" untuk menggambar kotak di sekitar blok teks, dll). Jadi cara paling sederhana untuk melakukannya adalah dengan memaafkan markup yang tidak diketahui oleh parser dan mengabaikan markup yang tidak diketahui sebaik mungkin, terlepas dari apakah penyebabnya adalah pengguna mengetikkan markup buruk, atau cara termudah tercepat untuk mengubah dokumen yang ada menjadi format HTML baru ini adalah untuk menambahkan beberapa hyperlink ke dokumen SGML yang ada, dan mengabaikan tag apa pun yang tidak didukung atau diterapkan.

Jessica Brown
sumber
Sintaks HTML memang berdasarkan pada SGML Reference Concrete Syntax untuk bentuk markupnya. Tetapi SGML sendiri tidak memiliki elemen untuk menandai dokumen yang dapat dipinjam HTML, Kumpulan elemen HTML sebenarnya menyerupai bahasa markup dokumen GML IBM , yang ditransliterasikan ke dalam SGML RCS.
Ross Patterson
5

Ini sebagian sisa bersejarah dari perang browser

IE dan netscape berlomba untuk mengambil alih pasar dan terus merilis fitur-fitur baru yang terus menjadi semakin "luar biasa", dan dipaksa untuk menerima halaman yang dirancang untuk browser lain.

Ini berarti bahwa browser menerima dan mengabaikan tag yang tidak dikenal secara diam-diam, setelah komite mulai terlibat ... yah Anda memiliki sebuah komite yang merancang hal - hal dan sebagai hasilnya banyak versi yang berbeda (dengan beberapa spesifikasi yang ditulis secara ambigu) di mana browser ingin mendukung sebagian besar mereka, dan membuat parser terpisah untuk setiap versi akan menjadi sangat besar. Jadi (relatif) lebih mudah menggunakan pengurai tunggal dengan mode yang berbeda.

Untuk bagian lain, netscape dan IE ingin agar html dapat diakses oleh orang awam (seperti halnya tren saat itu) yang berarti mencoba melakukan apa yang ingin dilakukan pengguna alih-alih apa yang dia katakan harus dilakukan dan tersandung setiap tag yang menggantung.

Yang memperburuk masalah adalah bahwa ada juga beberapa situs "tutorial" yang mengajarkan hal yang salah dan berpikir mereka benar karena apa yang mereka ajarkan berhasil.

Pada akhirnya ini berarti bahwa jika Anda sekarang membuat browser dengan penguraian html ketat hanya 99% dari situs di luar sana tidak akan berfungsi.

ratchet freak
sumber
6
Bahkan sebelum IE masuk ke pasar, Netscape tidak pernah melakukan parsing ketat. Saya ingat Netscape dari awal 1997.
user93353
Bahkan jika ada standar yang jelas, akan sulit bagi browser untuk membedakan antara tag yang didefinisikan secara sah setelah browser dirilis, versus tag yang tidak pernah dan tidak akan pernah sah. Jika "opsional" tag yang meningkatkan dokumen tetapi tidak diperlukan untuk kebenaran semantik termasuk nomor versi standar yang menerapkannya, maka browser yang menerapkan versi 23 standar diam-diam dapat mengabaikan <o24wowzo>tag tetapi menolak keras pada tetapi, menolak keras pada <o23wowzo>, tetapi seperti sebuah desain akan merusak aspek "yang bisa dibaca manusia" dari HTML.
supercat
2

Yah kami mencoba membuat opsi ketat yang bagus di tahun 000-an tapi itu tidak berhasil karena orang-orang yang mengikuti "praktik terbaik" secara membabi buta, menyalahkan browser ketika markup yang salah mereka hancur berkeping-keping dalam mode ketat. Dan vendor browser tidak suka disalahkan.

Mereka mengklaim itu karena mereka ingin web lebih mudah diakses oleh non-profesional tetapi tidak ada yang berhenti menggunakan HTML 4 dalam bentuk yang paling lunak.

Yang mengatakan, Anda masih dapat melayani HTML5 sebagai XML jika Anda menginginkan tata letak gaya yang ketat. IMO itu bisa menjadi cara yang baik untuk menuai manfaat melakukan tata letak atau UI bekerja dalam mode yang lebih ketat sebelum Anda meneruskannya kepada orang lain yang mungkin atau mungkin tidak ingin itu ketat tanpa risiko nyata (kecuali mereka merobek dokumennya karena mereka benar-benar menyukai mode quirks - pada tahun 2017 (saat pengeditan ini) mereka harus ditembak. Jadi masih ada dasarnya tetapi lakukan penelitian. Sepertinya saya ingat ada beberapa peringatan yang tidak kita miliki dengan XHTML yang tidak benar-benar berdampak pada tata letak pekerjaan. Hanya saja jangan menyebarkan berita bahwa itu "satu-satunya cara untuk melakukannya dengan benar" atau twits yang setuju dengan pembicaraan semacam itu akan mendongeng ide, menyalahkan browser lagi, dan mereka akan mengambil gigi dari satu-satunya alternatif ketat yang tersisa. (2017 edit:

http://mathiasbynens.be/notes/xhtml5

Erik Reppen
sumber