
编译原理
文章平均质量分 93
南方铁匠
在深度学习和体系结构熔炉的铁匠
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
编译原理总结
编译原理总结编译原理总结文章目录编译原理总结前言一、编译的过程二、前端1.词法分析2.语法分析2.1 LL分析2.2 LR分析3.语义分析4. 中间代码5. 后端5.1 指令选择5.2 活跃性分析5.3 寄存器分配5.4 数据流分析5.5 静态单赋值总结前言总结编译原理的重点。一、编译的过程编译分为前端和后端。前端包括词法分析,语法分析,语义分析,中间代码生成。后端主要负责对中间代码进行优化,生成目标平台代码,对目标平台代码进行优化等。前端与目标平台基本无关,因此有通用的工具:词法原创 2021-10-10 00:39:27 · 970 阅读 · 0 评论 -
编译原理:代码优化
常用的优化方法删除公共子表达式删除无用代码常量合并代码移动强度削弱删除归纳变量基本块的优化:局部优化技术大部分都是将基本块转为有向无环图(DAG).每个语句s都对应一个内部结点N结点N的标号是s中的运算符;同时还有一个定值变量表被关联到N ,表示s是在此基本块内最晚对表中变量进行定值的语句N的子结点是基本块中在s之前、最后一个对s所使用的运算分量进行定值的语句对应的结点。基于DAG删除无用代码:删除所有没有附加活跃变量(活跃变量是指其值可能会在以后被使用的变量)的根结点(即原创 2021-10-07 22:39:24 · 5106 阅读 · 0 评论 -
LLVM是如何编译指令的
本文将会通过一条指令在LLVM中经过不同阶段的变化,从源程序语言中的语义结构到成为机器二进制码来研究LLVM的工作原理。本文不会介绍LLVM是如何工作的,这需要理解LLVM的设计以及code以及各种细节。输入代码我们从一段C代码开始探险,如下:int foo(int aa, int bb, int cc) { int sum = aa + bb; return sum / cc;}本文将会重点关注除法操作。ClangClang是作为LLVM的前端使用的,负责将C,C++,以及Obj翻译 2021-09-30 18:47:48 · 1088 阅读 · 0 评论 -
汇编:静态变量与RIP
在线看汇编的网站:https://godbolt.org/在class A中定义一个静态变量,然后对其进行操作,我们看看这个静态变量的是怎么被操作的。 #include "stdlib.h"class A{ public: static int test0; static int test1;};int A::test0 = 1;int A::test1 = 1;int main(){ A::test0 = 4; A::test1 =...原创 2020-08-17 22:28:13 · 6658 阅读 · 0 评论 -
编译原理 廖力 第53讲 第61讲
后缀表示相对于四元表达式,节省了空间跳转语句 跳转到L,并不是跳转到L这个符号,而是跳转到L所标志的表达式11 14是回填的表示jump的跳转地址第55讲 习题课以及第八章 运行时数据区的管理栈后进先出,适合过程调用堆则主要用于无序的变量,即不知道什么时候变量声明。系统栈由编译器建立...原创 2018-11-17 17:41:24 · 469 阅读 · 0 评论 -
编译原理 廖力 第62讲 第63讲
正规式->正规文法(自动机)正规文法->正规式(自动机/解方程)根据这表格可以得到确定化后的自动机最小化: 划分法:分成两个子集 带有终结符的子集和不带的0,1无法划分,进行合并LL1分析表 消除左递归,提取最左公因子first集合获得,就不用回溯了,通过字符串就可以找到相应的产生式。follow集合为什么引入呢?因为...原创 2018-11-20 02:38:52 · 255 阅读 · 0 评论 -
编译原理 廖力 第42讲 第52讲
第42讲 LALR分析合并go to表没有什么问题同心项目即栈内的符号相同,而将终结符规约后得到的符号与栈内符号可以规约到同一个产生式。但是这样带来的问题是,以为产生式的不同,而不知道具体使用哪一个进行规约。构造LALR分析表,首先要构造LR1项目集族 要注意的是规约与出错冲突LALR基本已经看不懂了重点:...原创 2018-11-14 01:59:48 · 512 阅读 · 0 评论 -
编译原理 廖力 第14讲 第30讲
预处理:处理空行,注释等词法分析可一行之后,就让语法分析去,而不是全部词法分析完。fortran真是厉害啊。。。。。 位置在201号单元,遇到A1,根据二元式,指明其在符号表中的位置。常量有多个表,对应多个表;但是标识符只有一个表。第16 17 18讲为习题课,没有听。上下文无关文法是语法分析的基础。有限自动机 五元组(状态集...原创 2018-11-06 02:30:57 · 369 阅读 · 0 评论 -
编译原理 廖力 第31讲 第40讲
算符优先表:行与列都是终结符A->aB B->bc 则 a<bA->aBd B->bc 则c>dfirstvt定义< lastvt定义>注意算符优先表是根据产生式进行的 每次规约都包括至少一个终结符在内的内容规范分析是基于句柄的。注意,如果...原创 2018-11-10 02:08:55 · 810 阅读 · 0 评论 -
编译原理 廖力 第8讲 第13讲
构G1文法去掉空串,将s转化为不包含空串的,空串使用s'产生需要注意s->aB不同于s->a+B最左推导的过程就是画树的过程所有叶子节点连接起来就是句型。最左简单短语:主要在规约时使用,规约最左边的简单短语,因为是最左推导出来的。树的规约:规约最左简单短语(句柄)。先从非终结符推出加法,然后推出乘法,这样乘法的优先级更高。...原创 2018-11-02 01:30:21 · 247 阅读 · 0 评论 -
编译原理 廖力 第2讲~第7讲
语义分析往往和语法分析或者中间代码合并。 对不同类型的单词,进行的转换不同。类号说明是标识符的类别,内码就是名字。使用有限自动机根据正则式,判断是否正确。 A 赋值语句,E表达式语句 T代表乘法 推导:根据语法规则(文法规则),得到抽象代码的过程。最右推导的逆过程,即为最左规约。四元式:存放在中间代码表中,如下图所示。...原创 2018-10-30 01:12:24 · 521 阅读 · 0 评论 -
编译原理 代码优化
代码优化:因为抽象语法树中可能包括错误,因此不能在抽象语法树阶段进行优化。函数式的优化:输入一个抽象语法树,输出一个抽象语法树:在循环中,如果E仍在缩小,就持续常量折叠。本来预期是异常,但是优化之后,如果不报异常了,那也是错误的。中间代码优化这个与单纯的语法制导翻译不同,是结合上下文的。...原创 2018-10-22 01:34:29 · 2445 阅读 · 0 评论 -
编译原理 中间代码表示
控制流图在程序分析,程序优化中有重要的作用将抽象层次逐渐降低,有的优化只能在特定的中间表示上才行。三地址码:不绑定特定的指令集,是抽象的类型每个三地址码只完成一条指令,没有复合的情况出现。如何生成三地址码? F*代表0个或者多个F,正则文法,X是函数,可以有多个参数S 函数体:内部可以再调用函数 ...原创 2018-10-20 23:03:31 · 6497 阅读 · 0 评论 -
编译原理 代码生成
一次就生成汇编代码的话,工作量巨大,很多都是靠多次最终才能生成。资源:寄存器:32个数据区:全局变量代码区:汇编 二进制代码堆区:动态分配栈区:函数返回栈式计算机load 将元素从内存中加载到栈顶 栈式计算机因为每条指令的语义都比较简单伪指令:机器读取指令时,就会为这几个变量分配空间,...原创 2018-10-19 01:52:05 · 1834 阅读 · 0 评论 -
编译原理 词法分析
词法分析负责将字符流转为符号流(单词流)注意:空格已经被删掉,因为没有具体的意义,在文末追加eof。词法分析的实现方案: 1. 手工编码 GCC LLVM 2. 词法分析器的生成器 自动生成 手工构造:代码实现:通过状态转移图进行识别,如果识别到了其他字符,如>a,识别到了a,那么需要回滚,即*处。自动生成的方式:输入声明式的规范,经过工具如c...原创 2018-10-09 08:29:02 · 3155 阅读 · 0 评论 -
编译原理 语义分析
语义分析依赖于上下文分析抽象语法树一定是符合语法的,不会存在语法错误,语义分析器会分析语义是否满足。 如果中间代码之后,仍然有问题,只可能是编译器的问题。 D 声明 declaration E 表达式expression涉及到变量声明的类型与使用时,进行计算的另一个元素类型一致。检查变量声明(P,D)以及表达式(E)符号表:...原创 2018-10-18 02:42:40 · 15129 阅读 · 2 评论 -
编译原理 语法制导翻译
pop Bi是将之前识别到的长串弹出。先解析出右部的E1,E2,然后规约出E。a1,a2,a3对应着语义动作 语法制导翻译原理 :当是移进状态时,将栈顶元素弹掉,将其规约出的符号状态,如E入栈.栈中记录了所有的状态,需要注意,将<7,7,1>弹出后,将<E,7,2>压入 ,7变为E,1变为2。<8,8,1&g...原创 2018-10-13 01:10:29 · 1817 阅读 · 0 评论 -
编译原理 语法分析
语法分析负责检查是否符合语法,并转换为语法树。如图所示,根据语法规则,检查记号流是否符合语法,并输出语法树。 上下文无关文法: 针对左边蓝框中的每一条,都对应一条产生式规则。BNF范式:非终结符<> 终结符用下划线标记最左推导:每次总是选择最左侧的符号进行替换语法分析:根据文法G(蓝框)是否能完成...原创 2018-10-12 01:28:55 · 2058 阅读 · 0 评论