tiny+指令流(中间代码)设计
来源:互联网 发布:数据噪声是什么意思 编辑:程序博客网 时间:2024/06/05 02:20
最近在做tiny+的大作业,写了个编译器(个人认为更像是解释器),发表下关于这个指令流设计的一些心得。纯属个人心得与设计,与课本无关。
1 指令流的设计:
中间代码,作为执行的最小单元,我们将中间代码作为指令存在,将每条指令输入到向量表中,形成指令流,遍历指令流,也可生成目标代码,最后生成可执行体。directList类就是代表指令流。
结构为:
class directList{
public :
vector<directSet> set;
void add(directSet instruct);//在最后插入
void addAt(int i,directSet direct);//在i处插入
directSet select(int index);//返回第i个的引用
int getSize();//返回当前长度
void print();
directList(){}
~directList(){}
};
操作数 à 指令à 指令流
directList指令流:
directList作为指令流的存储容器,使用了STL标准库中vector容器的数据结构来存储指令(directSet),方便随机访问指令流中的单个指令,可以快速在尾部插入指令。
结构如下:
2 基于堆栈的指令设计原理:
我们结合汇编程序在堆栈中运行的原理,定义了一套伪汇编的指令(中间代码),其原理以X>1为例说明:
指令结果为 :
在语义分析的基础上,先将变量X对应变量表查找到在变量表中的索引,假如X是在int类型的变量表中,并且其位置为index,那么在direct类中的index成员则记录这个索引,并直接将X等同于INTTABLE[INDEX],这就实现了我们所设计的中间代码就是最小的执行单元,就是可直接生成可执行体的目标代码。
PUSH INTTABLE[INDEX] (将X压入栈中)
PUSH 1 (将1压入栈中)
POP T0 (遇到操作符,将1弹出栈,并将其赋值为T0,进入堆中进行运算)
POP T1 (将X弹出栈,并将其赋值为T1,进入堆中进行运算)
COMPL TO TI (这条指令表示比较T1是否大于T0)
PUSH T0 (将运算得到的结果压回栈中)
伪汇编指令的操作码为:
enum OP{ADD,SUB,MUL,DIV,COMPL,COMPLE,COMPS,COMPSE,AND,OR,EQUAL,PUSH,POP,SET_INT,SET_STR,READ,WRITE,MOV,JUMP};其中SET_INT,SET_STR表示建表
在directSet中有定义,DirectSet是指令类,包含操作数,操作码,跳转标识,跳转偏移量等。
Direct是操作数类,在我们所定义的三地址码中,做多只有两个操作数,所以提供了两个接口来将操作数添加到指令中,addone及addtwo。
3 跳转指令设计
将指令分为两种类型,一种是跳转指令,一种是顺序指令,在指令类中有一个枚举类型包含这两种。若为跳转指令,则将其标识为跳转,并计算其相对应的偏移量。以if为例,偏移量记录的则是从else开始到else结束的位置。
4 变量表的设计
设计变量表,将变量存进遍历表,在指令中,所采取的操作就是去表中查找相对应的位置。enum INDEX{INTINDEX=0,STRINDEX=1};表示两种类型的表,int Index;表示表中的索引值。
5 常量的设计
直接将常量引入指令中
如 MOV X,1 将1赋予X
6操作数结构如下:
class direct{ //操作数
public:
T t;//用来计算后放进堆栈,或取出堆栈进行计算的值
INDEX kind;//变量表类型
public :
int Ivalue;//常量
string Svalue;//常量
string IDStr;//变量声明建表时使用
int Index;//索引
int JumAddress;//要跳转的地址
direct();
void printD();
void clear();
};
7指令结构如下:
class directSet{
OP op;//
public:
direct list;//操作数链表
direct next;//下移
TYPE type;
int address;//地址
void addOne(OP op,direct list,TYPE type,int & address);//list
void addTwo(OP op, direct list,direct next,TYPE type, int &address);
void printDS();
void clear();
int offset;
};
8 枚举类型如下:
enum OP{ADD,SUB,MUL,DIV,COMPL,COMPLE,COMPS,COMPSE,AND,OR,EQUAL,PUSH,POP,SET_INT,SET_STR,READ,WRITE,MOV,JUMP};
enum INDEX{INTINDEX=0,STRINDEX=1};
enum TYPE{NUL,SEQ,JUM};
enum T{TN,T0,T1};
- tiny+指令流(中间代码)设计
- Qemu中间代码微指令类型总结
- tiny-spring代码学习(一)
- 栈式虚拟机中间代码编译为x86指令
- 中间代码生成(C++)
- Tiny框架设计原则
- Tiny HTTPd代码总结
- Tiny代码生成框架
- Tiny代码生成框架
- 【编译原理】中间代码(一)
- 【编译原理】中间代码(二)
- TINY框架的设计理念
- Tiny Web服务器代码分析
- Tiny Web服务器代码分析
- C编译器剖析_6.3.1 汇编代码生成_由中间指令产生汇编代码的主要流程
- 中间代码生成
- 调试中间代码
- 寻找中间数(代码)
- C语言处理BMP图片
- 别样的落寞
- 获取移动设备U盘 的盘符以及容量
- 【转载】常用 大数据量、海量数据处理 方法 / 算法总结
- 软件公司如何接项目
- tiny+指令流(中间代码)设计
- 使用dinput鼠标的相对模式达到绝对定位
- 黑客与画家
- 在线安全,在线杀毒,在线可疑文件分析,在线挂马检测
- Ext3和Ext4文件系统磁盘布局
- SQLite数据库简介
- struts下载
- 20110110 About the ejTTS modification
- Java 马士兵 视频 网址