[Erlang].erl文件的一生
最初形式 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,beginrec0 = Acc * N,rec1 = State,case rec1 of{state,rec2} ->{state,rec0};_ ->error({badrecord,state})endend).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 7fun (_cor0) ->%% Line 8apply 'fac'/2(_cor0, {'state',1})
'fac'/2 =%% Line 10fun (_cor1,_cor0) ->case <_cor1,_cor0> of<0,{'state',Acc}> when 'true' ->%% Line 11Acc%% Line 12when '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,_cor0altselect _cor1type k_int0 ->select _cor0type k_tuple{_ker6,_ker5} ->select _ker6type k_atom'state' -><<_ker5>>altselect _cor0type 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文件的一生相关推荐
- Progamming Erlang 通过 Makefile 自动编译 .erl 文件
通过 makefile 可以自动化一部分工作,比如编译 .erl 文件 一.在 /root/workspace/erlang/test 中新建两个 .erl 文件,分别是 test.erl ,test ...
- Erlang模块erl翻译
命令: erl 概述: Erlang模拟器 描述: erl程序启动一个Erlang运行时系统.准确的信息是依赖于系统的(举例,erl是否是脚本或程序,其它程序调用). 相反,windows用户可能想要 ...
- Windows下Erlang开发环境搭建
1.下载otp_win32_R15B.exe,并安装: 2.配置环境变量 a.增加用户变量ERL_HOME,变量值为C:\Program Files\erl5.9(erlang的安装路径). b.编辑 ...
- 《Erlang程序设计》第十五章 ETS和DETS:大数据的存储机制
第十五章 ETS和DETS:大数据的存储机制 Table of Contents 第十五章 ETS和DETS:大数据的存储机制 15.1 表的基本操作 创建和打开表 插入表 查找元组 释放表 15.2 ...
- erlang环境变量——HOME
2019独角兽企业重金招聘Python工程师标准>>> 当我们启动一个erl时,通过ps可以看到对应进程会自动带上一堆参数,其中一个是"-home" 那么-hom ...
- Erlang实战:建立文本索引
为文本建立索引是文本信息处理的一个重要的任务,给定一个由英文单词构成的文件,为文件中所有单词建立索引,记录每个单词出现的行号和每行出现的次数,并将索引存入一个文件.在Erlang实战练习(六)中我强调 ...
- ubuntu下搭建erlang编程环境
ubuntu下搭建erlang编程环境 吐槽:erlang作为一门小众语言,编程环境配置的我发疯啊,官方标配是emacs,但是我作为中毒已深的vimer实在不想换编辑器了,在尝试的途中我还试过了用ec ...
- Erlang读书笔记
Erlang的交互式环境 安装:下载并安装Erlang,在OS的环境变量中添加pathErlangHOME/bin目录 启动:linux 环境:erl,windows: 开始-程序-erlang图标启 ...
- Erlang词法分析器、语法分析器(lexer-leex,yac-yecc)
一.简介 一门编程语言的编译器或者解释器通常功能分解为两步: 1.读取源码文件然后分析它的结构 2.处理这些结构,例如生成目标程序 lexer和yacc就是能完成第一步以便生成程序段的工具.而第一步的 ...
最新文章
- spring boot 2.0 源码分析(二)
- Python3 xml模块的增删改查
- altium designer 绘制pcb时漏线检查
- apache mysql php实现最大负载的方法_如何架设高性能nginx+php+mysql搭配的服务器,解决高并发问题...
- java==和=_java中==和 equal区别
- 愿只有一个Grid Layout
- 讲给23岁以上男生的生活方式
- 机器学习学习吴恩达逻辑回归_机器学习基础:逻辑回归
- kindeditor用法简单介绍(转)
- 记录工作中遇到的问题
- 本地无法启动MySQL服务,报的错误:1067,进程意外终止---解决
- 无法找到或创建字体'SansSerif'.某些字符可能无法正确显示或打印。
- mysql 多键sequence_MySQL增多Sequence管理功能
- 【数据仓库】数据仓库设计前如何粗估所需的存储空间大小?
- 如何卸载FileZilla的Ftp服务
- iphone iPhone开发中如何将制作图片放大缩小代码实现案例
- media query学习笔记
- TFTPD32不能传输数据的解决与尝试
- pr如何跳到关键帧_必收藏的PR常用快捷键大全
- RFM、PSM、波士顿矩阵模型简介
热门文章
- HEVC编码框架和main函数代码跟踪解读
- https协议和Htt协议
- [GWCTF 2019]枯燥的抽奖 1——php_mt_seed
- O2OA RCE 远程命令执行漏洞复现(CVE-2022-22916)
- 中级工程师职称有什么作用?有含金量吗?为什么要办?甘建二
- 外贸用户如何创建邮箱并登录邮箱?
- Java27岁了——我与Java初识
- [2017-08-21]Abp系列——如何使用Abp插件机制(注册权限、菜单、路由)
- Python如何安装模块,python模块安装失败的原因以及解决办法
- Premiere视频调色处理,将彩色画面转变成黑白色 myblogfree