编译原理
文章平均质量分 85
collective_lz
技术人员的目标不是拥有多么厉害的技术,而是用技术去促成一个产品的成功
展开
-
编译原理(一)
编译器概述:中间代码生成器:代码优化:词法分析器是语法分析器的子程序,当语法分析器分析完一个词法后,会向词法分析器取下一个记号,继续分析,直到分析结束词法分析器:把构成源程序的字符流翻译成记号流,还完成和用户接口的一些任务。此法分析器,会把源程序的字符,翻译成记号,例如if,for是由字符i,f和f,o,r组成。词法记号及属性如下:原创 2018-01-11 21:44:14 · 340 阅读 · 0 评论 -
编译原理(七)中间代码生成
我们以一个排序来演示中间代码生成语义动作用到的函数mkTable(previous):创建符号表,参数为过程identer(table,name,type,offset):进入符号表,四个参数分别为:表名,参数名称,参数类型,下标addWidth(table,width):增加符号表容量,参数为:哪一个符号表,增加多少容量enterProc(table,name,newtabl原创 2018-01-27 20:03:09 · 3704 阅读 · 0 评论 -
编译原理(六)运行时存储空间的组织和行为2
堆管理计算机内存分层现代计算机都设计成程序员不用关心内存子系统的细节就可以写出正确的程序程序的效率不仅取决于被执行的指令数,还取决于执行每条执行需要多长时间执行一条指令的时间区别非常可观差异源于硬件技术的基本局限:构造不了大容量的告诉存储器数据以块(缓存行、页)为单位在相邻层次之间进行传送数据密集型程序可以从恰当利用内存子系统中特点上面main函数执行的时候会报错,因为当用st原创 2018-01-27 17:58:09 · 322 阅读 · 0 评论 -
编译原理(五)运行时存储空间的组织和行为
过程的活动----过程的一次执行称为过程的一次活动活动记录----过程的活动需要可执行代码和存放所需信息的存储空间,后者称为活动记录影响存储分配策略的语言特征过程能否递归当控制从过程的活动返回时,局部变量的值是否要保留过程能否访问非局部变量过程调用的参数传递方式过程能否作为参数被传递过程能否作为结果值传递存储块能否在程序控制下动态地分配存储块是否必须显式地释放过程概念:过程定义、过原创 2018-01-27 15:13:25 · 1030 阅读 · 0 评论 -
编译原理(十)Java运行系统
动态绑定规则当对象o的一个方法可能被自类重写时,如果编译器不能确定o的运行时类型,那么必须对该方法进行动态绑定将一个java语言的类翻译成c语言的程序段,主要的工作由如下几点(由继承引出的问题暂不考虑)将Java语言中一个类的所有非静态属性构成一个C语言的结构体类型,取类的名字作为结构体类型的名字类的静态属性是该类的所有对象所共有的,应当翻译成C中的全局变量,但是需要改一个名字。J原创 2018-02-02 22:07:37 · 244 阅读 · 0 评论 -
编译原理(九)C语言编译系统
C语言编译系统:两边扫描,有些跳转代码,要等翻译过后,才能知道具体位置,所以要进行第二遍编译:连接器目标模块或目标文件的形式可重定位的目标文件可执行的目标文件共享目标文件----一种特殊的可重定位目标文件----在装入程序或运行程序时,动态地装入到内存并连接(例如,当你引入了包含printf的头文件,当用到printf的时候,会将此文件装入内存,否则不装入,如此原创 2018-02-02 19:41:56 · 2140 阅读 · 0 评论 -
编译原理(四)类型检查2
描述类型系统的语言类型系统主要用来说明编程语言的定型规则,它独立于类型检查算法定义一个类型系统,一种重要的设计目标是存在有效的类型检查算法类型系统的基本概念可用于各类语言,包括函数式语言、命令式语言和并行语言等我们后面讨论用形式方法来描述类型系统类型系统的形式化类型系统是一种逻辑系统 有关自然数的逻辑系统自然数表达式(需要定义它的语法)a+b,3良形公式(逻辑断原创 2018-01-25 19:44:30 · 2089 阅读 · 0 评论 -
编译原理(八)独立于机器的代码优化
代码优化通过程序变换(局部变换和全局变换)来改进程序,称为优化基本块和流图对每个基本块从最后一个语句反向扫描到第一个语句,可以得到下次引用信息,这样就可以制造出引用链,从而通过是否后面还有引用做出相应的编译优化:数据流分析介绍:B1的入口,是开始都为0,出口生成d1,d2,d3,被注销的是d4,d5,d6,d7所以是111 0000对于B2来说,是生成d4,d5,注原创 2018-02-01 20:18:20 · 665 阅读 · 0 评论 -
编译原理(三)类型检查
静态检查中最典型的部分——类型检查:类型系统、类型检查、多态函数、重载忽略其它的静态检查:控制流检查、唯一性检查、关联名字检查上面不能在不该出现continue的地方出现continue。C语言:称&为地址运算符,&a为变量a的地址数组名代表数组第一个元素的地址问题:如果a是一个数组名,那么表达式a和&a的值都是数组a第一个元素的地址,它们的使用原创 2018-01-24 20:52:54 · 5918 阅读 · 0 评论 -
编译原理(二)语法分析器
从软件工程角度看,词法分析和语法分析的分离有如下好处简化设计编译器的效率会改进(词法分析器主要处理字符流)编译器的可移植性加强(例如:向上的箭头,不同的分析器可以用不同的字符,这个只涉及到词法,降低了耦合性)便于编译器前端的模块划分语法分析器对编译器的错误处理做一个概述词法错误,如标识符、关键字或运算符的拼写错误语法错误,如算数表达式的括号不匹配语义错误:如算符作用于不相容的运原创 2018-01-22 21:45:09 · 3115 阅读 · 0 评论 -
一个简单的代码生成器
我们以(a-b)+(a-c)+(a-c)为例说明 在t3=t1+t2这里,因为t1做完运算就不存在了,所以直接把t3放到了R0中。在最后一步,因为d的值出了计算区域还有可能被引用,所以不仅要把d的值放到R0中,还要把d的值放到内存中。原创 2018-01-29 21:13:24 · 2146 阅读 · 0 评论