メーリングリストで Velocity と WebMacro の違いを説明して欲しいと言われることがよくあります。
何度も同じ問題に答える代わりに、アプローチの違いの一部を説明するためにこの文書を用意しました。
実はどちらも優れたツールなので、どちらを使うか決めるのは、
ユーザの皆さん次第だと思っています。
言語構文はかなり似ていますが厳密には同じではありません。
構文を似たようなものにしたのは以下の理由からです。
1) リファレンスで $<foo>を使い、指示子で #<bar> を使うという、
構文に関するアプローチは優れています。デザイナが使いやすく、
誰でも理解できますし、新しい構文をわざわざ作り直す理由もありませんでした。
2) 多くの人々がこの構文を使っているのに、なぜ新しい構文を考え出す必要があるでしょう?
それに WebMacro から Velocity への変換が簡単にできます :)
そのためのツールもあります。
Velocity は、新たに一から構築されました。[WebMacroと] 共有するコードはありません。
このようにした本来の理由は、WebMacro が BSD/ASF ライセンスと互換性を持たないライセンス
(GPL) でリリースされており、我々 (オリジナルの作者) には GPL
ライセンスでないソリューションが必要だったからです。
その後、WebMacro は GPL/ASF の両方のライセンスでリリースされましたが手遅れでした。
プロジェクトはすでに軌道に乗っていましたし、
自分でコードを書くよりも[JavaCCで]生成されたパーサを使う方が、
技術的な解決策としては適切だと思ったからです。
新規に開発したので、
WebMacro が後方互換の問題のせいで扱わざるをえない厄介な問題に、
我々はあまり関わずに済んでいます。
我々は、WebMacro に紛れ込んだいくつかのテンプレート言語としての不整合を修正しました。
その中には、コードブロックで { } をサポートしないこと (Velocity では不要です)や、
# 指示子 の右側で丸括弧を使用することなどがあります。例をあげましょう。
 |
 |
 |
 |
#set ($bar = "foo")
#if ($bar.length() > 0)
stuff here
#end
|
 |
 |
 |
 |
アーキテクチャ的には、最近までの大きな違いはパーサでした。
Velocity パーサは、javaCC(非常に人気がある Java ベースのパーサ/ジェネレータ)
というツールを使用して書かれます。
それは、元々は Metamata が Sun のために開発したもので、
保守や管理も Metamata が行っています。
[訳注:上記のサイトは現在存在していません。保守・管理に関しては、現在ではjava.net 内のコミュニティが行っています。]
WebMacro パーサは最近まで手で書かれていたため、(それによる多くのバグのせいで)
WebMacro を使う際には多くの苦労がありました。0.95 のリリースの新しいパーサは、
javaCCを使って書かれておりきっと改善されたことでしょう
(とはいえ、多くの過去の遺物へのサポートは残っています) 。
Velocityのアーキテクチャは極めて単純で、テンプレートエンジン以外の何物でもありません。
その考え方は、ひとつのことだけをちゃんと行うということです。
そうした考え方は Unix の思想に多く見られます -- つまり単純なツールを適切に集めて、
それを元により大きいものを作るということです。
これが、Velocity が Anakia や Texen
など様々なツールのベースとして使われるようになった理由です。
Velocity を「開発フレームワーク」にするつもりはありません --
すでにそういったものはたくさんあります。例えば
Turbine がそうです。
したがって、「コンテキストツール」や「リソースブローカ」といった
機能は全て Velocity からわざと外しています。
そういったことはフレームワークが行うでしょうし、
その方がとにかく適切だと認識しているからです。
さらに、アプリケーション/ユーザ/フレームワークのレベルで行うべきことの多くを
Velocity コアから外すことによって、 Velocity コアを小さいままにしておけますし、
それによって、(あくまで我々の意見ですが)メンテナンスや拡張がしやすくなります。
内部的には Velocity はかなり単純です。ユーザ向けのスレッドは生成も管理も行いません。
テンプレートは解析され、内部では「抽象構文木」形式となるキャッシュとして保持されます。
この形式は樹状構造となっており、テンプレートがマージされた時に高速に処理できます。
個々のノードはテンプレート内の構文要素のどれか一つに対応しています。
WebMacro の内部では、処理を高速にするためにメソッドやクラスの多くは private や
final、あるいはその両方になっています。しかし、その結果、
ユーザがコア機能を容易に拡張/オーバーライドしたり、
コードの一部を再利用するのが難しくなりました。
我々は、ソフトウェアが使いやすくなるのなら、
数ミリ秒の処理速度なら犠牲にしても構わないと思っています。
機能における両者のもっとも大きな違いは「Velocimacro」です。
Velocimacro は、何でも入れられる再利用可能データの断片群と考えてよいでしょう。
#parse() ステートメント内のデータと同じように、Velocimacroは解析され、
そしてVelocimacro 内であれば任意のスコープで変数を扱うことができます。
また、Velocimacro のおかげで、コアの # 指示子は少数で整理された状態を維持できます。
言い換えれば、WebMacro は、コアに # 指示子をどんどん追加していますが、
我々はそうではありません。そうした共有可能な「特別な」機能については、
オプションのダウンロードとしてサポートしたいと思います。
この文書がお役に立てばと思います。とはいえ、Velocity を理解する一番の方法は、
それを使ってみることです。もちろん、ソースコードを見るのに勝るものはありません。