Computer language: a set of characters, symbols, and syntactic rules for their combination and use.
The purpose of a computer language is to clearly convey our instructions to the computer (or compiler) so that it may perform the operations we desire. There’s no room in computer languages for ambiguity, it must always work on any computer. An assembly program should be able to run on any processor that supports the instruction set architecture, and a higher level language should run on any interpreter or compiler that’s designed for that language’s specification. Much work is put in by language developers to ensure that ambiguous parse trees can never come about, and error handling is implemented for almost every processor, compiler, and interpreter.
Someone forgot to tell this to the writers of web browsers. Start tags? End tags? Proper tag nesting? Mostly optional and harmless. Who decided that HTML rules are really HTML suggestions?
It’s amazing how many HTML syntax rules you can ignore, break, and bend, but still have your webpage display more or less properly without the user viewing it knowing any better. The result of this is a huge collection of webpages on the internet that are ignoring HTML specifications. If these pages become popular enough, browser writers will continue to try and make them render even when they’re riddled with holes and depreciated features.
Unfortunately, it’s hard to solve this given the current situation of the web. The average user doesn’t want to see obscure errors about missing tags and depreciated features, and the average web developer doesn’t do anything to test his webpages but run them on a variety of browsers and see if they work. Web developers have no reason at all to learn about new features and proper style/syntax when their old pages will continue to work just fine in the state they’re already in.
Even worse than that, perfectly valid HTML will render differently on different browsers. Oh the fun of web development…