CおよびC++のプログラミング用語
本稿では、CおよびC++のさまざまなプログラミングパラダイムを扱います。Cのソースコードファイルは、配布物の中で「.c」という拡張子が付いているファイルです。C++のソースファイルには「.cc」という拡張子が付いていますが、Windowsの一部のシステムでは「.cpp」という拡張子が付いている場合もあります。CとC++のどちらのソースファイルでも、「.h」という拡張子を持つヘッダーファイルを#includeディレクティブでインクルードすることができます。CおよびC++では、ソースファイルで使用する関数と変数をヘッダーファイルで定義するのが習わしになっています。
通常、ヘッダーファイルにはソースファイルと同じ名前を付けて「.h」という拡張子を付けますが、必ずしもそうでないこともあります。システムのソースコードを見るときに最初にすることの1つは、変数と関数が「どこで」定義されているかを確認することです。ときには、ヘッダーファイルの広大な階層を調べて、変数や関数がどこで公式に定義されているかを見つけることが必要になります。
当然、読者は変数や関数がどのようなものかをよく知っているはずなので、ここではあまり詳しく解説しません。ただし、CおよびC++のプログラミングでは、それ以外のデータ型と用語が頻繁に使われます。特に、本稿では次の用語を使います。
- 構造体
- クラス
- メンバ変数
- メンバメソッド
「構造体」は、本質的に一連のデータのコンテナです。構造体は一般に次のような形で定義されます。
typedef struct st_heapinfo /* Struct heap_info */ { ulong records; /* Records in database */ ulong deleted; /* Deleted records in database */ ulong max_records; ulong data_length; ulong index_length; uint reclength; /* Length of one record */ int errkey; ulonglong auto_increment; } HEAPINFO;
ここに示したのは、/include/heap.hで定義されている構造体です。ここでは、struct (st_heapinfo)を構成するさまざまなデータ型のメンバ変数(records、max_recordsなど)をいくつか定義し、このst_heapinfo構造体をHEAPINFOという別名で表すことをtypedefで定義しています。Cコードのコメントは、//または/* ... */という文字で表します。
一方、「クラス」はCの構造体に似たC++のオブジェクト指向構造ですが、「メンバ変数」の他に「メンバメソッド」を持つことができます。メンバメソッドはクラスの関数で、クラスの「インスタンス」を通じて呼び出すことができます。
ソースコードの分析に役立つDoxygen
ソースコードの分析には、Doxygenなどのツールを使うことをお勧めします。Doxygenを使うと、ソース配布物からコードの構造を調べることができます。このツールは、MySQLのように、1つの実行処理で何百ものクラスメンバと関数を呼び出す巨大なソース配布物の関数を調査するのにきわめて有効です。ドキュメント形式の出力を見ると、クラスや構造体がどこで定義され、どこで実装されているかがわかります。
Doxygenでは、このツールで生成されるドキュメントの出力形式を必要に応じて設定でき、UMLの継承図やコラボレーション図を生成することさえできます。ソースコード内のクラス階層を示すだけでなく、関数が定義および実装されている場所へのリンクも生成できます。
Unixマシンでは、DoxygenのWebサイトからソースコードをダウンロードし、手順に従ってインストールします(インストール方法の説明もWebサイトから入手できます)。グラフィカルな出力を生成するには、先にGraph Visualizationツールキットをhttp://www.graphviz.org/からダウンロードしてインストールします。Doxygenをインストールしたら、次のコマンドを実行し、Doxygenが処理するデフォルトの設定ファイルを作成します。
# doxygen -g -s /path/to/newconfig.file
/path/to/newconfig.fileオプションには、Doxygenのドキュメントの生成先となるディレクトリを指定します。設定ファイルが作成されたら、好みのエディタで設定ファイルを開き、必要なセクションを編集します。変更する必要があるのは、通常はOUTPUT_DIRECTORY、INPUT、およびPROJECT_NAMEの設定だけです。設定ファイルを編集したら、次のコマンドを実行します。
# doxygen </path/to/config-file>
参考のために、MySQL 5.0.2のDoxygenの出力例をhttp://www.jpipes.com/mysqldox/で公開しています。
MySQLのドキュメント
システムの内部構造のドキュメントは、MySQLのソースコードをダウンロードすると利用できるようになります。ファイルはソースツリーのDocsディレクトリにあり、「internals.texi」というTEXIドキュメントになっています。
このTEXIドキュメントでは、次のトピックが詳しく説明されています。
- コーディングのガイドライン
- オプティマイザ(必読)
- 重要なアルゴリズムと構造
- 文字セットとそれに関連する問題
- MySQLがさまざまなSELECT処理を実行する方法(必読)
- MySQLがクエリを変換する方法
- 通信プロトコル
- レプリケーション
- MyISAMのレコード構造
- .MYIファイル構造
- InnoDBのレコード構造
- InnoDBのページ構造
内部構造のドキュメントは、サーバの特定の主要な要素(特にクエリオプティマイザ)を調べるうえで非常に役立ちますが、各サブシステムが相互にやりとりする方法には直接触れていないことに注意してください。このやりとりの方法を調べるには、ソースコード自体と開発者のコメントを確認する必要があります(※2)。
