‹ Atlasの力を引き出す

Atlasの力を引き出す (8): 独自のアナライザを書く — 2

CallGraphAtlasScript はシェルのクエリをプラグインのコードに変え、サンプルのスマートビューは選択に応答します。

本稿は、Atlas プラグインについての2回シリーズの後編です。第1回では、サンプルの Atlas プラグインをインポートする方法と、その内部構成を確認しました。今回は、それが動作する仕組みの詳細に入ります。

CallGraphAtlasScript.create がユーザーのホームディレクトリ直下に call-graphs ディレクトリを作成し、XCSG.Call のエッジと XCSG.Function のノードを選択して、それらのメソッドに対するループを開始しているコードです。

CallGraphAtlasScript

このスクリプトはサンプルの Atlas プラグインに含まれ、ホームディレクトリにディレクトリを作成するところから始まります。ここで重要なのは、この部分が通常の Java で書かれていることです。続いて、次のコードがあります。

// get all the call edge in the code map
Q callEdgesQ = Common.codemap().edges(XCSG.Call);
// get all the functions in the code map
Q methodsQ = Common.codemap().nodes(XCSG.Function);
// store all the functions in a list
AtlasSet<Node> methods = methodsQ.eval().nodes();

コード中のコメントは見れば分かりますが、弊社が強調したい変数の型が2つあります。Q と AtlasSet<Node> です。これらは Java に埋め込まれた、Atlas 固有の型です。以下は、Atlas のグラフ成果物を表す eDSL の型です。

  • Q はクエリを表します。
  • Graph は任意のクエリの基盤となる結果で、ノード集合とエッジ集合の和集合です。Q.eval() はクエリを評価し、Graph を返します。
  • AtlasSet<Node> はグラフのノード集合です。Graph.nodes() はグラフのノード集合を取得します。
  • AtlasSet<Edge> はグラフのエッジ集合です。Graph.edges() はグラフのエッジ集合を取得します。
  • 最後に、Node と Edge は、それぞれノードとエッジを表します。

Atlas では、AtlasSet<T> はインターフェースであり、AtlasHashSet<T> はその実装です。これらのクラスはグラフ操作向けに特化して最適化されており、大規模なグラフを扱うのに理想的です。

AtlasSet<T> は反復可能です。そのため、コードはその要素を順に処理して対応するコールグラフを計算できます。得られたグラフは、先に作成したディレクトリに .jpg ファイルとして保存されます。

Atlas プラグインのテスト

Atlas プラグインをデプロイする方法は複数あります。ただしデプロイそのものは、本稿の範囲を超えるソフトウェア工学の専門知識を必要とする、別の話題です。ここでは代わりに、スクリプトを簡単にテストする方法に焦点を当てます。

まず必ず、解析したいコードベースをインデックスしておいてください。次に、Project Explorer でご自身のプラグインを右クリックし、Atlas -> Open Atlas Shell をクリックします。これで、ご自身のプラグインがインストールされた専用の Atlas Shell が開きます。ご自身のスクリプトをインポートしてから実行できます。たとえば、CallGraphAtlasScript は次のように実行できます。

// Assuming plug-in name com.ensoftcorp.demo
import com.ensoftcorp.demo.CallGraphAtlasScript
// the code to save call graph images is in the method create()
CallGraphAtlasScript.create()

これは、Atlas で独自のアナライザを作成する方法の一端にすぎません。独自のアナライザの開発には、ご自身の具体的な問題を定式化することも含まれます。Atlas は、プログラムの成果物をグラフとして操作する簡単な方法を提供することで、複雑さの一部を軽減するように設計されています。参考として、高度なソフトウェアアナライザを構築するための、よく使われる多数のユーティリティの実装を含む、弊社の GitHub 上の toolbox-commons をご参照下さい。

スマートビューのスクリプト

サンプルのプラグインには、スマートビューのスクリプトも3つ含まれています。スマートビューのスクリプトは、Atlas ツールチェーンの Smart View コンポーネントに内部的に結び付いている点を除けば、他と変わりありません。各スクリプトには、input という引数を取るメソッド selectionChanged() があります。このメソッドをご自身のスクリプトで編集すると、スマートビューが作成されます。プログラムの成果物をどれか選択すると、引数 input がその成果物に結び付き、そのスマートビューは selectionChanged() メソッドを自動的に実行します。これはより高度な話題です。弊社は、スマートビューのスクリプトに入る前に、より簡単なスクリプトから始めることをお勧めします。スマートビューのスクリプトに特に関心がある場合は、お気軽に弊社までご連絡下さい。具体的なご要望に沿って、喜んでお手伝いします。

以上で、弊社の Atlas の入門シリーズ は終わりです。Atlas はソフトウェア解析のための強力なツールであり、便利な可視化機能を備えています。弊社は今後、特定の種類の解析と応用に焦点を当てたシリーズをさらに作成する予定です。Atlas についてさらに知りたい場合、または特定のアナライザに関心がある場合は、お気軽に https://www.ensoftcorp.com/atlas/ までご連絡下さい。

ご質問、または修正のご希望はありますか?

どのようなご用件ですか?