公開技術情報

[English] [Japanese]

C言語/C++ コードを解析してインタラクティブなモジュール構成図っぽいグラフ表示 by lctags

lctags で解析した C言語/C++ コードの情報を基に、 インタラクティブなモジュール構成っぽい図を表示できるように対応しました。

モジュール構成っぽい図とは

「モジュール構成っぽい図」の説明の前に、 まずはモジュール構成図について簡単に説明します。

ここで言うモジュール構成図とは、モジュール間の関連を示すソフトウェア構成図を指します。 ULM のコンポーネント図のようなものというと、伝わるでしょうか?

じゃぁ「モジュール構成っぽい図」ってなんやねん?というと、 モジュール構成図のように、「モジュール間の関連が分かる図」ということです。

あくまで「モジュール構成っぽい図」であって、モジュール構成図ではないです。

まぁ、そもそもモジュール構成図って ULM のコンポーネント図のような明確な定義がないので、 「モジュール構成っぽい図」の「っぽい」も何もないんだけど 「モジュール構成図」と書いてしまうと 「想像してたものと違う」とかクレームが付く可能性もあるんで、 「っぽい」を付けています。 要は「ナポリ風ピザ」みたいなモノです。

以降では「モジュール構成っぽい図」と書くのは面倒なので、「モジュール構成図」と書きます。

サンプル

文書で色々説明するよりサンプルを見てもらった方が理解が早いと思うので、 次にサンプル画像を載せます。

https://raw.githubusercontent.com/ifritJP/lctags/master/doc/module.graph.curl.png

これは、 curl コマンドの cookie.c のモジュール構成図です。

パッと見、コールグラフと同じですが、これが lctags が生成するモジュール構成図です。

この図の見方は、次の通りです。

  • 左端のノードが注目しているモジュールを示します。
  • そのノードに繋がっているノードは全て関連情報を示しています。

    • 各ノードはディレクトリ、ファイル、シンボルのいずれかを示します。
  • このサンプルの場合、cookie.c で定義する関数やシンボルを url.c, transfer.c, http.c, easy.c, share.c, getinfo.c で参照していることを示します。

関数単位のコールグラフと違い、 ファイル単位にすることで、モジュール間の依存関係が分かり易くなります。

なお、上部にある「refSym」を「reqSym」に切り替えると、 cookie.c が参照するシンボルの依存関係を表示します。

なお、 lctags で表示可能なモジュール構成図は、 ファイル単位とディレクトリ単位の 2 つです。

ファイル単位では上記のサンプルのように、 あるファイルが定義する(あるいは参照する)シンボルのモジュール間の依存関係を表示します。

一方ディレクトリ単位では、 あるディレクトリ以降で定義する(あるいは参照する)シンボルのモジュール間の 依存関係を表示します。

ある程度の規模のソフトウェアを開発する場合、 関連する機能ごとにディレクトリを作成し、 それぞれのディレクトリ以下にソースを配置していくと思います。 そのような場合、ファイル単位ではなくディレクトリ単位のモジュール構成図を見ると、 意味のある図になると思います。

使い方

以降では、モジュール構成図の使い方について説明します。

表示方法

コールグラフのディレクトリ一覧を表示している画面に、 module graph ボタンをディレクトリごとに追加しています。 このボタンを押すことで、ディレクトリ単位でのモジュール構成図を表示します。

ファイル単位のモジュール構成図は、 ディレクトリボタンを押してファイルリストを表示し、 ディレクトリと同じように表示される module graph ボタンを押すと、 ファイル単位のモジュール構成図を表示します。

操作方法

モジュール構成図の操作方法は、 基本的にコールグラフと同じですが、次の点に注意してください。

  • モジュール構成図は最初のノード展開時に、所定モジュール間の全ての参照情報を取得します。

    • これにより、最初のノード展開に時間が掛ります。
    • ファイル単位のモジュール構成図の場合は、気にならないレベルだと思います。
    • ディレクトリ単位のモジュール構成図の場合は、ディレクトリ内のファイル数に依存して処理時間が掛ります。

      • 情報取得中は、モジュールグラフの上部にプログレスバーを表示します。
  • ディレクトリ単位のモジュール構成図の場合は、ディレクトリ内の依存関係は表示しません。
  • ディレクトリ単位のモジュール構成図は、所定のディレクトリ以下のサブディレクトリを含む全てのファイルを対象にします。
  • モジュール構成図では、シンボル参照と関数コールを区別しません。

関連

lctags のコールグラフ表示については、次を参照してください。

  • C/C++ コードを解析してインタラクティブなコールグラフ表示 by lctags

../callgraph

lctags 全般の紹介は次を参照してください。

  • C/C++ ソースコードタグシステム lctags の紹介

../