码迷,mamicode.com
首页 > 其他好文 > 详细

[Erlang].erl文件的一生

时间:2015-06-16 14:49:34      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:erlang

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

[Erlang].erl文件的一生

标签:erlang

原文地址:http://blog.csdn.net/erlib/article/details/46516721

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!