2009-07-19

DOMはそんなに難しいだろうか

本の虫: Webの将来の発展のために コメント

確かに javascript は良くできてますが、dojo や jQuery、YUI 等の実装を見ると、泣けてくるものがあります。 効率を上げるために、変数名を短くしたり、include の代わりに、XHR でスクリプトを読んできたり、 クラスを実現するためにプロトタイプを文字列としてコピーしたり…。

変数名を短くしたりするのは、単にネットワーク越しにjavascriptのコードを送るという特性上にすぎない。ブロードバンドがだいぶ普及したとはいえ、ファイルサイズは小さい方がダウンロードも早い。そういうコードの圧縮は、専用のソフトウェアがいくつもあるので、人力でやる必要はない。

機能が貧弱なのは、Javascriptによく言われることだ。ただ、私個人としては、Javascriptは、簡潔で美しい言語だと思う。他の言語に比べれば、所謂special formが驚くほど少ない。そりゃLispには負けるかもしれないが、勝ってもあまり嬉しくはない。

もっとも、それらライブラリが便利になったおかげで、今やDOM Level 2 を直接叩くなどといった面倒なことは誰もやらなくなり、 これらはクロスブラウザを謳っているのでIEだろうと、Webkitだろうと、だいたい似たような感じで利用できます。 これらがある限り、IEでDOM2が直接扱えなくても、あまり困ることはありません。

果たして、DOMを直接扱うのは、そんなに面倒な事なのだろうか。Web黎明期ならともかく、今はブラウザベンダーにも規格準拠の意識がある。実際、IEを除けば、主要ブラウザ間で同じように動く、DOMを使ったJavascriptのコードを書くのは、それほど難しいことではない。

Javascriptのライブラリは数あるが、ここ最近で特に注目されているのは、CSSのセレクターと同じ構文を使って、要素を絞り込める機能だろう。似たような機能を提供する者に、XPathがある。ところが、XPathは、HTMLやXHTMLに適用するには、ややオーバースペックすぎる。だから流行らなかった。皆、もっと簡単に要素を絞り込む方法が欲しかった。そこで、CSSのセレクターの文法を、Javascript上で実装するライブラリが現れた。これは最近、querySelectorとして、DOMにもドラフト化され、主要なブラウザでサポートされている。もし、本当にXPathを望んでいるのなら、Javascript上でXPathを自前実装するのも可能なのである。そんな実装がないのは、XPathに需要がないからだろう。

webは実に先進的である。常に実装が先行し、然る後に規格が後を追う。これは互換性の面から見て最悪だが、現実の例をみるに、最も速やかな発展方法だと思う。これを無視して規格を先行させたXHTML2やCSS3は、あまり成功していない。CSS3については異論もあるかも知れないが、少なくとも、CSS3のドラフトは、一部を除いて、あまり積極的に実装されているとは思えない。

現行のC++0xなんぞは、この点からみて最悪である。実装が全く存在しないのに机上で規格を語っている。だからこそ、Conceptは無意味に膨らみすぎて、お流れになった。また、実験的な実装をもってして、規格を決めたりしている。例えば、min()/max()をVariadic Templateではなく、Initilizar Listで実装するのは、ちょっとどうかと思う。絶対混乱する。

3 comments:

Anonymous said...

selectors API は IE8 で実装済みですよ?実装の準拠度でいえば、IE8もそれ以外も完全な実装はされていなかったように思います。

まぁ、それはそれとして、Firefox にしろ、IEにしろ、利用する人が増えてくれば増えてくるほど、「今まで動いていたコードをどのように保証するか」という問題が出てきます。
先行実装した内容が、規格化された内容と異なっていた場合、その実装の利用者が多いほど、規格と違う部分があったとしても、多くの場合そのまま放置されます。
最近では Opera が規格通りの実装をやめて、別の実装にした件もありました。また、IE8では ECMA の規格に則ったプロパティを実装していますが、Firefoxでは先行実装の Getter/Setter しかありません。一度実装したものは、なかなか捨てたり、変更したりはできないのです。プログラマはコードの変更をいやがりますし。
結局は規格より利用者の数がものをいう世界です。利用者が増えれば、安易なバージョンアップはできなくなり、結果実装に微妙な差異が残ることになります。(Opera と Firefox 、Webkit でのBoxモデルみたいな)であれば、最初から良くできたラッパーを使った方が、よほど楽だし、安全というものです。

Anonymous said...

>現行のC++0xなんぞは、この点からみて最悪である。実装が全く存在しないのに机上で規格を語っている。
あら?hitoさんはこの手の方向が好みだと勝手に思っていたのですが違うんですね.

江添亮 said...

>selectors API は IE8 で実装済みですよ?
ありゃ、本当だ。失礼。

>この手の方向が好み
C++0xのすべてに諸手を挙げて賛同しているわけではありません。