标签:erlang
最初形式 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 13
module ‘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
...>>
标签:erlang
原文地址:http://blog.csdn.net/erlib/article/details/46516721