Erlang Abstract Form--生成和获取
Smerl通过修改Erlang的内部解析树,并重新编译这棵解析树实现meta programming。为了理解Smerl,我们首先需要理解Erlang内部解析树的生成、表达形式和获取、修改的方法。
Erlang把解析树称为Abstract Form,要获得某一个模块的AbstractForm有两种方法:
* 从已经编译的beam文件中获取Abstract Form
* 直接解析源代码生成Abstract Form
在一个实际运行的程序中,我们可能无法存取源代码,即使能够获得源代码,它也不一定完全和正在运行的beam文件同步。因此,让我们首先把精力放在第一种方法上,第二种方法将在后面需要的时候描述。实际上两种方法只是在获得AbstractForm的方法上有所不同,而对Abstract Form的理解和操纵是完全一样的。
beam_lib 提供了操作beam文件所需要的接口。Erlang的beam文件格式是 "EA IFF 1985"标准的一个变种,它把数据分为多个 chunks. Chunk数据可以是二进制或者复合的term。如果通过名字(erlang的atom)去引用chunk,那么将返回复合term,当然这是我们需要的。
获取chunk的函数是beam_lib:chunks,例如
beam_lib:chunks(Beam,[abstract_code])
将返回Beam变量所指定的beam文件中包含的abstract_code,也就是我们需要的Abstract Form。当然,除了abstract_code以外,chunks函数还可以用来获得以下的各种调试信息
Erlang Abstract Form--生成和获取
最新推荐文章于 2022-03-25 10:26:53 发布
本文介绍了Erlang的Abstract Form,用于理解Erlang内部解析树的生成和获取方法。主要内容包括从beam文件中获取Abstract Form,使用beam_lib:chunks函数以及编译选项debug_info。通过示例展示了在不同编译选项下如何获取模块的Abstract Form。
摘要由CSDN通过智能技术生成