最初形式 File.erl
1.preprocessing(预处理)
compile:file(File,[‘P‘]).
2.expansion(扩展)
compile:file(File,[‘E‘]).
3.core erlang(erlang core代码)
compile:file(File,[to_core]).
4.kernel erlang(erlang kernel代码)
compile:file(FIle,[to_kernel]).
5.Assembly(汇编码)
compile:file(File,[‘S‘]).
6.Beam file(beam文件,机器码)
compile:file(File).
最后一步实际上是集合了上面5步所有过程
示例:
fac.erl
-file("fac.erl", 1).
-module(fac).
-export([fac/1]).
-file("fac.hrl", 1).
-record(state,{acc}).
-file("fac.erl", 6).
fac(N) ->
fac(N, #state{acc = 1}).
fac(0, #state{acc = Acc}) ->
Acc;
fac(N, #state{acc = Acc} = State) ->
fac(N - 1, State#state{acc = Acc * N}预处理:
-file("fac.erl", 1).
-module(fac).
-export([fac/1]).
-file("fac.hrl", 1).
-record(state,{acc}).
-file("fac.erl", 6).
fac(N) ->
fac(N, #state{acc = 1}).
fac(0, #state{acc = Acc}) ->
Acc;
fac(N, #state{acc = Acc} = State) ->
fac(N - 1, State#state{acc = Acc * N}扩展:这里仍然还是erlang代码
-file("fac.erl", 1).
-file("fac.hrl", 1).
-file("fac.erl", 6).
fac(N) ->
fac(N, {state,1}).
fac(0, {state,Acc}) ->
Acc;
fac(N, {state,Acc} = State) ->
fac(N - 1,
begin
rec0 = Acc * N,
rec1 = State,
case rec1 of
{state,rec2} ->
{state,rec0};
_ ->
error({badrecord,state})
end
end).
module_info() ->
erlang:get_module_info(fac).
module_info(X) ->
erlang:get_module_info(fac, X).core erlang:
module ‘fac‘ [‘fac‘/1,
‘module_info‘/0,
‘module_info‘/1]
attributes []
‘fac‘/1 =
%% Line 7
fun (_cor0) ->
%% Line 8
apply ‘fac‘/2
(_cor0, {‘state‘,1})
‘fac‘/2 =
%% Line 10
fun (_cor1,_cor0) ->
case <_cor1,_cor0> of
<0,{‘state‘,Acc}> when ‘true‘ ->
%% Line 11
Acc
%% Line 12
when ‘true‘ ->
let <_cor6> =
%% Line 13module ‘fac‘
export [‘fac‘/1,
‘module_info‘/0,
‘module_info‘/1]
attributes []
fdef ‘fac‘/1(_cor0) =
enter (local ‘fac‘/2)(_cor0, {state,1})
fdef ‘fac‘/2(_cor1, _cor0) =
match _cor1,_cor0
alt
select _cor1
type k_int
0 ->
select _cor0
type k_tuple
{_ker6,_ker5} ->
select _ker6
type k_atom
‘state‘ ->
<<_ker5>>
alt
select _cor0
type k_tuple
{_ker4,_ker3} ->
select _ker4汇编:
{module, fac}. %% version = 0
{exports, [{fac,1},{module_info,0},{module_info,1}]}.
{attributes, []}.
{labels, 10}.
{function, fac, 1, 2}.
{label,1}.
{line,[{location,"fac.erl",7}]}.
{func_info,{atom,fac},{atom,fac},1}.
{label,2}.
{move,{literal,{state,1}},{x,1}}.
{call_only,2,{f,4}}.
{function, fac, 2, 4}.
{label,3}.
{line,[{location,"fac.erl",10}]}.
{func_info,{atom,fac},{atom,fac},2}.
{label,4}.
{test,is_eq_exact,{f,5},[{x,0},{integer,0}]}.
{test,is_tuple,{f,3},[{x,1}]}.
{test,test_arity,{f,5},[{x,1},2]}..beam机器码:
<<70,79,82,49, 0,0,2,136, 66,69,65,77, 65,116,111,109, 0,0,0,53 ...>>机器码等同于下面的代码
<<"FOR1",
648:32,
"BEAM",
"Atom",
0,0,0,53
...>>原文:http://blog.csdn.net/erlib/article/details/46516721