DOCTYPE
はなぜあるのかDOCTYPE
宣言はなぜ作られたのですかという質問がありました。 HTML 文書の先頭には必ず DOCTYPE
がなければならないとされています。しかし確かに DOCTYPE
は一見何の役割も果たしておらず、無駄な行にしか見えません。なぜそんな DOCTYPE
が作られ、今も必要とされているのかを理解するためには、少し昔の話をする必要があります。
<!DOCTYPE html>
<html lang=ja>
<title>ほげほげ</title>
<p>ふがふがふがふが
DOCTYPE
は HTML 文書の先頭に必ず書かなければならないとされています。でもあってもなくても変わらなそうに見えます。
HTML は元々 SGML と呼ばれるマーク付け言語を参考に作られました。正確には SGML はマーク付け言語ではなく、マーク付け言語を定義するための枠組み、メタマーク付け言語とでも言うべきもので、どのような要素や属性、タグや実体参照を組み合わせてマーク付け言語を構成するかを SGML の規定に従って記述することになっていました。これが文書型定義 (DTD) であり、 DTD を宣言・参照するのが DOCTYPE
宣言だったのです。ですから、 SGML 文書の解釈 (タグや実体参照などの処理) のために DOCTYPE
宣言の情報がなくてはならず、必然的に DOCTYPE
宣言は必須となっていました。 なお、 SGML の改訂版である Web SGML では、タグの省略をしないなどの条件が満たされると DOCTYPE
宣言を省略できることになっています。
原初の HTML は SGML を参考にしつつも厳密には従っておらず、 DOCTYPE
も最初は存在していませんでした。初期の Web ブラウザーは DOCTYPE
宣言を (正しくない) コメントとみなすなどしていました。ところが当時 (1990年代) HTML の仕様策定に関わっていた人達は、 HTML は SGML に従うべきだと考えていました。そのため HTML2 ~ HTML4 では DOCTYPE
宣言は必須でした。こうした流れの中で、ブラウザやオーサリングツール、あるいはチュートリアルの類も徐々に DOCTYPE
宣言への対応が進み、 HTML に DOCTYPE
宣言を含めるのは当然のことと考えられるようになっていったのです。 XML ベースのマーク付け言語である XHTML もこの流れの延長線上にあり、技術的には DOCTYPE
宣言を省略することが可能だったにも関わらず、省略してはならないことになっていました。
つまり、 HTML に DOCTYPE
宣言が取り入れられたのは HTML を SGML ベースにするためであり、 SGML に DOCTYPE
宣言があったのは、それをもとにタグなどを解釈するためです。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html version="-//W3C//DTD XHTML 1.1//EN"
xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3.org/1999/xhtml
http://www.w3.org/MarkUp/SCHEMA/xhtml11.xsd">
<head>
<title>ほげほげ</title>
</head>
<body>
<p>ふがふがふがふが</p>
</body>
</html>
HTML の SGML 化の行き着いた先がこれ、 XHTML 1.1 (第2版) の厳密適合文書。 DOCTYPE
以外にもいろいろ書くことが増えて、もはや覚えるのは無理だろう。
(なお XML 宣言、 version
属性、 schemaLocation
属性は実際には省略可能。)
仕様書の定義上は SGML であることになっていた HTML でしたが、実際にはそうではありませんでした。現実に存在する HTML 文書の多くは SGML として解釈できないものであり、 Web ブラウザーを SGML ベースで実装するという選択肢はあり得ませんでした。付け加えると、 XHTML 文書であると思われている文書のほとんども、現実には XHTML ではなく HTML として解釈されるものでした。 この“裸の王様”規定は、2005年になってようやく HTML5 によって否定され、現在では仕様上も HTML は SGML とは別の言語であるとされています。
ということは本来の SGML 的な意味の DOCTYPE
宣言は必要ないはずですが、にも関わらず現在に至るまで DOCTYPE
宣言は必須とされているのはなぜでしょうか。
それは2000年頃、当時から見て古い Web ブラウザーによる HTML/CSS の解釈と、仕様上正しいとされる HTML/CSS の解釈にずれが生じており、「DOCTYPE
スイッチ」によって古い Web ページと新しい Web ページを区別することにした名残りです。 HTML5 以前の DOCTYPE
宣言には HTML の版番号が記述されているため、それによってどの時期の HTML 文書であるかを推測し、古い解釈 (奇癖モード)、中間の解釈 (限定奇癖モード)、新しい解釈 (無奇癖モード) に分けることとしたのです。 この規則のために DOCTYPE
が無いと奇癖モードになってしまうので、それを防ぐために DOCTYPE
宣言は必ず書かなければならないことになっています。 今では DOCTYPE
スイッチも失敗だったと考えられていますが、後方互換性のために廃止することもできません。2000年当時は奇癖モードは仕様違反でしたが、現在では奇癖モードの挙動も仕様化されています。 (奇癖モードと無奇癖モードの違いは色々ありますが、無奇癖モードの方がより SGML に近い構文解析を行おうとしていました。)
つまり、今でも DOCTYPE
が必須なのは、奇癖モードではなく無奇癖モードを選択するためです。
こうして見てきたように、 DOCTYPE
は HTML が SGML になろうとして、なり切れずに残ってしまった遺産、技術的負債だったのです。一時はとても覚えきれず、コピペするしかないほど長い文字列を書くことが強制されていたこともありましたが、 HTML5 以後「<!DOCTYPE html>
」と奇癖モードにならない最短の形に縮められ、かろうじて誰でも覚えられる長さになったのが、せめてもの救いでしょう。