-
目标代码生成与代码优化
2013-12-29 10:49:12java语言由于是半编译半解释的语言,之所以能跨平台是因为在编译的阶段只生成java虚拟机能识别的中间代码,而不是目标代码,再由Java虚拟机来解释成机器码。 目标代码的生成需要获取寄存器的个数和目标代码的生成与机器的硬件环境有关,所以有些语言不能跨平台的原因就在于编译时需要了解机器的寄存器等资源,不同的机器寄存器不同,导致代码需要二次编译。
java语言由于是半编译半解释的语言,之所以能跨平台是因为在编译的阶段只生成java虚拟机能识别的中间代码,而不是目标代码,再由Java虚拟机来解释成机器码。
目标代码的生成需要获取寄存器的个数和使用情况,这里需要用到寄存器选择算法。
为了使目标代码的执行效率更高,需要设置两个数据结构:待用信息,活跃信息。在基本模块之内,记录各个变量的使用情况,然后根据待用信息来确定是否将寄存器的数据替换或者保留。活跃信息是在模块之外确定数据否需要保留或者替换。
代码优化包括:代码外提,删除无用代码,删除公共子表达式等。
代码外提:主要在循环结构中使用,这样能成倍的提高代码的运行效率。
删除公共表达式: 对于相同的三地址代码可以进行合并,删除。
删除无用代码: 对于一些临时变量和没有使用的代码可以进行删除。
程序流图的画法:
DAG图代码优化方法:
-
第九章 目标代码生成(1)
2014-06-18 22:43:21目标代码生成是编译程序的最后一个工作阶段。其任务是把先行阶段所产生的中间代码转换为相应的目标代码。 一般而言,构造一个高效的代码生成程序并不容易,因为代码生成总是与某一具体的目标计算机密切相关,很难...目标代码生成是编译程序的最后一个工作阶段。其任务是把先行阶段所产生的中间代码转换为相应的目标代码。
一般而言,构造一个高效的代码生成程序并不容易,因为代码生成总是与某一具体的目标计算机密切相关,很难找到一种对各编译程序都普遍适用的好的生成算法。然而我们仍应研究这一课题,因为,一个精巧的代码生成程序所产生的目标代码,在执行效率上,要比那些拙劣的代码生成程序所产生的目标代码要高得多。对于一个好的代码生成程序来说,通常我们要求它至少能做到如下两点:第一,使所生成的目标代码尽可能的短。第二,能较充分地发挥目标计算机可用资源的效率,如尽可能地使用执行速度较快的指令;充分利用计算机的寄存器或变址器,以节省访问内存的时间;等等。
1、目标代码的形式
代码生成程序所输出的目标程序可以有如下三种形式:
( 1 )、具有绝对地址的机器语言程序;
( 2 )、可浮动的机器语言程序;
( 3 )、汇编语言形式的程序。
就所需花费的机器时间而言,应当说第一种形式的目标代码最为有效,因为它们在存储空间中有固定的位置,一旦产生出此种形式的目标程序之后,便可直接投入运行。其缺点是不能独立地完成源程序各程序块的编译,即使是供源程序调用的子程序也必须同时进行编译,因而灵活性较差。通常是在程序较短,而调试工作量较大的情况下,采用此种方式。
第二种形式的目标程序由若干个目的模块组成,各个模块中都包含目标程序中的一部分代码,且这些代码可在存储空间进行浮动(即可将它们装入到存储空间的任何位置)。此外,在各目的模块中还含有一些连接信息(如本模块需引用的其它模块中的符号名或子程序入口名)。所以,对于此种形式的目标代码,需经过连接装入程序把它们和所需的运行子程序的目的模块连接起来之后,才能投入运行。这种目标代码结构无疑有较大的灵活性,故为许多编译程序所采用,惟执行连接装入程序本身需耗费一些时间。
第三种形式的目标程序是让代码生成程序产生汇编语言形式的目标程序,比前两种方式容易实现一些,但需在编译完毕之后额外增加一个汇编目标程序的阶段。所以,尽管此种方式有某些优点,但并不是一种最好的方案。
-
哈工大陈鄞配套版本 MOOC 第20讲 代码生成 测验答案
2020-12-26 00:20:46在目标代码生成阶段,符号表用于地址分配。 代码生成阶段由代码生成器完成,需要依赖目标机器的体系结构、指令系统和操作系统。其中存储管理、指令选择、寄存器分配和计算顺序都是代码生成器要考虑的问题。坐标:编译原理,代码生成
-
什么目标程序?
.o文件。 -
什么是目标代码?
目标代码可以是:
1)绝对地址的机器代码(即机器语言程序),
2)也可以是相对地址的机器代码,
3)还可以是汇编代码(即汇编语言程序)。 -
代码生成阶段的工作?
代码生成阶段是编译程序的最后一个阶段,所以是编译程序都有的阶段。在目标代码生成阶段,符号表用于地址分配。
代码生成阶段由代码生成器完成,需要依赖目标机器的体系结构、指令系统和操作系统。其中存储管理、指令选择、寄存器分配和计算顺序都是代码生成器要考虑的问题。
1单选(1分)
在目标代码生成阶段,符号表用于(A )。A.地址分配
B.语义检查
C.语法检查
D.目标代码生成2单选(1分)
经编译得到的目标程序是( C)。A.四元式序列
B.二元式序列
C.机器语言程序或汇编语言程序
D.三元式序列3单选(1分)
(A )不可能是目标代码。A.中间代码
B.可重定位指令代码
C.汇编代码
D.绝对指令代码4判断(1分)
所有编译程序都有目标代码生成阶段。
对5判断(1分)
代码生成器的设计要着重考虑目标代码的质量问题。
对6判断(1分)
目标代码生成时,无需考虑目标计算机的系统结构。
错 -
-
编译原理习题(含答案)——20代码生成——哈工大陈鄞配套版本
2018-06-14 11:57:55代码生成1 在目标代码生成阶段,符号表用于( )。A. 目标代码生成B. 语义检查C. 语法检查D. 地址分配 2 经编译得到的目标程序是( )。A. 机器语言程序或汇编语言程序B. 四元式序列C. 三元式序列D. 二元式序列 3 ( )...代码生成
1 在目标代码生成阶段,符号表用于( )。
A. 目标代码生成
B. 语义检查
C. 语法检查
D. 地址分配
2 经编译得到的目标程序是( )。
A. 机器语言程序或汇编语言程序
B. 四元式序列
C. 三元式序列
D. 二元式序列
3 ( )不可能是目标代码。
A. 中间代码
B. 汇编代码
C. 绝对指令代码
D. 可重定位指令代码
4 以下说法不正确的是( )。
A. 源程序到目标程序的变换是等价变换,即两者结构不同,但语义是一致的
B. 源程序和目标程序是等价关系
C. 目标代码生成时,需要考虑目标计算机的指令系统
D. 窥孔优化是在中间代码层次上进行的优化工作
5 所有编译程序都有目标代码生成阶段。
A. 对
B. 错
6 代码生成器的设计要着重考虑目标代码的质量问题。
A. 对
B. 错
7 目标代码生成时,无需考虑目标计算机的系统结构。
A. 对
B. 错
-
【编译原理】第20讲 代码生成(习题答案)——MOOC哈尔滨工业大学陈鄞
2020-06-03 14:25:25在目标代码生成阶段,符号表用于( )。 A. 目标代码生成 B. 语义检查 C. 语法检查 D. 地址分配 D 2 经编译得到的目标程序是( )。 A. 机器语言程序或汇编语言程序 B. 四... -
【最新合集】编译原理习题(含答案)_20代码生成_MOOC慕课 哈工大 陈鄞
2021-01-30 10:34:171 在目标代码生成阶段,符号表用于( )。 A. 目标代码生成 B. 语义检查 C. 语法检查 D. 地址分配 2 经编译得到的目标程序是( )。 A. 机器语言程序或汇编语言程序 B. 四元式序列 C. 三元式序列 D. 二元式序列 3 ( )不... -
编译器设计-代码生成
2020-06-24 08:48:42通过后代码生成,优化过程可以应用到代码上,但这可以看作是代码生成阶段本身的一部分。编译器生成的代码是一些低级编程语言(例如汇编语言)的目标代码。我们已经看到,用高级语言编写的源代码被转换为低级语言,... -
编译原理之代码生成
2017-12-18 16:13:41目标代码生成阶段的任务是:将此前的中间代码转换成特定机器上的机器语言或汇编语言,这种转换程序便被称为代码生成器。1. 程序移植性和编译器模块设计的关系 之所以将编译原理分成这种多阶段多模块的组织形式,... -
LCC编译器的源程序分析(44)函数名称的代码生成
2019-09-25 00:41:28当把所有的源程序生成DAG表示后,就进入了编译器的最后处理阶段,LCC是把DAG生成汇编的目标代码。在这一阶段,编译器为源程序定义和使用的变量选择存储单元,并把中间指令翻译成完成相同任务的汇编代码指令序列。在... -
代码生成器和模型驱动开发
2012-02-21 14:18:00代码生成器,就是一种根据源模型,源机器到目标机器的转换规则来进行自动寻优设计,生成目标模型的一种工具。 而在每个阶段都只需要解决这个阶段需要关心的问题,而将其他事物完全简化掉,以获得极限的效率。 一... -
ASM---JAVA代码生成
2009-02-19 23:35:00这里要说的ASM,并不是指汇编语言,而是一个操作Java bytecode的框架。对于Java平台而言,bytecode便是它的“汇编语言”,所以,ASM...在起步阶段,Hello World总是一个很好的选择,也就是说,我们生成的目标代码是这样 -
TinyCompiler:基于flex(lex),bison(yacc)和LLVM的c编译器,支持LLVM IR和obj代码生成。基于flex,...
2021-01-31 13:43:59编译生成的目标代码之后可直接编译生成初始化文件,或与其他目标代码链接生成替代文件。 本项目解析的语法与是C语言的一个子集,但部分语法存在区别,这些将在最后的测试用例中具体说明。目前已支持的数据类型包括:... -
计算机系统要素:第十一章 编译器:代码生成
2016-02-21 10:34:00最终来到了编译器部分的最后一个章节——代码生成阶段。本章的目标就是将Jack语言转化为VM语言,完毕Jack编译器的构建。 刚刚接触这章的内容时,会比較难上手。最基本的问题就在于,这章的内容看起来和第十章... -
[转载]LCC编译器的源程序分析(44)函数名称的代码生成
2007-08-22 13:03:00当把所有的源程序生成DAG表示后,就进入了编译器的最后处理阶段,LCC是把DAG生成汇编的目标代码。在这一阶段,编译器为源程序定义和使用的变量选择存储单元,并把中间指令翻译成完成相同任务的汇编代码指令序列。在... -
PointRCNN: 点云的3D目标生成与检测
2020-06-10 19:36:44PointRCNN: 点云的3D目标生成与检测 PointRCNN: 3D Object Proposal Generation and ...整个框架由两个阶段组成:第一阶段用于自下而上的3D方案生成,第二阶段用于在标准坐标系中细化方案以获得最终的 -
自己动手开发编译器(十二)生成托管代码
2012-02-10 08:56:30代码生成的最终目的,是生成能在目标机器上运行的机器码,或者可以和其他库链接在一起的可重定向对象。代码生成,和这一阶段的各个优化手段,统称为编译器的后端。目前大部分编译器,在代码生成时,都倾向于 -
simulink同步发电机模型_VCU/BMS基于模型的开发---自动代码生成
2020-11-26 08:13:41大家好,目前BMS的科普已经告一段落,下一个阶段的小目标是讲解对应的MBD的开发,尤其在VCU/BMS的工程应用领域,如何进行工程应用的开发,逐渐的总结,并汇总成文,逐一给大家讲解,但由于目前本屌丝已经上班,故... -
Linux c 上的目标代码和链接
2011-09-23 09:50:06通常我们建立一个程序的基本步骤如下: ...标志-c表示gcc在编译阶段完成后就停止,即会生成main.o 实例1: #include int odd(int n) { if(1 == n%2) return 1; return 0; } 代码存在e -
编译原理 第八章复习题 符号表
2019-06-19 10:21:48在目标代码生成阶段,符号表用(D)。 A.目标代码生成 B.语义检查 C.语法检查 D.地址分配 在编译处理过程中,符号表只有在词法分析阶段和语法分析阶段才是有用。正确 符号表常用的操作不包括(B)。 A 查询... -
第八章符号表
2019-07-02 19:39:29在目标代码生成阶段,符号表用(D)。 A.目标代码生成 B.语义检查 C.语法检查 D.地址分配 在编译处理过程中,符号表只有在词法分析阶段和语法分析阶段才是有用。正确 符号表常用的操作不包括(B)。 A 查询给定的... -
编译原理第九章
2019-07-02 19:13:02在目标代码生成阶段,符号表用(D)。 A.目标代码生成 B.语义检查 C.语法检查 D.地址分配 在编译处理过程中,符号表只有在词法分析阶段和语法分析阶段才是有用。正确 符号表常用的操作不包括(B)。 A 查询给定的... -
gcc编译源代码的4个阶段
2013-09-12 15:03:38在Linux下进行C语言编程,必然要采用GNU GCC来编译C源代码生成可执行程序。 一、GCC快速入门 Gcc指令的一般格式为:Gcc [选项] 要编译的文件 [选项] [目标文件] 其中,目标文件可缺省,Gcc默认生成可执行的文件... -
c++编译链接阶段的目标文件相关
2020-12-07 17:07:28目标文件是编译器编译了源代码之后生成的文件格式(.O)。目标文件从结构上来说,是已经编译好之后的可执行文件格式,还未经过链接,其中可能有些地址和符号还未调整。 所以说,目标文件和可执行文件的内容和结构很... -
编译原理第八章-符号表
2019-06-13 22:44:381 在目标代码生成阶段,符号表用D A.目标代码生成 B.语义检查 C. 语法检查 D.地址分配 2 在编译处理过程中,符号表只有在词法分析阶段和语法分析阶段才是有用。 正确 3 符号表常用的操作不包括(B )。 ...
-
鸿蒙系统Harmonyos源码架构分析-第1期第2课
-
【ssm项目源码】资料管理平台.zip
-
Magisk-v22.0.apk.zip
-
21、Java中使用switch时有哪些注意事项?
-
Mycat 实现 MySQL的分库分表、读写分离、主从切换
-
速卖通数据分析助手V1.8版(2014.4.9).rar
-
16进制加法
-
C/C++反汇编解密
-
项目经理成长之路
-
450. 删除二叉搜索树中的节点
-
【Python-随到随学】FLask第二周
-
powershell渗透常用命令
-
使用vue搭建微信H5公众号项目
-
项目整体管理过程
-
QGTKJson数据,解析直接可用
-
vs2010冒泡排序法
-
毕业设计管理系统.rar
-
Liunx 优化思路与实操步骤
-
while语句.zip一到一百自然数之和
-
Educoder -Java面向对象 - 封装、继承和多态的综合练习( 第1关:通关任务一)