专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Erlang

[Erlang].erl文件的一世

发布时间:2011-06-29 17:48:27 文章来源:www.iduyao.cn 采编人员:星星草
[Erlang].erl文件的一生

原创文章,转载请注明出处:服务器非业余研究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 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

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 _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
  ...>>

友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: