Erlang代码是运行在Erlang的虚拟机(VM)上的,所谓虚拟,说它是虚拟一台真实的机器,还不如说它是虚拟了一个运行Erlang指令的CPU来得更确切。
Erlang运行在虚拟机上,就好比C语言运行在真实的机器上。
Erlang语言的代码在编译时,也有中间的汇编代码,了解它的汇编指令,可以进一步理解Erlang代码在VM里的运行机制。下面我们就把Erlang的Beam模拟器看作是一个CPU来了解它的运行机制。
为了更容易理解后面介绍的Erlang汇编指令,这里先介绍一下这个“CPU”的相关术语和名称。
寄存器
- R(Registers)通用寄存器:R0~R255,一共有256个通用寄存器,其中R0是最快速的,就像X86架构的CPU一样,可以把R0看作是累加器,也常用于保存返回值。
- IP(instruction pointer)指令指针:存放下次将要执行的指令的指针(reference)。
- CP(continuation pointer):保存返回地址。
- EP (stack pointer) 栈指针:它指向最新进栈的元素。
- HTOP (heap top) 堆顶指针:指向堆顶第一个空白处。
- 消息队列指针:它指向当前被匹配的消息。
- 变量tmpA和tmpB:临时变量,在运算过程中用于保存中间值。
- FR(Float Registers)浮点寄存器:FR0~FR15,一共16个。
- Live:当前正在使用的寄存器数。一些指令执行完后需要进行GC时,就需要用到这个值。
指令参数类型
类型名称 | 说明 |
---|---|
a | 原子 |
c | 立即term,如小整数,空list等 |
d | 一个寄存器/栈位 |
e | 指向export table entry的指针(reference) |
f | 代码标号 |
I(大写i) | 整型立即数,如123 |
j | 跳传标号 |
l(小写L) | 浮点寄存器 |
P | 无符号整数 |
r | 寄存器R0 |
s | 一个立即数/寄存器/栈位 |
t | 一个任意的term,如{ok,[0]} |
x | 一个寄存器,如R1 |
y | 栈位,栈中的一个单元空间 |