Atlasの力を引き出す (4): Atlasクエリを理解する
Atlasクエリ言語は、コード成果物を選択し、それらの集合を組み合わせ、グラフを走査します。
前回の記事では、Atlas ShellがAtlasの強力な解析機能をどのように手元へ届けるのかを見てきました。しかし、その可能性を本当に引き出すには、このツールを支えるクエリ言語を理解することが不可欠です。この言語が大きな効果を持つ理由を、ここから明らかにしていきます。

Atlasクエリの例: これらは何を計算しているのでしょうか?
Atlasクエリ言語
Atlasクエリ言語は、専用のグラフデータベースが持つ能力を余すところなく活用できるよう設計されており、複雑なソフトウェア解析を直感的かつ効率的に行えるようにします。その中核は、次の3つの主要なカテゴリに分けられます。
- 選択
- 集合演算
- グラフ走査
言語の中には、このほかにも多くの内容があります。それでも、この3つのカテゴリが機能の基盤であり、コードを精密にたどり、解析できるようにします。3つをそれぞれ見ていきます。
1. 選択
このカテゴリのクエリは、特定の条件を満たすコード成果物を選択することに焦点を当てます。Atlasは、すべてのコード成果物をグラフデータベース内のノードまたはエッジのいずれかとして表すため、この集合における主要なクエリは次のとおりです。
G.nodes(<criteria>):ノードを選択します。G.edges(<criteria>):エッジを選択します。
これらのクエリは、コードベースの中から関連する構成要素を切り出して解析するための基盤となります。変数Gは、ノードやエッジを選択する対象となる部分グラフを表します。条件は、AtlasのデータベーススキーマであるeXtensible Common Software Graph(XCSG)[1]を用いて記述します。
2. 集合演算
Atlasの選択クエリの結果は、常にグラフです。グラフは、ノードとエッジの集まりです。このような集合を扱うときには、和集合、積集合、差分といった集合演算が自然に必要になります。Atlasは、これらの演算のための組み込みクエリを提供します。
G1.union(G2):G1とG2のノード集合とエッジ集合を結合します。G1.intersection(G2):G1とG2の間で重なるノードとエッジだけを返します。G1.difference(G2):G1に含まれ、G2には含まれないノードとエッジを生成します。
これらの演算により、開発者はグラフに基づく表現に対して高度な操作を行え、複雑なコード解析に必要な柔軟性が得られます。
3. グラフ走査
グラフを扱うときには、関係と依存関係を調べるうえで走査が不可欠です。Atlasは、グラフに基づく表現をたどるための強力なグラフ走査クエリを提供します。
G.forward(node)/G.reverse(node):特定のノードを起点に、グラフGのエッジに沿って前方または後方へ走査します。G.predecessors(node)/G.successors(node):グラフGにおいて、指定したノードに直接先行する、または直接後続するすべてのノードを特定します。G.between(node1, node2):グラフGの中で、node1から始まりnode2で終わるすべてのパスを見つけます。
グラフ走査はAtlasの解析の中核を成し、コードベース内の制御フロー、依存関係、関係を詳しく調べられるようにします。これはまだ始まりにすぎません。グラフ演算の可能性については、これから明らかにする内容がまだ多くあります。この興味深いテーマをさらに深く掘り下げる続編を、お待ちください。
Atlasクエリ言語は、Atlasの強力なグラフデータベースが持つ可能性を余すところなく引き出す入口です。コード成果物を選択し、操作し、走査できることで、開発者は精密かつ柔軟に高度な解析を行えます。特定のコード要素を絞り込むことから、入り組んだ関係をたどることまで、クエリ言語は、最も複雑なソフトウェアシステムにも取り組むための手段となります。使い始めたばかりの方も、理解を深めたい方も、これらのクエリを習得することは、コードベースへの比類のない洞察へ向かう一歩です。Atlasのグラフ機能への探求は、まだ終わっていません。調べられることは、まだ多く残っています。
[1] A Humane, Graph-Based Representation of Programs and Analyses、ホワイトペーパー: https://ensoftupdate.com/papers/XCSGWhitepaper.pdf
次: 制御フローとデータフロー
ご質問、または修正のご希望はありますか?
ありがとうございます。
このページについての内容を受け取りました。
