`

erlang虚拟机代码执行原理

 
阅读更多
erlang是开源的,很多人都研究过源代码。但是,从erlang代码到c代码,这是个不小的跨度,而且代码也比较复杂。所以这里,我利用一些时间,整理下erlang代码的执行过程,从erlang代码编译过程,到代码执行过程做讲解,然后重点讲下虚拟机执行代码的原理。将本篇文章,献给所有喜欢erlang的人。

erlang代码编译过程

erlang对开发者是友好的,从erlang程序文件编译成能被erlang虚拟机识别的beam文件,在这个编译过程还对开发者暴露中间代码。借助这个中间代码,我们就可以逐步探究erlang代码的执行过程。



这是erlnag的编译过程,当然,最开始和大多数编译器一样,首先会将程序文件转换成语法树,但这个转换对我们来说阅读的意义不大,所以归结于以上3个过程。

1. erlang核心代码
确切的叫法是Core Erlang,使用了类似Haskell 的语法,每个变量都用“Let” 声明。在erlang shell通过以下方式可以获取模块的Core Erlang代码,将会生成test.core文件
c(test, to_core).
实际上core文件可以直接编译成beam文件,如下:
c(test, from_core).

2. erlang汇编码
这个是erlang代码编译成beam前的汇编代码,虽然在erlang打包成beam,以及加载到VM时会进一步优化,但汇编码实际上可以看成erlang代码到c代码的纽带。但理解汇编码而不是很容易,这里要知道erlang VM的设计基于寄存器,其中有两类重要的寄存器,传递参数的x寄存器,和在函数内用作本地变量的y寄存器。在erlang shell通过以下方式可以获取模块的汇编代码,将会生成test.S文件
c(test, to_asm). 或是 c(test, 'S').
当然,S文件也支持编译成beam文件,如下:
c(test, from_asm).


3. erlang BEAM
beam文件是不可阅读的,只是给VM识别,内容包括了代码,原子,导入导出函数,属性,编译信息等数据块。

4.  erlang运行时代码
运行时代码是指模块加载到VM后的代码,erlang对开发者暴露了底层的接口。当模块加载后,在erlang shell下通过以下方式可以获取模块的运行时代码,就会生成test.dis文件
erts_debug:df(test).

这里,细心的同学会发现,通过对比erlang汇编码和运行时代码,发现指令代码是不完全相同的。一方面,erlang会对指令进一步做优化;另外,erlang使用了两种指令集,有限指令集和扩展指令集,在beam文件使用了有限指令集,然后在加载到VM时展开为扩展指令集。有论文说是为了减少Beam的大小,这点我没有做过实质性的探究,我只是觉得有限指令集比较短,更容易阅读被人理解。关于有限指令集和扩展指令集的差别,我在文章最后的拓展阅读做了讨论。


erlang代码从编译到执行过程
前面介绍了erlang代码编译的过程,现在再来说明erlang代码从编译到执行的完整过程。文章erlang版本以R16B02作说明。



这里,erlang代码先被编译成beam,然后加载到VM中,最后再被模拟器所识别和调用。
其中,beam文件的加载过程会将beam的字节码形式的数据转成Threaded code和数据。前面也提到,beam文件的字节码数据包含有代码块,这里是将指令展开,转成Threaded code(线索化代码),每条指令包含了opcode(操作码)和operands(操作数),另外还对operands做修正,比如调用外部函数,这里会找到这个外部函数的导出地址,这样每次代码执行的时候就不用再去函数表查找到这个函数,就可以直接执行代码。

Beam的加载逻辑是在 beam_load.c 完成的,指令集的转换在beam_opcodes.c做了映射,而beam_opcodes.c文件是在编译Erlang源码过程有Perl脚本beam_makeops根据ops.tab生成的。所有有限指令集可以在genop.tab找到。



参考:http://blog.csdn.net/zhangxinrun/article/details/50385143
分享到:
评论

相关推荐

    Erlang高级应用和原理

    而在Erlang中,它的结构更像是一系列的函数、模块和BEAM文件,这些文件由Erlang虚拟机(VM)执行,它提供了抢占式调度的进程、消息传递机制以及如etop这样的监控工具。Erlang的系统由编译器、库、VM、调试器、性能...

    erlang21.0源码

    2. **性能提升**:Erlang虚拟机(BEAM)的优化通常会关注内存管理、垃圾回收算法、并行执行效率等方面,以提升系统的运行速度和资源利用率。 3. **错误修复**:每个新版本都会包含对之前版本中已知问题的修复,确保...

    erlang nif test

    NIFs是Erlang与C交互的重要手段,它允许Erlang代码调用C函数,执行无法或不适合在Erlang虚拟机(VM)上进行的计算任务,比如硬件操作、加密算法或者高性能的数据处理。 创建一个Erlang NIF通常涉及以下几个步骤: ...

    erlang 部分源码

    BEAM是Erlang虚拟机的缩写,它是Erlang程序运行的基础。BEAM虚拟机执行Erlang字节码,提供了垃圾回收、内存管理等功能。在源码中,你可以找到关于字节码解释器、垃圾收集算法的实现。 3. **模块和函数** Erlang...

    Erlang深度分析

    Erlang深度分析所包含的内容非常广泛,涵盖了从Erlang虚拟机的工作原理、性能优化、最佳编程实践,到最新的Erlang版本中新增特性的介绍。Erlang语言因其独特的并发模型、高效的分布式计算能力和灵活的网络编程接口,...

    erlang25.0 windows版本

    1. **性能优化**:新版本通常会对语言性能进行优化,提高代码执行效率。 2. **API更新**:可能对Erlang的内置函数或模块进行增强,提供新的功能或修复已知问题。 3. **兼容性提升**:与先前版本相比,25.0可能增强了...

    inside Erlang VM3

    它运行在Erlang虚拟机(Erlang Virtual Machine, ERTS)之上,ERTS提供了语言的基础执行环境。 #### ERTS的核心优势 - **高性能**:通过轻量级进程模型、高效的内存管理机制和优秀的并行处理能力实现了高性能。 - *...

    Erlang Programming 导读.pdf

    - **Erlang 虚拟机 (Erlang Virtual Machine, VM)**: 类似于 Java 虚拟机 (JVM),Erlang VM 是运行 Erlang 程序的基础环境。在 Windows 或 UNIX 系统上安装 Erlang 后,用户就可以在 Erlang VM 上运行 .beam 文件。 ...

    erlang 20.3

    压缩包内的文件"otp_src_20.3"是OTP 20.3的源代码,包含了Erlang虚拟机、标准库以及OTP框架的所有源文件。开发者可以深入研究这些源码,了解Erlang和OTP的工作原理,甚至定制自己的Erlang环境。 在安装和编译Erlang...

    erlang 16b03 source

    源代码的获取允许开发者深入理解Erlang的内部工作原理,定制自己的版本,或者为开源社区贡献代码。 在otp_src_R16B03压缩包中,你可以期待找到以下关键部分: 1. **erts**:Erlang Run-Time System,这是Erlang VM...

    Erlang程序设计中文版

    7. **Erlang虚拟机(BEAM)**:BEAM是Erlang的运行时环境,它优化了并发执行和内存管理。书中会简要介绍BEAM的工作原理,以及它如何支持Erlang的独特特性和性能。 8. **实际应用案例**:除了理论知识,本书还包含了...

    programming erlang src code

    源码中可能包含BEAM虚拟机的部分实现,帮助我们理解Erlang程序的执行过程。 7. OTP(开放电信平台)框架:OTP提供了许多预定义的行为和库,如gen_server、gen_event等,用于构建可靠的服务。通过源码,我们可以看到...

    erlang 深度分析

    Erlang虚拟机(VM)分析 - **概念**: Erlang VM,也称为BEAM (Bytecode for the Erlang Abstract Machine),是Erlang语言的基础运行环境。 - **特性**: - **轻量级进程**: Erlang VM中的进程非常轻量,每个进程的...

    erlang 程序设计 源码

    5. **BEAM虚拟机**:Erlang运行在BEAM虚拟机上,BEAM提供了高效的内存管理、垃圾回收和并发调度。 6. **OTP(Open Telecom Platform)**:OTP是Erlang的标准库,提供了一系列的设计原则、库和工具,用于构建可靠、...

    Erlang--性能分析工具之eprof

    通过阅读源码,我们可以了解eprof是如何与Erlang虚拟机交互,收集和处理性能数据的。 此外,理解Erlang的垃圾回收机制、进程通信模型以及并发特性对于充分利用eprof进行性能优化至关重要。在实际使用中,我们还需要...

    Erlang程序设计(英文版)

    分布式编程在Erlang中和本地编程一样自然,因为Erlang虚拟机(VM)和Erlang运行时系统(ERTS)被设计为在分布式环境下工作。 Erlang的Mnesia数据库是一个可扩展的、非关系型、事务性数据库,它作为内存中的数据存储...

    谜:Rust中一个简单的Erlang VM实现

    要深入了解这个项目,开发者需要具备Rust基础,了解Erlang虚拟机的工作原理,以及函数式编程的基本概念。通过研究`enigma-master`项目,你可以学习到如何在Rust中实现并发模型,如何解析和执行Erlang字节码,以及...

    rabbitmq - erlang

    3. **内存管理**:Erlang虚拟机(BEAM)具有高效的内存管理,有助于RabbitMQ处理大量短生命周期的消息。 4. **并发处理**:Erlang进程的并发能力使得RabbitMQ能高效地处理来自多个生产者和消费者的并发请求。 5. *...

    erl_nif 扩展erlang的另外一种方法

    erl_nif是Erlang/OTP系统中的一种机制,允许开发者用C语言编写底层代码,然后在Erlang虚拟机(EVM)中直接调用,从而提高性能或实现Erlang无法直接支持的功能。 描述简短地重复了标题中的信息,再次强调erl_nif是...

    OTP进程池应用程序_Erlang_Makefile_下载.zip

    2. `ebin/`:编译后的beam文件将被放置在这里,供Erlang虚拟机加载和运行。 3. `test/`:包含测试用例,可能使用EUnit或CT(Common Test)等测试框架编写。 4. `releases/`:可能包含应用的版本信息和启动脚本。 5. ...

Global site tag (gtag.js) - Google Analytics