Atlas の力を引き出す (7): 独自の解析器を書く — 1
カスタム解析器は Atlas のプラグインであり、起点は Atlas が提供するサンプルプロジェクトです。
このシリーズでは、Atlas の基礎であるグラフ表現、クエリ言語、強力な可視化機能を見てきました。基本的な解析についても、Atlas を使って取り上げました。その過程で、これらの機能を組み合わせ、特定のソフトウェア解析タスクに合わせたカスタム解析器を作成できる可能性に触れてきました。
いま、すべてを一つにまとめるときです。最後の 2 つの記事では、Atlas を使ってカスタムのソフトウェア解析器を設計し実装する方法を、より詳しく見ていきます。このツールセットの可能性を十分に引き出すための、実践的な手順に入りましょう。
Atlas プラグインとしてのソフトウェア解析器
Atlas のカスタムソフトウェア解析器は、プラグインとして開発します。これにより、特定の解析の必要に合わせて機能を拡張できます。始めやすくするため、Atlas はサンプルのプラグインプロジェクトを提供しています。インポート手順は次のとおりです。
- Atlas のインターフェースで File -> New -> Other へ移動します。
- ポップアップ画面で Atlas カテゴリを見つけ、Sample Atlas Plug-in Project を選択します。プロジェクトはワークスペースに配置され、Project Explorer ビューからアクセスできます。
- プロジェクトに適した名前を付けます。必須ではありませんが、他のツールチェーンとの一貫性と互換性を確保するため、弊社は
'com.<organization_name>.<project_name>'のような命名規則の使用を推奨します。
サンプルプロジェクトが用意できれば、カスタムソフトウェア解析器の構築を始められます。
Atlas プラグインの構造

Atlas プラグインの仕組みを理解するため、サンプルの Atlas プラグインプロジェクトの構造を分解します。サンプルプロジェクトには、通常、5 つのクラス — Activator、CallGraphAtlasScript、CallGraphAtlasSmartView、DataFlowWithinFunctionSmartView、TypeOfSmartView — があります。サンプルの Atlas プラグインプロジェクトでは、3 つの Smart View クラスを 1 つのカテゴリにまとめることができます。これについては後で取り上げます。まず Activator クラスと CallGraphAtlasScript に注目します。
Activatorクラスは、プラグインマニフェストとともに、プラグインを Atlas ツールチェーンの残りの部分と結び付けます。このクラスは、プラグインのライフサイクルを初期化し管理する役割を担い、Atlas とシームレスに統合されるようにします。目的が基盤にあるため、意図しない支障を避けるよう、このクラスを変更しないままにすることを弊社は推奨します。CallGraphAtlasScriptは、記事の第 2 部で主に注目する箇所です。このスクリプトは、Atlas Shell で実行した Atlas クエリを、プラグインとして組み込めるモジュール化されたコードへ変換する方法を示します。このスクリプトに注目することで、解析を、Atlas のグラフ表現とクエリ機能を活用する再利用可能なコンポーネントへカプセル化し、統合と拡張をしやすくする方法を学べます。
最後に、プラグインの依存関係を管理する MANIFEST.MF と plugin.xml があります。これらのファイルにより、使用したい外部ライブラリを任意にインポートでき、解析器の機能を拡張できます。
Atlas プラグインは、Java とシームレスに統合される埋め込みドメイン特化言語(eDSL)で書かれています。この統合により、Java ライブラリを活用してプラグインを強化でき、高度なソフトウェア解析ツールを構築するうえで比類のない柔軟性と汎用性が得られます。たとえば、Atlas の解析機能と SAT4J のような SAT ソルバーを組み合わせて、実行可能性チェッカーを実装できます。これにより、強力な問題解決の可能性が開きます。あるいは、Atlas の中で独自のカスタムソリューションを開発することもできます。可能性に限りはありません。
この記事では、Atlas プラグインの要点を確認しました。結びの節ではスクリプトをより深く掘り下げ、独自のカスタム解析器の書き方を見て、手順をより詳しく理解します。
結び: 独自の解析器を書く — 2
ご質問、または修正のご希望はありますか?
ありがとうございます。
このページについての内容を受け取りました。
