AT&Tの研究所で開発されているgraphvizというオープンソースのソフトウェアがあります。これは、テキストファイルであるdotという形式のソースを入力すると、(グラフ理論の)グラフを作成し、各種形式で出力してくれるというものです。出力形式は大変多くの種類から選択することができ、GIF、JPEGやPNGなどの画像形式の他、PostScriptやSVGなどのベクタ形式、GDやDiaなどいくつかのソフトウェア固有の形式でも出力することができます。
といってもどのようなものだか全くピンとこないと思いますが、サンプルを見れば一目瞭然でしょう。たとえば、入力として、
digraph finite_state_machine {
rankdir=LR;
size=”8,5″
node [shape = doublecircle]; LR_0 LR_3 LR_4 LR_8;
node [shape = circle];
LR_0 -> LR_2 [ label = “SS(B)” ];
LR_0 -> LR_1 [ label = “SS(S)” ];
LR_1 -> LR_3 [ label = “S($end)” ];
LR_2 -> LR_6 [ label = “SS(b)” ];
LR_2 -> LR_5 [ label = “SS(a)” ];
LR_2 -> LR_4 [ label = “S(A)” ];
LR_5 -> LR_7 [ label = “S(b)” ];
LR_5 -> LR_5 [ label = “S(a)” ];
LR_6 -> LR_6 [ label = “S(b)” ];
LR_6 -> LR_5 [ label = “S(a)” ];
LR_7 -> LR_8 [ label = “S(b)” ];
LR_7 -> LR_5 [ label = “S(a)” ];
LR_8 -> LR_6 [ label = “S(b)” ];
LR_8 -> LR_5 [ label = “S(a)” ];
}
というファイルを与えると、下のようなグラフがファイルとして出力されます(ここでは縮小しています)。

入力を簡単なテキスト形式で与えるとそれを解析して、適当にノードを配置して線で結んでくれるのです。このdotファイルは人が作ってもいいのですが、何らかのソフトウェアにより自動的に生成するようにすると非常に便利に使うことができます。たとえばソフトウェアのドキュメントを作成するツールであるDoxygenではクラスの継承図を生成するためにgraphvizを使用しています。
私もこれにヒントを得て、Cのプログラムのコールグラフを生成する簡単なツールをPerlで作ってみましたが、いい加減に作った割にはなかなか見栄えのいいものができてしまい、思いの外使えてしまいそうで驚きました。構文解析がなんちゃってなのでおかしなところもありますが、ちょっと確認するために自分が使うには十分なものが、100行にも満たないPerlスクリプトで実現できてしまいました。
…と喜んでいたのも束の間、このツールは~/binというディレクトリに置いていたのですが、ヒストリにrm -fr *などと入っていたのをホームディレクトリにいるのにうっかり勢いで実行してしまい、あわてて止めたのも後の祭り、d*あたりまで消えてしまっていました…ちょっと前のバージョンが別PCに残っていたので何とか完全消滅は避けられましたが、わずか数十行のツールでも私の記憶力ではそんなに覚えていられるものではないので、最近一体何を改良したのだったかさっぱり思い出せません。まあ、大したことではなかったはずなので、直したときと同じ場面に出会えば思い出すでしょうが。それよりも他にどんなファイルが消えてしまったのかさっぱり思い出せないのが恐ろしく、脂汗を流してしまったのですが…
それはともかく、このgraphvizはアイデア次第で様々な用途に使えそうなすばらしいツールです。何でもマウスで操作させたがるWindowsなどの文化とは全く異なるいかにもUnixらしいソフトウェアですが、やはり敷居は高くて誰にでも使えるようなものではないのでしょうね。まあ、これに適当なユーザインタフェースを被せてしまえばいいのでしょうが。
