この記事は AST についてのメモです。
ASTとは
ASTは、ソースコードをそのまま文字列として扱うのではなく、意味のある構文単位ごとに木構造へ変換したものです。人間が「これは変数宣言」「これは関数呼び出し」と読んでいる情報を、ツールが処理しやすい形にした中間的な表現。
AST Abstract Syntax Tree。ソースコードを構文ごとのノードに分解した木構造のこと。
なぜ木構造が必要かというと、静的解析や変換処理では「どこに何が書かれているか」を位置と意味の両方で扱う必要があるからです。文字列のままだと、文脈を安全に判断しにくくなります。ASTであれば、特定のノードだけを対象に検査したり変換したりできます。
パーサ ソースコードを読み取り、文法ルールに従ってASTへ変換する処理系。
この流れをざっくり書くと、source code -> parser -> AST です。ESLintやBabel、TypeScript Compiler APIなど、多くの開発ツールはこの中間段階を前提に動いています。
ノード ASTを構成する1要素。例: 変数宣言、識別子、関数呼び出しなど。
次のコードを例にすると、ASTは「変数宣言」「識別子 count」「数値リテラル 1」のように分解して保持します。
const count = 1;
この視点を持つだけで、コードは単なる文字列ではなく「ノードの集合」として見えるようになります。
個人的にまだ曖昧なところ
ASTはあくまでツールが理解しやすいように意味付きで扱うための手段・その総称くらいにイメージしています。
世の中には沢山のツールや言語があり、それぞれASTまたはAST的な変換フローを持っていますが、それが必ずしもASTと呼ばれているかは定かではありません。
例えばTypeScriptは明確にASTを用いて型検査し、JSヘトランスパイルしますが、HTMLはパースからのDOMツリーを作ります。このDOM自体も木構造ではありますが、ASTと呼ばれていることはあまりない印象です。ASTよりもDOMの方が一般的ですよね。
このように、ASTという用語が指す範囲や定義はツールや文脈によって微妙に異なる場合があると感じています。難しい。