DSL
依存関係のネットワーク †
一言要約 †
タスクもしくはプロダクトについて依存関係のネットワークを作成することで、各タスク/プロダクトの前提条件を管理し、必要なときのみ実行することができるようになる。
これは、Alternative Computational Modelの一例として紹介されている。
要約 †
導入 †
- ソフトウェアのビルドを例に依存関係のネットワークについて解説。(本文中の図が分かりやすい)
- 依存関係のネットワークにより、以下の内容を保証する。
- 必要な前提条件が全て実行されていること。
- 各前提条件が1度しか実行されないこと。
How it works †
- 依存関係のネットワークには以下の2つのスタイルがある。
- タスク指向では「コード生成タスク」と「コンパイルタスク」という考え方をするのに対して、プロダクト指向では「ソースファイル」と「実行ファイル」が作られると考える。
- 実行時に要求される各タスク/プロダクトのことをターゲットと呼ぶ。システムはまず各ターゲット間の推移的な依存関係のネットワークを作成した上で、このネットワークを使いながら各タスクを呼び出していく。
- 新しい例としてタコ薬を導入(本文中の図を参照)。各プロダクトの依存関係は以下の通り。
- ヘルス・ポーション = > きれいな水、 タコのエッセンス
- タコのエッセンス = > きれいな水 、タコ
- きれいな水 = > ガラスコップ
- 図中の矢印をたどると「きれいな水」は2回登場するが、実行されるのは1回。
- 1回だけ作るという考え方は物理的なプロダクトだけでなく、情報系のプロダクトにも適応できる。その場合、実行にコストがかかるプロダクト計画を作成すると考えればよい。
- 依存関係のネットワークに関連して発生し得るエラーは以下の2種類。
- 特にプロダクト指向においては、各プロダクトが最終更新された時を示す履歴情報を持っている。前提条件のどれかが自分よりも後にビルドされていれば、自分もリビルドする。
- 前提条件のタイムスタンプと比較するという考え方について議論するため、「呼び出し("invoking")」と「実行("executing")」とを区別する。全てのタスクは呼び出されるが、実行されるのは前提条件よりも古かった場合のみ。
- タイムスタンプを使うのはプロダクト指向で、タスク指向の場合には「リクエスト中に既に実行されたかどうか」という情報を管理する。
- 永続化したタイムスタンプを使った方が容易であることから、タスク指向よりもプロダクト指向の方がお勧め。ただし、前提条件が変わらなければ結果も変わらないという条件付き。
- タスク指向とプロダクト指向を自動ビルドシステムに当てはめると、「Unixのmakeがプロダクト指向」「Javaのantがタスク指向」。プロダクト指向に関しては、各ターゲットが常に「自然な」プロダクトを生成する訳ではない点に注意が必要。
When to use it †
- 明確なインプットとアウトプットをもつ処理(ターゲット)へ分解できるようなものに良く合う。また、必要な時しか実行しないので、リソース集約的なものや実行コストが高いものにも向いている。
- デバッグのためログ出力をすべき。また、各ターゲットは粗粒度である方が望ましい。
ファウラーへのフィードバック †
担当者のつぶやき †
- タコポーションの実装例は後回しにして、説明部分の要約を一旦作成します。// 長い上にC#なので(ぉ
- 一言要約にも書いた通り、Alternative Computational Modelの一例です。前回話題になったAdaptive Modelが実行内容を制御するものであったのに対して、こちらは依存関係を制御しています。
- タコ薬よりもソフトウェアビルドの方が遥かに分かりやすいような気もしますが、これはタスク指向ではなく、プロダクト指向で考えさせたかったということなのでしょうか。
みんなの突っ込み †