官网英文原文:http://haxe.org/manual/macros
其实从Haxe2.09开始,macros就已经很完善和强大了,不过那时候我对整个Haxe还不够熟悉,因此对macro这么高级的东西就更是敬而远之了。
虽然目前为止还没有实际使用过macros,但这里试图结合官网文档说说自己的肤浅理解:
在C和C++里,你是可以用宏(即#define xxxx)定义一些常量和内联操作的,但是,简单来说C和C++中的宏只是简单的字符串替换功能,是在预编译过程中被处理的,简单应用很简单,但写复杂了却很容易出错,也没法实现更高级的语义级操作。
Haxe的宏则远远不止于此,在我的理解中,Haxe源文件的编译也是分两个阶段的:
首先是宏的解析阶段,这个阶段包含宏的原始代码被处理成抽象语法树 AST (Abstract Syntax Tree),然后运行源码中定义的宏;宏其实也是标准的Haxe代码,但它是被Haxe编译器运行的,这个过程中,宏代码可以访问的并非运行期环境的API,而是宏上下文macro context,可以读取或修改AST上的节点表达式,创建新类型,创建新的Haxe代码,另外也可以通过Haxe标准库来访问本地文件系统,网络等,比如可以对资源文件进行预处理,根据数据文件生成初始化代码等等。
另一个阶段则是标准的编译阶段,这一阶段的输入是宏解析阶段处理后的AST,包括宏创建的代码也都被解析成AST,然后经过编译器后端,被处理成目标平台的源代码或字节码。