程序最美(寻路)

你还在坚持练习你的技术吗?运动员天天训练,音乐家也会演练更难的曲章。你呢?

随笔分类 -  编译原理

另一版本的基于堆栈的虚拟机实现
摘要:另一版本的基于堆栈的虚拟机实现 前面我们对一基于堆栈虚拟机进行了源码剖析《基于栈的虚拟机源码剖析》。之前我们也实现了一个简单的基于堆栈的虚拟机《实现一个堆栈虚拟机》。在《实现一个堆栈虚拟机》中,我们将虚拟机定义为一个VirtualBox类,VirtualBox类中有成员变量:堆栈、指令内存、数据内存,另外还有成员函数:读取指令、执行指令。《基于栈的虚拟机源码剖析》中,是C语言实现的,没有设计成类的形式,但依然有堆栈、指令、数据、读取指令、执行指令等模块。 这里,我们再次实现一个基于堆栈的虚拟机。先给出实现代码,然后再对代码进行解释。// 基于堆栈的虚拟机实现#include #include 阅读全文

posted @ 2013-10-11 00:32 unixfy 阅读(1195) 评论(0) 推荐(0) 编辑

基于栈的虚拟机源码剖析
摘要:基于栈的虚拟机源码剖析 之前我们曾剖析过一个栈虚拟机《栈虚拟机源码剖析》,并实现了一个栈虚拟机《实现一个栈虚拟机》。 本文我们对Kevin Lynx的《基于栈的虚拟机的实现》进行学习,学习其源码实现原理和技巧,其源码地址为:source code。 有关该基于栈的虚拟机说明,可以直接参考原文,我们不在此赘述。这里,我们主要是对源码进行分析学习。 该虚拟机对应两个文件:头文件sm.h和源文件sm.c。 其中,sm.h中定义了虚拟机的指令集(二进制指令集),该指令集为枚举类型:enum op_type{ opHalt, opIn, opOut, opAdd, opSub, opMul, op... 阅读全文

posted @ 2013-10-08 22:25 unixfy 阅读(2245) 评论(0) 推荐(0) 编辑

实现一个反汇编器
摘要:实现一个反汇编器 上文《反汇编器源码剖析》,我们对一反汇编器源码进行了学习,了解了反汇编器的实现原理。反汇编是汇编的逆过程,其也是包含三个主要部分:汇编指令集二进制指令集二进制指令到汇编指令的映射 有了这三部分之后,我们就可以对二进制指令,将其翻译成汇编指令,也就完成了反汇编过程。 我们的二进制指令集和汇编指令集还是沿用之前的指令集。 下面我们先给出实现的反汇编器,然后对相关代码进行解释。// 实现一个反汇编器#include #include #include #include #include using namespace std;enum BinIns;// 二进制指令结构体//... 阅读全文

posted @ 2013-10-08 21:05 unixfy 阅读(2426) 评论(0) 推荐(0) 编辑

反汇编器源码剖析
摘要:反汇编器源码剖析 之前我们有对一汇编器进行源码剖析,详见《汇编器源码剖析》,并且《实现一个汇编器》。本文,我们继续之前的工作,对反汇编器进行源码剖析,之后我们会根据反汇编器的实现原理,实现一个自己版本的反汇编器。本文剖析的反汇编器代码详见:source code。 源码中反汇编器对应的文件为sdasm.c。 sdasm.c文件中包含汇编指令集的定义op_desc,其类型为字符串数组。const char *op_desc[] = { "HALT", "IN", "OUT", "ADD", "SUB&quo 阅读全文

posted @ 2013-10-08 20:50 unixfy 阅读(1650) 评论(0) 推荐(0) 编辑

实现一个汇编器
摘要:实现一个汇编器 上文《汇编器源码剖析》中,我们对一汇编器进行了源码剖析,这里我们仿照其实现一个自己版本的汇编器,90%的东西都是借鉴于上文中的源码。 实现一个汇编器,首先需要定义一个汇编指令集,这里我们还是沿用上文中的汇编指令集。汇编指令与指令之间是一一对应的关系,也就是说是直译的过程。我们的指令集是枚举类型,也是沿用上文源码的指令集。 我们的函数功能是对输入的汇编指令,将其读入,翻译成对应的二进制代码,然后将其输出。 实现汇编器的重点在于理解汇编器的原理,而汇编器的原理就在于定义好汇编指令集、二进制指令集,并且确定好二者之间的映射转换关系。 以上即是汇编器的原理。具体如何定义汇编指令集... 阅读全文

posted @ 2013-10-08 20:44 unixfy 阅读(8994) 评论(1) 推荐(2) 编辑

汇编器源码剖析
摘要:汇编器源码剖析 本文我们对一汇编器源代码进行剖析,了解汇编器实现原理,进而我们根据样例,自己实现一个汇编器。实现自己版本的汇编器放在另一篇中,本文主要是对别人的源码进行剖析。 本文源代码是来自Kevin Lynx的《基于栈的虚拟机的实现》中关于实现一个堆栈虚拟机中附带了汇编器的实现,源码下载地址如下:source code。由于本人对汇编器比较感兴趣,所以对其进行如下剖析。 汇编器主要是一个sasm.c源文件。 其中,一开始定义了一个const char* op_desc[],op_desc是一个数组,其元素类型是const char*,即op_desc是一个字符串数组,其用于存储汇编操作符。 阅读全文

posted @ 2013-10-08 20:22 unixfy 阅读(6017) 评论(0) 推荐(0) 编辑

实现一个堆栈虚拟机
摘要:实现一个堆栈虚拟机 本文我们实现一个基于堆栈的虚拟机,通过前面《简单虚拟机》和《栈虚拟机源码剖析》,对虚拟机结构和原理有了更深的理解和体会。下面我们给出堆栈虚拟机的示意图: 堆栈虚拟机主要包括以上三部分:虚拟机、指令集、外部接口。 其中虚拟机内部构造主要是数据、指令、堆栈三部分,指令对数据进行操作,将数据装载进堆栈中以备运算和处理。 指令集的设计可以参考别人的设计也可以按照自己的理解逐步扩充改进,主要有PUSH、POP、TOP、INPUT、OUTPUT、JMP、JMP_TRUE、JMP_FALSE、JMP_EQUAL、JMP_NOT_EQUAL、JMP_BIGGER、JMP_SMALLE... 阅读全文

posted @ 2013-09-25 00:15 unixfy 阅读(4418) 评论(0) 推荐(0) 编辑

栈虚拟机源码剖析
摘要:栈虚拟机源码剖析 之前我们介绍过一个《简单虚拟机》,该虚拟机是基于寄存器的。 本文我们剖析一个栈虚拟机的源代码。该代码来自于《实现一个脚本引擎》中的《Part VII:虚拟机(The Virtual Machine)》,该栈虚拟机的源代码下载地址为:source code。 虚拟机的实现方式有三种:内存、堆栈、寄存器。 该虚拟机主要包含三部分:一个指令数组、一个字符串表、一个堆栈:成员说明指令数组存储程序所包含的指令字符串表实质上是一个指针数组,代表程序的一个变量或者堆栈中的一个临时变量堆栈有整数组成,指向字符串表,以表示什么字符串在堆栈中(这里使用的是整数,而非字符串类的指针);堆栈还... 阅读全文

posted @ 2013-09-23 22:55 unixfy 阅读(1844) 评论(0) 推荐(0) 编辑

四则运算表达式的语法分析
摘要:四则运算表达式的语法分析 本文参考自vczh的《如何手写语法分析器》。 之前有《语法分析器初步学习——LISP语法分析》也是参考自《如何手写语法分析器》。 通过语法规则表达操作符的优先级。 四则运算表达式的语法为: 1.Term = | “(”Exp”)” 2.Factor = Term ((“*” | “/”) Term)* 3.Exp = Factor ((“+” | “-”) Factor)* 根据语法写代码。这里不对四则运算表达式求值,而是将其转换为等价的Lisp表达式,然后输出。 具体的代码如下:// 四则运算表达式的语法分析——生成LISP表达式#include #include. 阅读全文

posted @ 2013-09-18 23:14 unixfy 阅读(2986) 评论(0) 推荐(0) 编辑

语法分析器初步学习——LISP语法分析
摘要:语法分析器初步学习——LISP语法分析 本文参考自vczh的《如何手写语法分析器》。 LISP的表达式是按照前缀的形式写的,比如(1+2)*(3+4)在LISP中会写成(*(+ 1 2)(+ 3 4)),1 + 2会写成(+ 1 2)。 LISP语言的语法如下形式:1.Operator = “+” | “-” | “*” | “/” 2.Expression = | ”(”Expression”)” | “(”Operator Expression Expression”)” 我们根据以上两条语法规则来写代码:// LISP语法分析器#include #include using names. 阅读全文

posted @ 2013-09-15 21:58 unixfy 阅读(2410) 评论(0) 推荐(0) 编辑

自动机专题
摘要:自动机专题http://zhidao.baidu.com/question/534740975.html这里是针对注释、标识符、实常数的识别,各实现一个有穷状态自动机。其实,可以将注释、标示符、实常数三个有穷状态自动机合并成一个自动机,将三种情况下的状态进行合并,针对每种状态在各种字符的条件下进行相关判断(case…)。即可完成统一的有穷状态自动机的实现。附:豆瓣上关于有穷状态自动机的介绍:http://www.douban.com/note/74804011/http://zh.wikipedia.org/wiki/%E8%87%AA%E5%8A%A8%E6%9C%BA%E7%BC%96%E 阅读全文

posted @ 2013-09-04 15:44 unixfy 阅读(582) 评论(0) 推荐(1) 编辑

简单虚拟机
摘要:简单虚拟机 本文参考自《一个简单的虚拟机》 虚拟机有: 1.内存:大小100字 2.寄存器:指令计数器指令寄存器操作码寄存器内存地址寄存器累加寄存器 3.指令:指令解释01输入02输出03加载数据到累加寄存器04存放累加寄存器数据到内存05加06减07乘08除09转移10小于零转移11等于零转移12终止0000输入结束 比如有以下程序:打印两个数中的较大数行号指令解释000120输入一个数到内存20010121输入一个树到内存21020320加载内存20中的数据到累加寄存器中030621累加寄存器减去内存21的数据041007如果小于0,则转移到内存07050220输出内存20的数据06120 阅读全文

posted @ 2013-08-25 01:56 unixfy 阅读(1637) 评论(0) 推荐(0) 编辑

代数表达式的四则运算
摘要:代数表达式的四则运算 前面我们讨论了四则运算的相关情形,对于给定的中缀表达式,我们对其进行词法分析、中缀转后缀、后缀计算等过程,最终得到中缀表达式的值。 在我们输入的中缀表达式中,我们对于每个操作数都是已知的值,不存在未知量。 而在本文中,我们是重点讨论有关中缀表达式中存在未知量的情形,我们将含有未知量的表达式称作为代数表达式。 比如给定一代数表达式:a+b-c/d*xyz 该表达式中存在5个未知量:a、b、c、d以及xyz。我们的处理过程还是按照以前处理四则运算的情形那样,首先对输入的代数表达式进行词法分析,得到想要的操作符、已知量、未知量等。然后将中缀表达式转换为后缀表达式,最后在进行后缀 阅读全文

posted @ 2013-08-22 01:33 unixfy 阅读(1135) 评论(0) 推荐(0) 编辑

基于词法分析的中缀表达式计算
摘要:基于词法分析的中缀表达式计算 前面我们对中缀表达式的词法处理进行了讲解并给出了程序示例《四则运算的词法分析》,之前我们也对中缀表达式的计算进行了一系列的分析,诸如《检测中缀表达式的合法性》。在之前的中缀表达式的计算中,我们是利用了空白符来间隔操作符和操作数,这属于一种硬分割。 本文我们利用上一篇中对中缀表达式进行词法分析,进而通过中缀表达式转换为后缀表达式,进而计算后缀表达式来实现基于词法分析的中缀表达式计算。 程序的处理过程主要是包括3个部分: 1.对中缀表达式进行词法分析 2.中缀表达式转化为后缀表达式 3.后缀表达式的计算 我们的程序也是按照以上三个步骤进行的,具体的程序如下:// 基于 阅读全文

posted @ 2013-08-16 13:16 unixfy 阅读(605) 评论(0) 推荐(0) 编辑

四则运算的词法分析
摘要:四则运算的词法分析 之前我们处理四则运算的方法有两种,第一种是对输入的格式强制限定运算符两边都有空白符,另一种是我们根据输入的字符串,对其中的运算符进行添加空白符预处理。通过添加空白符进行处理里显然不太规范和方便,真正需要做的应该是我们对输入的四则运算表达式进行词法分析,解析出相应的运算符和操作符,然后在进行中缀转后缀、后缀表达式的计算等过程。 我们的四则运算表达式只包含两种元素:操作符和操作数。 其中,操作符目前限定为+、-、*、/四种,另外还有括号:左括号和右括号。 操作数可以是小数也可以是整数。 操作符和操作数我们将其视为token,其对应的种别码分别为:tokenid+1-2*3/4( 阅读全文

posted @ 2013-08-16 11:02 unixfy 阅读(2199) 评论(0) 推荐(0) 编辑

去注释程序
摘要:去注释程序 C/C++中注释有两种形式: 1./* … */ 2.// … 我们要实现的功能就是讲程序中的注释过滤掉。 我们首先采用一种直接的方法进行过滤,就是顺序扫描整个源代码,检测 /*、*/、// 这些标示,以获取程序的注释。// 程序1:顺序扫描#include #include #include #include using namespace std;void read_prog(const string& file, string& prog){ ifstream fin(file.c_str()); if (!fin) { cerr & comm... 阅读全文

posted @ 2013-08-13 14:05 unixfy 阅读(716) 评论(0) 推荐(0) 编辑

写一个简单的C词法分析器
摘要:写一个简单的C词法分析器 在写本文过程中,我参考了《词法分析器的实现》中的一些内容。这里我们主要讨论写一个C语言的词法分析器。一、关键字首先,C语言中关键字有: auto、break、case、char、const、continue、default、do、double、else、enum、extern、float、for、goto、if、int、long、register、return、short、signed、sizeof、static、struct、switch、typedef、unsigned、union、void、volatile、while等共32个关键字。 二、运算符 C语言中的运 阅读全文

posted @ 2013-08-07 13:19 unixfy 阅读(16046) 评论(0) 推荐(2) 编辑

导航

点击右上角即可分享
微信分享提示