【ちゅうしょうこうぶんぎ】

抽象構文木(AST) とは?

最終更新:
💡 コードの構文を、要素が枝分かれする「構造の地図」に

ソースコードの構文上の構造を、要素とその関係が枝分かれする木として表したデータ。コンパイラやコードの検査・整形に使う。残す情報や節の種類は言語と解析ツールによって異なる。

📌 このページのポイント
1 + 2 * 3 の構文を木にする 1 + 2 * 3 構文解析 + 1 * 2 3 左の要素 右の要素 2 * 3 のまとまり 演算のまとまりを表す模式図 位置・括弧などの情報はツールによる
演算のまとまりだけを示す模式図。足し算の右側に掛け算があり、計算結果は7。木の線は親子関係を表し、処理順を示す矢印ではない。実際のASTの節や保持情報はツールによって異なる。
ひよこ ひよこ
抽象構文木は、何を木にするの?
ペンギン先生 ペンギン先生
コードの構文上の構造だよ。たとえば「1 + 2 * 3」なら、足し算の左右は1と掛け算、掛け算の左右は2と3という枝分かれで表せる。文字列を要素と関係に整理したデータなんだ。
ひよこ ひよこ
その枝分かれで、何が分かるの?
ペンギン先生 ペンギン先生
式のまとまりが分かるよ。この例は「1 + (2 * 3)」という構造なので、計算すると7。「(1 + 2) * 3」なら別の枝分かれになり、結果は9だ。木の線は要素の親子関係で、処理の時間順を示す矢印ではないんだ。
ひよこ ひよこ
コンパイラはASTを使うんだよね?
ペンギン先生 ペンギン先生
多くのコンパイラが構文解析でASTを作り、さらに名前や型を調べたり、別の中間表現へ変換したりするよ。コードを別の形へ変換するツールでも使う。ただしASTを作ることだけで、機械語への変換がすべて終わるわけではないんだ。
ひよこ ひよこ
抽象ということは、括弧やコメントは全部消える?
ペンギン先生 ペンギン先生
全部消えるとは限らないよ。どの情報を残すかは言語やツールの設計による。たとえばClangは括弧の式も残す。コードを整形する道具なら、コメントなどを出力へ残す扱いも必要なんだ。
ひよこ ひよこ
ASTが作れたら、正しいプログラムになるの?
ペンギン先生 ペンギン先生
それだけでは保証できないよ。Pythonのast.parseも、ASTを作る段階では変数のスコープの検査をしない。ESLintは木の要素をたどってルールを検査し、Prettierは木をもとに整形する。名前や型、実行時の問題は必要な別の解析やテストで確かめるんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「抽象構文木(AST)」って出てきたら「コードの構文を木の形に整理したデータ」と思えばだいたいOK!
📖 おまけ:英語の意味
「Abstract Syntax Tree」 = 抽象構文木
💬 Syntaxは構文、Treeは木構造を表すよ。Abstractは構文の要素や関係に着目すること。括弧やコメントを必ずすべて捨てるという意味ではなく、残す情報はツールによって違うんだ。

参考資料

← 用語集にもどる