コード分析のクエリ言語 (mFQL)

<< 目次を表示 >>

ページ位置:  ソースコードの生成と読み込み > コード分析 > コード分析 フレームワーク > コード分析のクエリ >

コード分析のクエリ言語 (mFQL)

Code Minerでは、既存のソースコードに関する情報を高速に、包括的に参照できます。すべてのソースコードを解析し、その情報をAST (Abstract Syntax Tree)と呼ばれる形式で格納します。格納するデータベースは読み込みに特化したもので、ソースコードに関するさまざまな情報を高速に取得できます。

 

この仕組みを利用することで、ソースコード内のさまざまな情報を効率よく瞬時に参照することが可能となります。その結果、プログラムの構造の解析やメトリックスの算出・関係の追跡やリファクタリングなどさまざまな活動を支援できます。

 

 

mFQL

mFQLは Code Minerで利用するクエリ言語です。この言語自体はシンプルで、コマンドの数もそれほど多くありません。言語をシンプルにすることで、規模が大きいデータや複雑なデータでも高速に処理ができます。

 

この言語は離散的・垂直的なインデックスを通して得られる抽象的なデータのセットを操作します。Code Minerで利用する場合でのセットとは、順序のある数値の配列です。それぞれの数値は、ASTストア内のノードを示すポインタ番号です。インデックスを利用することで、離散的な値に対してセットを取得できます。

 

この言語には、3つの基本的な結合操作のセットが含まれています。intersect (交差), union (結合) と except (除外)です。exceptの結合は、対象相違のjoinです。補完のjoinは短いサブクエリを利用することで実現できます。詳細はexceptの結合の説明をご覧ください。offsetIntersectの結合についても説明しています。

 

Code Minerのデータベースでは、ASTのストアを示す3つの離散的で垂直的なインデックスがあります。そのインデックスはノード名・属性名・属性値です。それぞれのインデックスは離散値を持ち、値を持つすべてのノードをセットとして返します。3つのインデックスは、3つの関数getByNode, getByName および getByValue で参照できます。

 

セットの走査処理は、AST内のパターンに基づき、セットをフィルタ刷るために利用します。走査処理は破壊的(移動)か、非破壊的(フィルタ)のいずれかになります。破壊的な走査はセットのメンバーの値を直接編集します。走査が完了するまでは、ノードを削除できません。

 

mFQLにおけるすべての走査は昇順で行います。降順での走査は、ノードが複数のノードを保持できる状況では技術的に複雑なものとなります。それに対して、昇順での遷移はシンプルになります。それぞれのノードは0ないしは1つの親ノードを持ちます。このような理由で、この言語では降順での走査には対応していません。

 

mFQLは多くのコマンドを持っていませんが、複雑なクエリにも対応できます。ネストした呼び出しにも対応しています。

 

mFQLのクエリの実行処理は早いです。バックエンドのデータベースは読み込みに最適化されています。また、クエリのパーサも最適化されています。ノードは常に整列されていることが保証されているので、結合処理を行う場合に内部処理を省くこともできます。

 

nBNFを効率的に利用するためには、対象の言語についての詳細な知識と、その文法の解析に関する知識が必要です。