okayurisotto.net

私が好きでやったことが他の人のためにもなったらお得かも!

軽量マークアップ言語とは、そもそも文書とはなんなのか

公開日:

はじめに

コンピュータ上で文書を書き、コンピュータ上で文書を読む現代、文書構造を示すときにはマークアップ言語を使う。マークアップ言語としてはいくつかの種類があり、その中には、HTMLのように複雑で多機能になったもの、Markdownのように軽量なもの、Djotのように軽量さと拡張性を兼ね備えたものなどがある。しかしそもそもの文書というものについて考えたとき、多様で複雑なすべての用途をカバーするマークアップ言語は、軽量にはなり得ないのではないかと感じてしまった。以下はぐるぐると回る思考を書き連ねたものである。

コンピュータの登場と抽象化された文書の構造

構造化された文書を書きたいとき、コンピュータのない時代であれば紙の上に組版を工夫して書いていただろう。見出しは大きな文字で、本文は小さな文字で。図表とその説明文は余白の取り方を工夫して、説明文が説明文であるとわかるように。

情報技術が発達し、誰もがコンピュータを使えるようになった現代では、文書はコンピュータ上で作成し、管理し、閲覧までするのが一般的だ。とはいえコンピュータ上で文書を書くときにも、考えなければならないことはそれまでと変わらない。どれが見出しでどれが本文なのかはきちんと区別できるようにしなければならないし、図表とその説明文は関連していることがわかるように配置する必要がある。

しかし、考えなければならないことは変わらずとも、その実現方法は実に大きく変容した。ソフトウェアの柔軟性を活かし、文書の構造化では様々な抽象化が行われるようになった。それまで文字の大小や余白の取り方によって定義されていた構造は、テキストの属性として明確に示されるようになった。そしてその属性に基づいて、文字の大小や余白の取り方を決めるようになった。テキストに直接スタイルが適用されるのではない。テキストとスタイルの間には、HTMLで言うところのタグ名やクラス名といった層がある。

マークアップ言語とその軽量化

ここで注意したいのが、テキストの属性の示し方にも柔軟性があり、様々な手法が取られるということだ。マニュアル文書の構造化のためのSGMLというマークアップ言語では、テキストはその前後に特殊な文字列(タグ)を配置して挟み込むことによって属性を示す。SGMLを元に作られたハイパーテキスト用のマークアップ言語であるHTMLでも同様だ。しかし、TeXやそれを元にしたLaTeXなどでは、挟み込むというより、命令文を適宜挿入する形を取る。そしてMarkdownでは、簡単な組版のように、テキストに対し記号で装飾することによって属性を示す。

SGMLやHTML、TeXやLaTeXのような、構造化の自由度が高く、同時に構造化が大変な言語に対し、Markdownのような、自由度は低く表現力は乏しいものの簡単に扱える言語は、軽量マークアップ言語と呼ばれる。Markdownは、その軽量さと得られる文書の読みやすさのバランスが良いため、ブログの執筆などの分野で根強く使われている。

Markdownの過ちと軽量化の難しさ

しかしそのバランスとは、保つのが難しいものだ。実はMarkdownには多くの方言があり、実装によってどういった構文が使えるかまちまちであるため、相互運用性に難がある。それゆえCommonMarkと呼ばれる、包括的で統一的な言語仕様を定めたものがあとから現れた。しかしそもそもなぜ方言が作られるに至ったのか。オリジナルのMarkdownは表現力が乏しく、拡張性のある言語仕様でもなかったからだ。

表現力を高めようとすると、必然的に、後々のことを考えた拡張性のある融通の効く仕様を設けておく必要が出てくる。現時点では十分な表現力だと思われていても、後から振り返ったときに問題が起きないとは考えにくいためだ。しかしこれは冗長さに繋がりかねず、軽量さを失うことになりかねない。

ではそもそもの軽量マークアップ言語とはよくないコンセプトなのだろうか。何かに特化した言語ならともかく、広く使われることを念頭に置いた言語は、冗長ともとれる拡張性を持たなければならないのか。冗長ではない拡張性の持たせ方、軽量ながらも拡張性のある仕様は本当にないのか。

Djotは救世主となるか

Markdownにあったいくつかの問題点を解消する、後発の軽量マークアップ言語としてDjotがある。Djotが解消する問題点としては、構文解析のしづらさ、表現力の乏しさ、拡張性のなさの3点が挙げられるだろう。ここでは表現力と拡張性に焦点を当てようと思う。

Djotの表現力は高い。CommonMarkとして定義されたMarkdownの仕様のほとんどを継承しつつ、新たにいくつかの構文を追加している。その中には、Markdownでは方言として実現されていた脚注や定義リストがある。

Djotは拡張性も高い。要素に対して任意の属性を持たせる軽量かつ省略可能な構文が定義されており、これを使えば、これまでは方言として追加せざるを得なかったものが、仕様の範囲内で行えるようになる。また、これだけでなくDjotは究極的な解決策として、RAW要素という構文も持っている。RAW要素はその文書が解析されるときに、どのように解析されるかをユーザが定義できる、プラグイン機構のようなものだ。拡張性についてはすでに申し分ないと言えるだろう。

しかし、私が最初にDjotを見たとき、「Markdown的だ」と思うのと同じくらい、「HTML的だ」とも感じていた。HTMLでは可能だった、Markdownにはできない表現が、Djotではできるようになっていた。では、HTMLを使わずDjotを使う理由とは、フル機能なマークアップ言語を使わず軽量マークアップ言語に拡張性を持たせる理由とは、なんだろうか。HTMLも、使おうとするタグを意図的に制限し、表現力を削ぎ落としていけば、Djotのように軽量に使うことは不可能ではない。高度な機能が必要になったときにも、スムーズにHTMLの多機能さを享受できる。私たちが求めてやまない軽量さとはそもそもなんなのか。

文書はどこへ向かうのか

マニュアルを書くための言語だったSGMLから、ハイパーテキストを書くHTMLが生まれ、現代ではHTMLはもはやUI構築言語のような、とてもリッチで複雑なものになった。一方でMarkdownのような軽量な言語にも根強い人気があり、用途によって使い分けられている。しかしそのMarkdownも、表現力を補うためにいくつもの方言が作られることになり、Djotのような表現力と拡張性の高い言語が新たに作られるに至った。Djotはとてもよいものだ。しかし実際どのように使われるかはまだわからない。もしかすると数年後には、RAW要素が多用されるような形に落ち着くかもしれない。(もしくはそもそも市民権を得ずに廃れてしまうかもしれない。)

当初は読むだけだった文書に、ハイパーリンクという操作可能な構造が追加され、その後UIが構築され、Webアプリなどが登場した。読むだけなのか、便利に読むのか、はたまた使うのか。このような基準に照らしたとき、「その文書」はどうあるべきなのだろう。文書とは多様で複雑だ。すべての用途をカバーしようとすると、拡張性に富んだ構文と豊富な語彙が必要になり、それはもはや軽量ではないと私は考える。