对于如下源码test.erl
1 | -module(test). |
在各编译期有不同的形式
可以在erlang shell里使用c命令编译
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V7.0 (abort with ^G)
1>c(test, 'P')
.
Warning: No object file created - nothing loaded
也可以用erlc
$ erlc -help
Usage: erlc [Options] file.ext ...
Options:
...
-E generate listing of expanded code (Erlang compiler)
-S generate assembly listing (Erlang compiler)
-P generate listing of preprocessed code (Erlang compiler)
+term pass the Erlang term unchanged to the compiler
P
生成经过预处理和parse transform的代码, 扩展名.P
$ erlc -P test.erl
1 | -file("test.erl", 1). |
E
生成经过所有源代码处理的代码, 扩展名.E
$ erlc -E test.erl
1 | -file("test.erl", 1). |
S
生成中间汇编码, 扩展名.S
$ erlc -S test.erl
1 | {module, test}. %% version = 0 |
erts_debug:df/1
从beam生成VM opcode, 扩展名dis
$ erl
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]Eshell V7.0 (abort with ^G)
1> erts_debug:df(test).
ok
1 | 00007F0BDC63C3D0: i_func_info_IaaI 0 test start_link 0 |
Core Erlang
Core Erlang是Erlang的一种中间表现形式, 尽可能保持语法简单, 稳定和可读性以方便工具解析或手工修改
换句话说,通过Core Erlang我们可以透过语法糖看到真实的代码逻辑
$ erl
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]Eshell V7.0 (abort with ^G)
1> c(test,[to_core]).
Warning: No object file created - nothing loaded
ok
1 | module 'test' ['fac'/1, |
参考链接
http://www.cnblogs.com/me-sa/p/know-a-little-erlang-opcode.html
http://blog.yufeng.info/archives/498