C/C++ システムのアーキテクチャ管理 (295K)

C/C++ システムのアーキテクチャ管理
Whitepaper
October 2007 (Revised October 2008)
Original Version
Copyright 2007-8 Lattix, Inc. All rights reserved
Japanese Version
2009 TechMatrix Corporation
C/C++ システムのアーキテクチャ管理 - C/C++ アプリケーションのための Lattix DSM
C/C++ アプリケーションのための Lattix DSM
はじめに
Lattix 社は、さまざまな言語とシステムについて、他に先駆けて DSM の使用を進めてきました。C/C++
をサポートすることは、C/C++ という言語に特有の複雑さがあるため、特に困難です。プリプロセッサとヘッ
ダー ファイルの使用、そして C/C++ の全般的な複雑さが、アプリケーション アーキテクチャの本質を捉
えることを困難にしています。Lattix 社は迅速で非常にスケーラブルな C/C++ ソリューションを提供しま
す。
Lattix DSM についての基本事項
標準的な C/C++ プロジェクトは、ソース ファイルとインクルード ファイルから構成されます。一般的に
ソース ファイルは cpp または c というファイル タイプで示され、インクルード ファイルは hpp または h
というファイル タイプで示されます。
ソース ファイル間の依存関係の解析には、各ソース ファイル中のシンボルを見て関係を確立することが必
要です。たとえば、File1 中のあるメソッドが File2 中のあるメソッドを呼び出す場合、Lattix はメソッドの名
前を記録するほか、メソッドがどこで定義されているのか、そしてどこから呼び出されているかを記録して関
係を確立します。
ヘッダー ファイルへの依存は通常、インクルード依存関係を使って確立されます。ただし、他にもいくつか
考慮される依存関係があります。たとえばクラス (および構造体) は、しばしばヘッダー ファイルで定義さ
れ、ソース ファイルによって参照されます。また、ヘッダー ファイル中のシンボルを見てヘッダー ファイル
とソース ファイルとの関係を確立することも可能です。ただし、この関係の確立はデフォルトでオフになって
います。
マクロも解析します。展開後のマクロが依存解析対象のソース ファイルの一部と見なされます。
大規模なシステムは、何百万ものシンボルを持つことがありますが、Lattix は全てのシンボルをチェックし
ます。そして、各シンボルがどこで定義されているか、どこで参照されているかを特定します。この情報に基
づいて、さまざまな要素間の関係が確立した DSM が生成されます。デフォルトの DSM はファイル間の依存
関係を示しますが、メンバ レベルが有効な場合、ファイル中のメンバ (メソッドおよびグローバル変数) の
依存関係も示されます。
重要な注意事項:
1.
複数の実行モジュールについて 1 つの DSM を作成する場合:
1 つのシンボルについて複数の定義が存在する場合、シンボルの参照を正しい定義に結び付けるの
は不可能です。通常、リンカーは複数定義されたシンボルを防ごうとします。しかし、一緒にリンクされ
ない異なるソース ファイルが、重複する名前のメソッドあるいはグローバル データを持つことを防ぐの
は不可能です。したがって、まずビルド環境を理解し、重複シンボルを持たないファイルだけをロードす
Page 2/8
Copyright 2007-8 Lattix, Inc. All rights reserved
C/C++ システムのアーキテクチャ管理 - C/C++ アプリケーションのための Lattix DSM
ることが非常に重要です。
2.
異なるアーキテクチャを 1 つの DSM にロードしないようにする:
C/C++ プログラムが複数のハードウェア プラットフォームに対して作成されていることがあります。し
かし、異なるアーキテクチャのための異なるマシン依存ファイルが、同じメソッドとグローバル変数を持
つことがあります。この場合、重複シンボル定義が発生します。
3.
重複ヘッダー ファイルを使用しないようにする:
重複ヘッダー ファイルがある場合、ヘッダー ファイルへの依存関係が、正しいヘッダー ファイルへの
ものではないことがあります。Lattix は include ディレクティブを利用して、正しいインクルード ファイ
ルを判別します。ただし、「ビルド プロセスがコンパイル前にファイルまたはディレクトリの名前を変更し
ている」あるいは「ビルド プロセスがファイル/ディレクトリを移動している」といった理由から、include
ディレクティブの情報が不正確な場合、正しくない依存関係が表示されることがあります。
4.
マクロ定義を正しく処理する:
一部のマクロはコンパイル時引数として設定されることがあります。そのようなマクロがメソッド シグニ
チャを変更する場合、一部の依存関係が表示されなかったり、不正確な依存関係が表示されることす
らあります。Understand for C++ を使用すると、Understand データベースを生成する前にマクロを
定義することができます。Understand から udb を生成する前に、マクロを指定してください。
効果的に Lattix を使用するには、ビルド環境をよく理解している必要があります。上記の項目に従っていて
も問題が発生している場合は、Lattix 社までお問い合わせください。Lattix 社は、これまでに何百ものプロ
ジェクトを検証した経験があり、アーキテクチャの理解とリファクタに役立つ情報を抽出することに常に成功
しています。
Page 3/8
Copyright 2007-8 Lattix, Inc. All rights reserved
C/C++ システムのアーキテクチャ管理 - Lattix プロジェクトの作成: 2 段階のプロセス
Lattix プロジェクトの作成: 2 段階のプロセス
Lattix は、2 段階のプロセスによって C/C++ をサポートします。1 番目の段階では、コードをパースして
パース結果を生成します。生成されたパース結果は Lattix LDM にロードすることができます。
1 番目の段階 (3 種類のパース方法)
Lattix LDM にロードできる依存関係情報は、次の 3 種類の方法で生成することができます。本ホワイト
ペーパーは 1 つ目の方法を使用することを想定しています。
方法 1 - Understand データベースを使用する
一 般 に 広 く 使 用 さ れ て い る 商 用 プ ロ グ ラ ム で あ る Scitools 社 の Understand for C++ を 使 っ て
Understand データベースを生成します。Understand データベースは udb ファイルに格納され、このファ
イルは Lattix にロードすることができます (Understand バージョン 1.4 では udc ファイル)。この方法の
利点は、Understand for C++ によって生成された正確なデータベースを Lattix LDM に容易にロードでき
ることです。
Understand for C++ は、エラーに対処するよう最適化されたパーサーを使用しているため、データベース
は短時間で生成されます。さらに、Understand for C++ は、コンパイルできないコードでさえも適切に処理
します。本ホワイト ペーパーは Understand データベースをロードすることを想定して説明しますが、
Understand データベースを使用する以外に、次の 2 つの方法もあります。
方法 2 - Doxygen が生成したXML ファイルを使用する
Doxygen を使って C/C++ ソース コードを処理します。Doxygen はよく知られたオープン ソース プログ
ラムであり、自由にダウンロードすることができます。Doxygen は、C/C++ アプリケーションの相互参照付
きドキュメントを生成するために使用されます。通常、Doxygen は HTML ファイルを生成しますが、XML
ファイルを生成するようオプションを設定できます。生成された XML ファイルは Lattix LDM によって処
理されます。ユーザに必要な操作は、index.xml ファイルを指定して Lattix LDM で単純にプロジェクトを新
規作成することです。残りの XML ファイルは Lattix が読み込みます。
方法 3 - BSC ファイルを使用する
BSC ファイルは、Microsoft Visual Studio によって生成されるファイルであり、プロジェクトを構成するさまざ
まなファイル間の依存関係情報を持ちます。BSC ファイルを生成するには、まず Visual Studio C/C++ コ
ンパイラによってコンパイルされるファイルごとに 1 つの .sbr ファイルを生成します。そして、bscmake を
使ってすべての sbr ファイルを結合し、1 つの bsc ファイルを生成します。Lattix LDM には 1 つの BSC
ファイルをロードしなければならない点に注意してください。また、別名で同じファイルを参照することを避け
るために、一回のビルドで sbr ファイルを生成することを強く推奨します。
Page 4/8
Copyright 2007-8 Lattix, Inc. All rights reserved
C/C++ システムのアーキテクチャ管理 - Lattix プロジェクトの作成: 2 段階のプロセス
2 番目の段階 (Lattix プロジェクトの作成)
1 番目の段階で生成したファイルをロードして Lattix プロジェクトを作成します。[新規プロジェクトの作成]
ダ イ ア ロ グ ボ ッ ク ス で 適 切 な モ ジ ュ ー ル の 形 式 (C/C++(BSC) 、 C/C++(Doxygen) 、 ま た は
C/C++(Understand)) を選択し、適切なファイルをロードして Lattix プロジェクトを作成します。
オプションの設定
プロジェクトを作成する前に設定できるオプションはいくつかあります。その中には、メソッド、グローバル変
数、構造体、クラスを見ることができるようメンバ レベルを有効にするオプションや、パーティション名の中
に絶対パスを表示しないようにするオプションがあります。今のところは、デフォルト オプションを使用してく
ださい。オンラインヘルプの『Understand モジュール(C/C++)』には、利用可能なすべてのオプションについ
ての説明があります。
ソース コードへのアクセス
Understand for C++、Doxygen、BSC モジュールを使用するかどうかに関わらず、サブシステムを選択して
右クリックし、[ソースファイルの表示] を選択するだけで、サブシステムのソース コードを参照することがで
きます。
ただし、Understand for C++ を使用している場合、[依存関係の詳細] ペインで依存関係を選択して右ク
リックし、[ソースファイルの表示] を選択することによって、実際の依存関係を参照することができます。依
存関係が発生しているコード行にアクセスするには、プロジェクトを作成する前に、行番号の処理オプション
を有効にする必要があります。詳細についてはオンラインヘルプの『Understand モジュール(C/C++)』を参
照してください。
Page 5/8
Copyright 2007-8 Lattix, Inc. All rights reserved
C/C++ システムのアーキテクチャ管理 - Apache Server の解析
Apache Server の解析
我々は、初期解析のために Apache Server バージョン 2.0.55 を使用しました。Understand for C++ を
使って Apache Server を解析し、生成されたデータベースを Lattix LDM にロードしました。 Understand
for C++ プロジェクトをビルドする際、3 つの重要な対策を行いました。
1.
重複するシンボルがプロジェクト内にないことを確認しました。これは、重複するメソッドまたは重複す
るグローバル変数がプロジェクト中にないことを意味します。通常、一緒にリンクされるものは、曖昧さ
を無くすことができないシンボルを持ちません。
2.
重複するヘッダー ファイルが Understand プロジェクト中にないことも確認しました。Understand
GUI ではロードするファイルを明確に選択できることに注意してください。
3.
基本的な API のためのメソッド シグニチャを正しく生成するために、AP_DECLARE_STATIC および
AP_DECLARE_STATIC マクロが定義されていることも確認しました。
server に対する modules の
依存関係
srclib に対する
server の依存関係
図 1 : 初期 DSM
初期 DSM は、DSM の行と列にソース コードのディレクトリ構造を示します。DSM 自体はディレクトリ中の
ファイル間の集約された依存関係を示します。各ディレクトリを展開すると、そのディレクトリ中のファイルま
たはディレクトリを表示することができます。
Page 6/8
Copyright 2007-8 Lattix, Inc. All rights reserved
C/C++ システムのアーキテクチャ管理 - Apache Server の解析
パーティションの再編成は、DSM で実行できる主な変換の 1 つです。DSM パーティショニング アルゴリ
ズムを適用してみましょう (再編成は手動で行うことも可能です)。
いくつかのインクルード ファイ
ルが os.win32 テスト中のイ
ンクルード ファイルに依存して
いる
server はいくつかの modules
に依存している
図 2 : パーティショニングされた DSM
パーティショニングされた DSM (再編成された DSM) は、興味深い状況を示しています。サブシステム
os.win32、modules、server、および include がグループ化されています。このことは、これらのサブシステ
ムが互いに循環的に結合されていることを意味します。また、support がサブシステム中でもっとも上位に
配置された一方、srclib はもっとも下位に配置されており、srclib はその上位に位置するすべてのレイヤに
よって使用されます。
非常に興味深いことは、サブシステムが循環的に結合されていても、対角線より上の依存強度が最小にな
るようサブシステムが編成されていることです。これは多くの場合に設計意図を明らかにします。パーティ
ショニングした結果、多くのことを素早く観察することができます。
1.
srclib は最下位に移動されました。srclib は Apace サーバのプラットフォームであり、ユーティリティ
関数と正規表現処理のためのライブラリを持ちます。このことは、srclib より上位の層が、srclib が上
位の層に依存するよりも、ずっと強く srclib に依存しているという事実に一致します。
2.
os.win32 に対する include の依存は驚きです。検証によって、include/ap_config.h と httpd.h が
os.win32/os.h をインクルードしていることを発見しました。また、include に対する os.win32 の 逆
依存関係も存在することを言及しておきたいと思います。
3.
もっとも重要なこととして、server と modules の間に依存関係があることに注目してください。Apache
アーキテクチャの背後にある基本原則は、modules は server に登録し、Web サーバ リクエストに
関連する処理を実行します。modules は動的にロードされるため、server が modules に依存するこ
とは予想外です。これらの依存関係を調査した際、server が http モジュールと proxy モジュールに
依存していることが判明しました。このことは、これらのモジュールが apache core の一部であり、他
のモジュールがさほど緊密に結合されていないことを示唆します。
Page 7/8
Copyright 2007-8 Lattix, Inc. All rights reserved
C/C++ システムのアーキテクチャ管理 - Apache Server の解析
このアーキテクチャを表す概念アーキテクチャ図も作成することができます。
さらに重要なことは、許可する依存関係と許可しない依存関係のルールを作成できることです。アーキテク
チャは毎日のビルドの一部としてテストすることができます。Apache サーバのさまざまな部分の間における、
予想される依存関係についてのルールでさえも作成することができます。
図 3: Apache の概念アーキテクチャ図
Page 8/8
Copyright 2007-8 Lattix, Inc. All rights reserved