DOCTYPE はなぜあるのか

DOCTYPE 宣言はなぜ作られたのですかという質問がありました。 HTML 文書の先頭には必ず DOCTYPE がなければならないとされています。しかし確かに DOCTYPE は一見何の役割も果たしておらず、無駄な行にしか見えません。なぜそんな DOCTYPE が作られ、今も必要とされているのかを理解するためには、少し昔の話をする必要があります。

<!DOCTYPE html>
<html lang=ja>
<title>ほげほげ</title>
<p>ふがふがふがふが

DOCTYPE は HTML 文書の先頭に必ず書かなければならないとされています。でもあってもなくても変わらなそうに見えます。

SGML になりたかった 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

仕様書の定義上は 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>」と奇癖モードにならない最短の形に縮められ、かろうじて誰でも覚えられる長さになったのが、せめてもの救いでしょう。