[Erlang].erl文件的一生

来源:互联网 发布:上课笔记软件 编辑:程序博客网 时间:2024/05/19 11:17

原创文章,转载请注明出处:服务器非业余研究http://blog.csdn.net/erlib 作者Sunface
联系邮箱:cto@188.com


最初形式 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 8apply '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

kernel erlang:

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 _cor1type k_int  0 ->    select _cor0      type k_tuple{_ker6,_ker5} ->  select _ker6    type k_atom      'state' -><<_ker5>>      altselect _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  ...>>

1 0