最近看霸爷的微博(
http://weibo.com/tchuba)提到,rebar(
https://github.com/basho/rebar)是学习Erlang很好的材料,因此作为Erlang新手,自己也把源码下载下来看了下,确实发现代码写的非常优雅工整,里面的每个方法(函数)写的都很短小干练,的确可以作为写Erlang代码的范例!
那么rebar是什么呢?
如果你是Java程序员,那么你一定知道maven,maven可以用来构建java工程项目,并且提供jar包版本管理,编译,项目打包等一系列操作,而rebar就像maven一样,提供了对Erlang工程的构建,编译,依赖管理等操作(我相信随着Erlang的发展,rebar会成为标准被大家所接受)
关于rebar的下载安装以及使用,网上已经有很多例子,我也就不再赘述,那么我会说些什么呢?
1.rebar是如何执行编译的?
2.rebar执行流程是什么样的?
--------------------------------------------------------------------------华丽分割线--------------------------------------------------------------------------
和编译相关的源文件主要有两个,它们分别是:
rebar_base_compiler.erl 和
rebar_erlc_compiler.erl,其中
最为核心的部分为:rebar_base_compile中的run/4方法,它包含了rebar编译的整个流程和策略
run方法有四个参数:
第一个参数Config表示rebar配置(关于如何初始化rebar配置以后会详说),在rebar配置中包含了编译选项(譬如是否含有debug_info);
第二个参数FirstFiles和第三个参数RestFiles都表示需要编译的Erlang源文件,但他们采用完全不同的编译策略(稍后会详述);
第四个参数CompileFn则是真正被用来编译源文件的方法
刚才我们说了,源文件分为两种:FirstFiles和RestFiles
其中对于FirstFiles采用
串行编译,也就是说是它会按照FirstFiles中文件列出的顺序,逐个编译;
而对于RestFiles,则是
并发编译,即会起多个子process去执行编译任务;
那么rebar为什么要这样分呢,我自己是这样理解的(一点拙见):
1.串行编译的好处是能够根据依赖关系控制源文件编译顺序,但缺点就是编译太慢,需要一个一个执行;
2.并行编译的好处就是效率高,但很显然它无法控制编译顺序;
鉴于此,rebar结合了两种编译方式,将源文件分为FirstFiles和RestFiles,然后对FirstFiles采用串行编译,对RestFiles执行并发编译(默认源文件都是并发编译(即RestFiles),需要串行编译的文件要在rebar.config文件中的erl_first_files属性中列出)
现在我们具体看看rebar串行编译的相关代码(compile_each方法)
这段代码比较好理解:递归编译源文件直到遍历完FirstFiles或者中间发生编译错误 (?FAIL 会抛出异常,然后中断当前操作),看完了串行编译,我们看下rebar的并行编译部分(它分为子process和父process两部分):
a.子process部分(执行compile_worker方法)
b.父process部分(执行compile_queue方法)
注意:(上图166行)父process之所以会收到 {Down, _, _, _} 这类消息是因为父process monitor 子process; 当子process终止运行时,它变会发送该消息来告诉监控它的process
为了更加充分展示父process和子process是如何交互的,我自己画了一个图
配合上图,在我们看代码时就很容易看出,父process是如何和子process交互以及如何通过这些交互实现并发编译
- 大小: 28.9 KB
- 大小: 27.9 KB
- 大小: 64.5 KB
- 大小: 59.4 KB
- 大小: 46.7 KB
- 大小: 52 KB
分享到:
相关推荐
erlang rebar 二进制
erlang 程序设计 源码 erlang 程序设计 源码 erlang 程序设计 源码erlang 程序设计 源码
erlang build tools rebar
erlang 部分源码, 虽然不是很全,但是大部分都有。 erlang 部分源码
英雄远征服务器端erlang源码,用mysql数据库
erlang21.0源码。! erlang21.0源码。!erlang21.0源码。!erlang21.0源码。!
erlang rebar3
使用rebar工具开发erlang工程项目和发布erlang工程项目
erlang server源码 一个聊天室服务器源码
使用rebar工具开发erlang工程项目和发布erlang工程项目学习.pdf
erlang具有良好的高并发性 支持热更新 本代码适合初学者更快的上手
使用rebar生成erlang release 并进行热代码升级使用rebar生成erlang release 并进行热代码升级使用rebar生成erlang release 并进行热代码升级使用rebar生成erlang release 并进行热代码升级
Joe的那篇erlang论文 Programming Erlang + 源码包 Erlang Programming Concurrent Programming in Erlang efficiecy guide 资源齐全.希望能帮到你.
rebar工具开发erlang工程项目和发布erlang工程项目
远古封神Server(erlang源码)+文档+mongodb数据库 远古封神Server(erlang源码)+文档+mongodb数据库
erlang 聊天室源代码,初学者项目,花了两周时间完成,其中设计参考的是著名聊天软件rabbitMQ 的部分模块
学习erlang 开发游戏利器 erlang学习文档 erlang学习工具
我自己在新学erlang,在LeetCode OJ上找了题目练习,题目很适合新手熟悉语言,但是LeetCode OJ里面只有几门主流语言的答案,下面是已完成的erlang源代码,后续有空再做其他问题续传,题目包含:(源码开头都有题目...
附有需求文档,设计文档,以及一些说明文档,简单的聊天室功能,适合初学者阅读,是本人学习erlang过程中写的,参照了rabbitMQ的核心模块
erlang源码安装包,此安装包是linux环境下的;erlang的版本是5.10.3