让Erlang自动编译并加载代码

标签: erlang | 发表时间:2011-08-09 15:42 | 作者:Youcai Qian Andy
出处:http://cn.intridea.com/

最近参与的项目使用了ejabberd,得此锲机第一次接触了Erlang。 作为一个函数式编程语言(functional language),除了函数式语言本身特点之外, 因为Erlang是为分布式,高并发,高容错系统量身设计的,所以也有一些属于自己的独门秘籍。 譬如热更新(hot swapping): 系统可以在运行过程中替换部分代码,更神奇的是,新旧代码还可以部分共存。

但是,因为Erlang的相对小众,所以开发环境不是很友好。对于写惯Ruby的人来说,最痛苦的莫过于不能实时看到修改后的效果了。 不过既然Erlang有这么NB的特性,实现这样的一个效果绝对不是问题。

解决方案

  1. 用watchr观察项目文件,一旦有文件修改保存,调用erlc编译源文件,得到beam文件
  2. 拷贝并替换运行中的文件
  3. 此时新代码并没有被加载,因为erlang默认并不会自动加载新文件,必须显式调用code:purge和code:load_file。 想办法自动化,google得之 https://github.com/mochi/mochiweb/blob/master/src/reloader.erl

简单解读下这个文件:

  • reloader被载入后,每一秒执行一次doit函数
  • doit遍历code:all_loaded()返回的所有beam文件,如果文件发生过更新,则加载之。
  • 如果有写测试的话,还会先执行下测试,测试成功后才会加载新文件

现在把reloader.erl放到项目中,重新编译安装,就可以得到一个自动加载新代码的版本了。

来一段简单的watchr脚本示例

watch('.*\.erl') do |erl|
  puts "#{erl} is updated!"
  system("erlc #{erl}")

  beam = erl.to_s[0...-3] + "beam"
  puts "copy #{beam} to /lib/ejabberd/ebin"
  system("sudo cp #{beam} /lib/ejabberd/ebin/")
end

题外转发

《Programming Erlang》一书的扉页:

Joe Armstrong (Erlang作者):
The world is parallel.
If we want to write programs that behave as other objects behave in the real world, then these programs will have a concurrent structure.
Use a language that was designed for writing concurrent applications, and development becomes a lot easier.
Erlang programs model how we think and interact.

Erlang应对并行的方法

In Erlang, processes belong to the programming language and NOT the operating system.

  • Creating and destroying processes is very fast.
  • Sending messages between processes is very fast.
  • Processes behave the same way on all operating systems.
  • We can have very large numbers of processes.
  • Processes share no memory and are completely independent.
  • The only way for processes to interact is through message passing.

相关 [erlang 编译 加载] 推荐:

让Erlang自动编译并加载代码

- Andy - Intridea East Blog
最近参与的项目使用了ejabberd,得此锲机第一次接触了Erlang. 作为一个函数式编程语言(functional language),除了函数式语言本身特点之外, 因为Erlang是为分布式,高并发,高容错系统量身设计的,所以也有一些属于自己的独门秘籍. 譬如热更新(hot swapping): 系统可以在运行过程中替换部分代码,更神奇的是,新旧代码还可以部分共存.

Erlang代码反编译以及查看汇编码

- KnightE - Erlang非业余研究
原创文章,转载请注明: 转载自Erlang非业余研究. 本文链接地址: Erlang代码反编译以及查看汇编码. Erlang的代码是先翻译成abstract_code,再到目标代码的,如果有符号信息很容易恢复源代码,通常我们部署系统的时候需要把符号信息去掉,reltool就可以干这个事情. 想查看模块的汇编码,也很容易,这样就好:.

《Erlang编程指南》读后感

- David Ruan - Tim[后端技术]
在云时代,我们需要有更好的能利用多核功能及分布式能力的编程语言,Erlang在这方面具有天生的优势,因此我们始终对它保持强烈关注. 按:此为客座文章,投稿人为新浪微博基础研发工程师赵鹏城(http://weibo.com/iamzpc),以下为原文. 在对一个分布式KV存储系统的研究过程中,我有幸遇到了Erlang语言.

Erlang监测系统CPU、内存、磁盘

- chuang - Jobin的主页
Erlang的os_mon服务中提供了一些用于监测系统信息的服务. cpu_sup:监测CPU负载和使用率(Unix). disksup:监测磁盘(Unix、Windows). memsup:监测内存(Unix、Windows、VxWorks). os_sup:监测系统日志(Solaris、Windows).

Erlang十分钟快速入门

- - 水煮沉浮
Erlang概述Erlang不但是一种编程语言,而且它具有比编程语言更加贴近操作系统的一些特性:并发线程、作业调度、内存管理、分布式、网络化等. 据说使用Erlang编写的Yaws Web服务器,其并发性能是apache的15倍. 这个Erlang初始开源版本包含了Erlang的实现,同时它也是用于构建分布式高可用性系统的Ericsson中间件的最大组成部分.

whatsapp深度使用Erlang有感

- - 系统技术非业余研究
原创文章,转载请注明: 转载自 系统技术非业余研究. whatsapp深度使用Erlang有感. 这么多年过去了,社区还在讨论erlang是不是小众语言,各种怀疑的时候,whatsapp已经把erlang用到了极致. 更为搞笑的是 主要开发者Rick Reed(rr@whatsapp.com),之前在Yahoo!, SGI工作,有着深厚的系统性能的背景.

Erlang进程堆垃圾回收机制

- - CSDN博客推荐文章
原文: Erlang进程堆垃圾回收机制. 作者:http://blog.csdn.net/mycwq. 每个Erlang进程创建之后都会有自己的PCB,栈,私有堆. erlang不知道他创建的进程会用到哪种场合下,所以一开始分配的内存比较小. 如果分配的空间不够了,erlang gc会动态调整堆大小以满足需求,如果分配的空间大了,就会收缩堆,回收内存.

Java 程序的编译,加载 和 执行

- Ben - 弯曲评论
[ 在这个 slides 里边, 莫枢 (Kris Mok) 介绍了 java & java run-time system 的结构. Managed language 提供了更高一级的抽象,提高了程序员的生产力,但是从 application code 到  ISA 的中间层也更厚,比如程序员非常容易把C代码对应到优化后的汇编,但是判断出java 程序对应的汇编就相对难一些.

Java程序的编译,加载与执行

- 高春辉 - 弯曲评论

高性能集群服务器(Erlang解决方案)

- BeerBubble - 淘宝核心系统团队博客
高性能集群服务器(Erlang解决方案) View more presentations from Feng Yu.