Skip to end of metadata
Go to start of metadata

AST変換


時々ではあるが、Groovyの構文を拡張して新しい機能を実装すること(複数割り当てのインスタンスの場合のように)はよいアイデアと思われるようです。ほとんどの場合、新しい概念を表現するために新しい構文を構築したり、文法に新しいキーワードを追加したりすることはできません。新しい機能を実装するために、Groovyの構文を拡張することをお勧めのように聞こえるかもしれないが、ほとんどの時間、私たちは、新しいキーワードを追加することはできません文法は、またはいくつかの新しい構文は新しいコンセプトを表現するために構築を作成します。しかしながら、AST (Abstract Syntax Tree:抽象構文木)変換のアイデアを用いることにより、文法を変更すること無しに、新しい革新的なアイデアに取り組むことができるのです。


Groovyコンパイラが、Groovyスクリプトやクラスをコンパイルする際、プロセス内のある時点で、ソースコードは具象構文木としてメモリ内で表現され、それから抽象構文木へと変換されます。AST変換の目的は、JVMで実行されるバイトコードに変換される前に、開発者がコンパイル時にASTを変更できるようにフックさせることです。


AST変換はGroovyに改良されたコンパイル時のメタプログラミング機能により、実行時のパフォーマンスを犠牲にすることなしに、強力な柔軟性を言語レベルで提供します。


変換にはグローバル変換とローカル変換の2種類があります。


グローバル変換は、コンパイル開始時にコンパイラによって適用されます。コードのどこにいても変換が適用されます。コンパイラのクラスパスに追加されたJARファイルは META-INF/services/org.codehaus.groovy.transform へのサービスロケーターファイルを含んでいる必要があります。ASTTransformationという名前の行情報を持ったクラスです。変換クラスは、引数なしのコンストラクタを持ち、org.codehaus.groovy.transform.ASTTransformation インタフェースを実装している必要があります。すべてのソースに対してコンパイル時に実行されるので、コンパイラの高速を維持するために、時間がかかるASTのスキャン時には変換を行わないようにしています。


ローカル変換は、変換したいコード要素にアノテーションを付けることによって、局所的に変換が適用されます。このために、アノテーション表記を再利用します。そして、アノテーションは org.codehaus.groovy.transform.ASTTransformation を実装している必要があります。コンパイラはそれらを検出し、これらのコード要素に対して変換を適用します。


この機能にアクセスするための一つのフックがアノテーション(ローカルAST変換用)を使用することです。あなたのGroovyコードでは、一つ以上のアノテーションを利用します。舞台裏では、利用しているアノテーションに関連するASTプロセッサがコンパイラフェーズの適切な位置に挿入されます。以下に人気のあるアノテーションの一部を示します。


Japanese Grapeも@Grabというアノテーションでそれ自身の変換を提供しています。

独自のAST変換の実装


AST変換にはグローバル変換とローカル変換の2種類があります。


AST変換を書くときは、次のガイドが参考になるでしょう。

  • No labels