Skip to end of metadata
Go to start of metadata


GroovyのAST変換はcompiler phasesで定義されている9つのうちの一つで実行されなければなりません。


グローバル変換は任意のフェーズで適用される可能性がありますが、ローカル変換は意味解析フェーズかその後でのみ適用される可能性があります。手短かに言えばコンパイラフェーズは、

  • 初期化:ソースファイルが開かれ、環境が構成される
  • 構文解析:文法はソースコードを表すトークンツリーを作るために利用される
  • 変換:抽象構文木(AST)がトークンツリーから作成される
  • 意味解析:文法だけではチェックできない一貫性と妥当性チェックを行い、クラスを解析します
  • 正規化:AST構築完了
  • 命令選択:命令セットが選択されます、例えばJava5かJava5以前かといったような
  • クラス生成:メモリ上にバイナリ出力を生成します
  • 出力:ファイルシステムへバイナリ出力を書き込みます
  • 終了:最後のクリーンアップ実行


一般的に言えば、後フェーズになるほど、より多くの型情報を扱えるようになります。
もし変換がAST読み込みフェーズの場合、より豊富な後フェーズよい選択となるかもしれません。
もし変換がAST書き込みフェーズの場合、木がまばらな初期フェーズが便利かもしれません。

静的プロパティ変換


具体例として、Groovyの積極的で静的型付け、クラスの静的プロパティをここに示します。


なので、もしAST変換で静的プロパティを作りたい場合は、このチェックが実行される前にフックする必要があります。とりわけ、これは変換フェーズです(意味解析部分が捕獲されるところ)。早期のフェーズを使用したとしても、ほとんどの型は解決されていません。そしてだから型解決する限りにおいて重要な意味があります(例として、特定クラスへのアノテーション)。そして手巻きしなければならなくなります。

その他の情報


ASTが各々のフェーズで何を生成するかを学ぶために、GroovyコンソールのASTビューワを利用することで、違ったフェースでの出力を調査することができます。

  • No labels