`
DiaoCow
  • 浏览: 242743 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Erlang rebar源码学习(一)

阅读更多
最近看霸爷的微博(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.erlrebar_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
分享到:
评论

相关推荐

    使用rebar工具开发erlang工程项目和发布erlang工程项目学习.pdf

    使用 rebar 工具开发 Erlang 工程项目和发布 Erlang 工程项目学习 本文主要介绍了使用 rebar 工具开发 Erlang 工程项目和发布 Erlang 工程项目的方法。rebar 是一个 Erlang 构建工具,可以方便的编译测试 Erlang ...

    erlang 学习笔记1

    【描述】虽然描述中没有具体的信息,但我们可以假设这是一个博主分享的关于Erlang学习的初步笔记,可能涵盖了基本语法、并发模型以及一些实用工具的使用。 【标签】"源码"和"工具"提示我们,这篇笔记可能包括了...

    erlang官方资源包

    Erlang是一种面向并发的、通用的编程语言,由瑞典电信设备制造商Ericsson开发,用于构建高可用性、分布式和实时系统。OTP(Open Telecom Platform)是Erlang的开源框架,提供了各种库和设计模式,帮助开发者构建高效...

    Erlang 运行环境的安装文件

    8. **开发工具**:为了更高效地开发 Erlang 项目,你可以考虑安装集成开发环境(IDE)如 IntelliJ IDEA 的 Erlang 插件,或者使用专门的 Erlang IDEs 如 Rebar3 和 Elixir IDE。 总的来说,安装 Erlang 运行环境是...

    erlang高级原理和应用PPT

    综上所述,这份PPT将为学习者提供一个深入了解Erlang高级特性和实际应用的平台,帮助他们掌握构建高可用、高性能系统的关键技术。通过链接提供的博客和PPT的结合学习,可以更好地掌握Erlang编程并提升相关技能。

    Erlang应用部署与热代码替换--理解2

    2. **创建释放包**:使用`rebar3`或`escript`等工具,将编译后的beam文件、应用配置文件和应用描述文件(.app)打包成一个可部署的释放包(通常是一个.tar.gz文件)。 3. **部署到节点**:将释放包复制到目标Erlang...

    cpp-Cowboy用于ErlangOTP的小型快速现代的HTTP服务器

    同时,由于Erlang的语法简洁,学习曲线相对平缓。 7. **社区支持**: Cowboy有活跃的社区,开发者可以在这里找到解决方案、示例代码和最佳实践。 在实际应用中,Cowboy常与其他Erlang框架(如Phoenix或Rebar3)一起...

    erlide插件

    7. **文档和帮助**:Erlide还提供了Erlang文档的快速访问,帮助开发者更好地理解和学习Erlang语言及库函数。 8. **代码分析和重构**:Erlide支持基本的代码分析和重构操作,帮助优化代码结构。 **使用Erlide的步骤...

    E语言源码目录树演示.zip

    这个“E语言源码目录树演示.zip”文件很可能包含了一个Erlang项目的源代码结构,供学习者或开发者参考。 在Erlang项目中,源码目录树通常遵循一定的组织规则,以保持代码的清晰和可维护性。以下是一般Erlang项目的...

    otp_src_25.0.2.tar.gz

    这些源代码可能包括各种模块、库函数、测试用例、文档等,供开发者学习、扩展或定制Erlang OTP的功能。 Erlang OTP的知识点: 1. **Erlang语言特性**:Erlang是一种基于BEAM虚拟机的并行、分布式、面向进程的语言...

    jinterface-sample:使用JInterface的示例Erlang应用程序

    不过,通常在一个Erlang项目的源码结构中,你可能会找到以下组件: 1. Erlang源码文件(.erl):包含Erlang模块和函数实现。 2. Java源码文件(.java):展示了如何在Java中使用JInterface。 3. Makefile或rebar....

    杭州ecug会议上的演讲稿

    标题“杭州ecug会议上的演讲稿”提示我们这是一篇在杭州举行的ECUG(Erlang Community User Group)会议上的演讲材料,...对于想要深入学习Erlang或对Erlang优化感兴趣的开发者来说,这份演讲稿无疑是一个宝贵的资源。

    otp_src_23.3.tar.gz

    在描述中,我们看到与标题完全相同的"otp_src_23.3.tar.gz",这通常意味着这是一个源代码版本的发布,"src"表示“源码”,而"23.3"则代表该版本的编号。Erlang/OTP的版本更新通常包含错误修复、新功能的添加以及性能...

    otp_src_24.0.tar.gz

    总的来说,"otp_src_24.0.tar.gz"是一个包含了Erlang OTP库的源代码包,版本24.0,对于RabbitMQ开发者或者对Erlang分布式系统有兴趣的学习者来说,这是一个宝贵的资源。通过学习和研究这个源码,我们可以深入理解...

    weby:Gleam Lang中的简单Web服务器

    运行`rebar3 shell`命令,这将打开一个交互式的Erlang shell,允许我们直接运行和测试Gleam代码。 在Erlang shell中,你可以加载和运行`weby`项目中的代码,以启动Web服务器。一旦服务器运行,你可以通过访问指定的...

Global site tag (gtag.js) - Google Analytics