3.1 Pcode 、 Pcode 虚拟机及 Pcode 模拟器概述
Pcode 是 TinyC 编译器的中间代码,是本人参考 pascal 编译器的中间代码 pcode 、并结合逆波兰表达式(后缀表达式)的逻辑后,设计出的一种非常简单的、基于栈和符号表的虚拟代码。
Pcode 虚拟机是一个用来运行 Pcode 命令的、假想的机器,它包括:一个代码区(code)、一个指令指针(eip)、一个栈(stack)、一个变量表(var_table)、一个函数表(func_table)以及一个标签表(label_table)。
Pcode 模拟器是本人用 Python 编写的一个解释和运行 Pcode 的程序,它实现了 Pcode 虚拟机的全部要素。
Pcode 的所有命令都是对栈顶及附近的元素进行操作的,如 push/pop 命令分别将元素入栈和出栈,add 命令将栈顶的两个元素取出,相加后再放回栈顶。如:
- x = 1 + 2 * 3;
可以翻译成以下Pcode:
- push 1
- push 2
- push 3
- mul
- add
- pop x
看起来是不是很眼熟,和所谓的逆波兰表达式(后缀表达式)有点相似吧?
- 1 2 3 * +
Pcode 中以分号 ”;” 开始的为注释,以标识符加冒号的为标签(如 “Label:” )。
Pcode 命令一共只有7组,都是非常简单的命令,其中也可以分为系统命令和自定义命令两种,自定义命令其实就是函数调用,是对系统命令的扩充。以下详细介绍 Pcode 的系统命令、各命令执行过程中 Pcode 虚拟机的状态变化、如何创建自定义命令(函数)、以及如何用 Pcode 模拟器运行 Pcode 。