(计算机应用技术专业论文)嵌入式系统c编译器移植研究与实践.pdf_第1页
(计算机应用技术专业论文)嵌入式系统c编译器移植研究与实践.pdf_第2页
(计算机应用技术专业论文)嵌入式系统c编译器移植研究与实践.pdf_第3页
(计算机应用技术专业论文)嵌入式系统c编译器移植研究与实践.pdf_第4页
(计算机应用技术专业论文)嵌入式系统c编译器移植研究与实践.pdf_第5页
已阅读5页,还剩65页未读 继续免费阅读

(计算机应用技术专业论文)嵌入式系统c编译器移植研究与实践.pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要 摘要 随着计算机技术的飞速发展,嵌入式系统在各行各业获得了广泛的应用。 硬件的正常运转不能没有软件支持,由于嵌入式系统本身不具备自举开发能力, 因此拥有好的软件开发平台就显得尤为重要。在嵌入式系统的软件开发平台中, 交叉编译器是工具链中的一个重要的环节。 文章针对自主研制的1 6 位微处理器s r p ,设计并实现交叉c 编译器。 围绕交叉c 编译器的实现方法,文章首先详细分析了g c c 和l c c 两个可重定 向编译器的实现原理及技术细节。综合对比各自的特点及优点,针对宿主机的 特点并结合s r p 系统的结构特点,提出了移植思路,并选择l c c 进行重定向移 植。 文章根据l c c 可重定向编译器的移植要求,重建了s r p 系统相关的m d 文 件,并完成了相关定义和函数的修改,得到针对目标机s r p 的c 编译器。通过 测试,结果表明所选移植方法可行,汇编输出合乎逻辑,达到了重定向l c c 到 s r p 系统的目标,实现了s r p 系统的c 编译器。 关键字:s r p 嵌入式系统交叉编译g c cl c c a b s t r a c t a b s t r a c t w i t ht h er a p i dd e v e l o p m e n to f c o m p u t e rt e c h n 0 1 0 9 y ,e m b e d d e ds y s t e m sh a v e b e e na c q u i r e dm u c hm o r ea p p l i c a t i o nj nv 撕o u sf i e l d s h a r d w a r ec a r m o tr u nw i 出o u t t h e a i do fs o r w a r e ,e m b e d d e ds y s t e m sc a n n o tb ed e v e l o p e db yb o o t s t r a p p i n g , t h e r e f o r eaw e l ld e s i g n e ds o f t w a r ed e v e l o p m e n te n v i r o n m e mf o ri ti si m p o n a n t i n t h ed e v e l o p m e n te n v i r o n m e n t ,t e c h n o l o g yo fc r o s sc o m p i l e ri sp i v o t a l t h i sd i s s e n a t i o na i ma td e s i g na n di m p l e m e n tac r o s sc o m p i l e rf o rs r p a16 b i te m b e d d e dr i s cm i c r o p r o c e s s o li nt h en r s t ,t h ep a p e ra n a l y s e st w or e t a r g e t b l ec c o m p i l e r g c ca n dl c c c o m p a r ew i t ht h ec h a r a c t e r i s t i co fg c ca n dl c c ,a n d r e f e r e n c et ot h es r pa r c h i t e c t u r e ,t h ed i s s e r t a t i o np m p o s e sap r e c e p ta b o u th o wt o i m p l e m e n t a t i o n t h ecc o m p i l e ro fl c ca n dc h o o s el c ca st h eb a s eo f i m p l e m e n t a t i o n t h i sd i s s e r t a i i o nr e f e r t ot h er u l eo fp r o c e s so fl c c ,m a k et h en l em df o rs r p , a 1 1 dr e c o m d o s et h ed e f i n i t i o na n df u n c t i o nw h j c hi si e f e r e n c et os r p i nt h ee n d , a c q u i r et h ei m p l e m e n t a t i o no fs r pc r o s sc o m p i l e r e x p e r i m e m a l r e s u l t ss h o wt h a tt h e m e t h o do fi m p l e m e n ti sc o 玎e c ta n ds u c c e e di ni m p l e m e n t a t i o n k e y w o r d s : s r pe m b e d d e ds y s t e mc r o s sc o m p i j e rg c cl c c i i 南开大学学位论文版权使用授权书 本人完全了解南歼大学关于收集、保存、使用学位论文的规定, 同意如下各项内容:按照学校要求提交学位沦文的印刷本和电子版 本;学校有权保存学位论文的印刷本和电子版,并采用影印、缩印、 扫描、数字化或其它手段保存论文;学校有权提供目录检索以及提供 本学位论文全文或者部分的阅览服务;学校有权按有关规定向国家有 关部门或者机构送交论文的复印件和电子版;在一i 以赢利为目的的前 提下,学校可以适当复制沧文的部分或全部内容用于学术活动。 学位论文作者签名:肄级荐 。呻6 年f 月;。曰 经指导教师同意,本学位论文属于保密,在年解密后适用 本授权书。 指导教师签名:学位论文作者签名: 锣髫 解密时问:年月日 各密级的最长保密年限及书写格式规定如下 内部5 年( 最长5 年,可少于5 年) 秘密l o 年( 最长1 0 年,可少于1 0 年) 机密2 0 年( 最长2 0 年,可少于2 0 年) 南开大学学位论文原创性声明 本人郑重声明:所呈交的学位论文,是本人在导师指导下,进行 研究工作所取得的成果。除文中已经注明引用的内容外,本学位论文 的研究成果不包含任何他人创作的、已公开发表或者没有公开发表的 作品的内容。对本论文所涉及的研究工作做出贡献的其他个人和集 体,均己在文中以明确方式标明。本学位论文原创性声明的法律责任 由本人承担。 学位论文作者签名:绎俺棼 伽6 年r 月弓d 日 第一章绪论 第一章绪论 第一节嵌入式系统及其软件开发平台 嵌入式系统是将先进的计算机技术、半导体技术、电子技术以及具体应用 相结合后的产物,它以应用为中心,以计算机技术为基础,并且软硬件可裁剪, 适用于对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。在 当前数字信息技术和网络技术高速发展的时代,嵌入式系统已经广泛地渗透到 科学研究、工程设计、军事技术以及人们的日常生活当中。随着国内外各种嵌 入式产品的进一步开发和推广,嵌入式系统越来越和人们的生活紧密结合。 和通用计算机系统不同,嵌入式系统是针对具体应用的专用系统,一般具 有成本敏感性,它的硬件和软件都必须高效率地设计,量体裁衣、去除冗余, 力争在同样的硅片面积上实现更高的性能。好的嵌入式系统应该是完成目标功 能的最小系统,而嵌入式处理器的应用软件是实现嵌入式系统功能的关键,对 于嵌入式系统来说,它对软件的要求也和通用计算机有所不同: 1 、软件要求固态化存储 2 、软件代码要求高质量、高可靠性 3 、许多应用要求系统软件具有实时处理能力 由于嵌入式系统对软件有着特殊的要求,而本身又不具备自举开发能力, 因此必须有开发环境和工具的支持才能进行开发,并且对相应的软件开发工具 有更高的要求。 嵌入式系统中的软件开发一般采用主从模式。嵌入式微处理器所在的机器 称为目标机( t a r 2 e t ) ,而进行程序丌发的机器称为宿主机( h o s t ) ,二者通过串口 或网口相连。目标机的处理器功能和存储容量都十分有限,通常用于在硬件测 试时运行程序:宿主机一般是功能强大的p c ,程序的编辑、编译、汇编、链接 和定址等阶段都在宿主机上完成。目标机和宿主机在嵌入式系统开发中的地位 如下图所示: 第一章绪论 图1 l 嵌入式系统开发模式 由于编译器( 汇编器) 在宿主机上工作,但生成目标机上的可执行代码, 因此这种开发模式下的编译器( 汇编器) 被称为交叉编译器( 汇编器) 。交叉编 译器、交叉汇编器和链接器作为嵌入式系统的软件开发工具链,构成了嵌入式 系统的软件开发平台。 第二节项目背景介绍 交叉编译器在嵌入式系统的开发中具有十分重要的作用,只有拥有可以将 标准源程序翻译成目标机汇编代码的编译器,用户才能方便的使用高级语言编 写和调试嵌入式系统所需的各种应用程序。否则,用户只能直接使用目标机汇 编语言来进行程序的开发,这样的开发方式对嵌入式系统的推广十分不利。因 为大部分程序员对汇编语言的使用远不如对高级语言那样得心应手。因此实现 对高级语言的支持,拥有自己的编译器对嵌入式系统来说非常重要。本文也正 是围绕这一需求进行讨论。 s r p ( s c a l a b 】er i s cp r o c e s s o r ) 处理器是我们面向工业控制领域设计的一款 1 6 位嵌入式r j s c 微处理器,具有完全的自主知识版权。规范化的模块化结构使 得s r p 不但可以剪裁为8 位系统或扩展为3 2 位系统,还可以添加或减少系统资 源,如指令系统、系统功能模块、通用或专用i ,o 等。用户可以根据需要在s r p 提供的硬件开发环境中,利用硬件描述语言和e d a 工具来对自己产品的部分专 用硬件和软件进行设计开发,最大限度的缩短产品的研制周期并减少开发费用, 第一章绪论 使产品具有更强的市场竞争力。 为方便用户开发调试,大多数成熟的嵌入式系统都有在宿主机上运行的、 带有图形界面的集成开发环境( 1 n l e g r a t e dd e v e 】o p m e n te n v j m m e n l ) ,简称i d e 。 在i d e 中用户只需点击工具栏上的按钮就可以完成编译、链接等过程,源码级 调试也可用可视化方式进行。编译器、汇编器、链接器等系统程序完成实质工 作,而i d e 则为用户提供友好的图形界面,二者的完美配合大大提高程序的开 发效率。因此,s r p 的开发者也想按照这种结构为s r p 搭建软件开发平台,先 实现出开发工具链中的实用程序,再以i d e 作为程序和程序之间、程序和用户 之间通信的媒介,以此方便s r p 的开发和应用。下图是为s r p 构建软件开发平 台的构想: s r pi d e 用户界面 s r pc 编译器s r p 汇编器 蒜星ll 崔蹬i s 即实时。s 标准库库管理i ” l i b s r p 链接器加载程序 s r p 虚似机系统s r p 目标机执行程序 高速c p u 模拟1m o n i t o r - s r p 环境j 跟踪调试程序 图1 2s r p 的软件开发平台 本文的主要任务便是实现软件开发平台中的编译器。在开始s r p 编译器的 设计时,s r p 的硬件调试已经结束,i d e 集成开发环境中,汇编器和链接器两个 关键环节也已经设计完成并实现,其它调试工具也已经基本完成。由于没有编 译器的支持,系统只能运行汇编程序,这给应用程序的开发带来很大的困难。 因此要针对s r p 系统,以已有的汇编器作为后端,尽快实现s r p 系统的编译器。 第一章绪论 这个编译器可以尽可能简单,只实现对标准c 语言的支持。这样一方面可以使 编译器开发人员快速了解编译器实现的方法,通过一轮摸索,为以后打造更完 美的编译器打下基础;另一方面也可以使嵌入式应用程序开发人员能够用c 语 言进行应用程序的开发,提高开发效率。 第三节本文的研究工作 本文通过以下几个部分讨论s r p 系统c 编译器的设计与实现: 第二章简单介绍了编译系统的结构,交叉编译系统的概念以及目前有哪几 种可重定向的编译器。它们分别是通过什么技术来实现可重定向的。 第三章对g c c 和l c c 两种可重定向编译器进行了比较详细的分析,讨论 其系统结构及实现技术特点。 第四章介绍s r p 嵌入式系统的相关内容,结合这些内容为移植c 编译器做 准备。 第五章具体介绍了以l c c 为基础,s r p 嵌入式系统交叉c 编译器的实现过 程,讨论了在开发过程中的技术难点及注意事项。 第六章是总结与展望,提出目前所实现的系统的不足以及今后改进的方向。 4 第二章编译系统与可重定向编译器 第二章编译系统与可重定向编译器 汇编语言是编写嵌入式系统应用程序的常用语言之一,相较于直接使用机 器代码进行开发,汇编语言可以大大提高编程的速度和准确度。但近几年来, 越来越多的人喜欢使用c 语言来编写嵌入式的应用程序。因为汇编语言也有许 多缺点,比如:编写起来不容易、阅读和理解较难等,而且汇编语言的编写严 格依赖于特定的机器,为一台计算机编写的代码在应用于另一台计算机时必须 完全重写。很明显,发展嵌入式系统的一个重要步骤就是使它能够支持高级语 言编写的程序,对于高级语言编写的程序可由另一个程序翻译为可识别的汇编 代码,这个程序便是嵌入式系统的编译器。 第一节编译系统的体系结构 编译器是把用一种语言( 源语言) 书写的程序翻译成对应的另一种语言( 目标 语言) 书写的程序的软件系统。在这个翻译的过程中,编译器要向用户报告源程 序中存在的错误。一般来说,源程序用是c c + + 这类高级语言书写的,目标程序 是可以在目标机器上执行的可执行程序。 6 】 从源程序到可执行程序包括预处理( p r e p r o c e s s i n g ) 、编译( c o m p i la t i o n ) 、汇编 ( a s s e m b l y ) 和链接( 1 i 1 1 l ( i ”g ) 四个阶段。典型的编译系统处理流程如下图所示: 初始源程序 厂1 矗矗一 源程序 j 二一 塑堡墅 汇编代码 二盎茎 目标机器代码 链接器 机器代码 图2 1 编译器系统处理流程 第二章编译系统与可重定向编译器 其中编译器把源代码转换为汇编代码,包括词法分析( 1 e x i c a la n a l y s i s ) 、语法 分析( p a r s i n g ) 、语义分析( s e m a n t i ca 1 1 a l y s i s ) 、中间代码生成( i n t e m e d i a t ec o d e g e n e r a t i o n ) 、代码优化( c o d eo p t i m i z a t i o n ) 、目标代码生成( c o d eg e n e r a t i o n ) 等几个 阶段。其主要结构如下图: 源代码 图2 2 编译器的组成部分 理论上往往把编译过程中中间代码生成之前的部分称为编译器的前端,中 间代码生成之后的部分称为后端。 前端可以被认为是只依赖于源语言的操作,不同编译器这一部分的功能类 似,目前也有比较成熟的工具,比如l e x 、y a c c 等。因此前端往往可以独立 出来。也正是由于前端具有相对的独立性,针对不同的高级语言可以由不同的 模块进行处理,因而出现了支持多语言的编译器,比如g c c 前端可以接收c 、 c + + 等多种高级语言。前端将接收到的源程序处理之后交由后端生成汇编代码, 针对不同高级语言前端的处理程序是不同的,但用户感觉不到这一点。 第二章编译系统与叨重定向编译器 后端和前端相比,更多的依赖于目标机的体系结构和指令集情况,不同的 目标机拥有不同的汇编语言及指令格式,后端通过对描述这些“特点”的文件 进行分析,并根据前端传来的中间结果,生成相应目标机的汇编代码。前、后 端之间进行沟通的桥梁就是中间语言。 所谓中间语言,并不是传统意义上定义的标准语言,而是指不同的编译器 都有自己的一套标准,前端对源程序分析的结果按照这种标准传递给后端,一 般的编译器很难将这种标准抽象到“语言”的高度,目前只有g c c 做到了这一 点,它实现了寄存器传递语言一r t l 。有了中间语言做媒介,后端接收前端源代 码生成的中间信息,结合目标机的信息,生成目标机的汇编代码。 在编译过程中,优化的问题比较复杂,有些优化是在源程序经过分析之后 就进行的,和目标语言无关,因此被认为是前端优化,这些优化大多是对词法 语法分析产生的结果进行的,目前有一些比较通过的优化算法,不同的编译器 前端都可以使用;但有一些优化是和目标代码相关的,被认为是后端优化,后 端优化往往和目标机的体系结构关系比较紧密,涉及目标机寄存器分配规则等 等,因此优化无法独立的置于前端或后端。优化并不是编译中必须的,实现优 化可以提高程序的执行效率;但不实现优化编译器也可以正常工作。 下图直观的说明了编译器的前端、中间和后端: i j i 端 中间 后端 工 ( 中间代码生成) 、一 图2 3 编泽器的体系结构 既然编译器可以分为相对独立的三部分,前端和中间又与具体的目标机无 关,那么理论上对已有的某个编译器的后端进行修改,针对不同的嵌入式系统 墨三芏塑堡至竺兰里要塞塑塑堡塑 对其进行特殊设定,就可以对编译结果进行控制,得到某个具体目标机的汇编 代码。具有上述功能的编译器就是可重定向的编译器。 第二节可重定向编译器 嵌入式系统的应用程序开发过程和通用计算机系统类似,由源文件变为最 终的可执行文件需要经过编译、汇编和链接等过程。编译器将源文件转换为目 标机器汇编代码,汇编器将汇编代码转换为目标文件,由于一个程序的目标文 件可能有多个,所以还需要链接器将它们链按在一起,形成最终的可执行文件。 所不同的是这过程是在宿主机上完成的,整个过程如下图所示: 图2 4 嵌入式系统中编译、汇编与链接过程 嵌入式系统的编译器在宿主机上生成目标机的汇编代码,这个过程被称做 交叉编译。交叉编译是嵌入式开发过程中的一项重要技术,完成交叉编译,是 通过编译器的重定向来实现的。上一节中已经提到,编译器一般分为前端和后 端。前端的实现技术目前已经比较成熟,也出现了许多自动化工具;而后端构 造采取的方法之一,便是设计可以重定向的编译器后端。 所谓可以重定向的编译器,就是在构造编译器后端时采用一定技术,使该 后端可以很容易地接受“机器描述信息”,“机器描述信息”反应了目标机的体 系结构和指令集情况,在后端接受前端生成的“中间表示”后,将“机器描述 信息”与“中间表示”二者结合起来,产生特定目标机器的汇编语言: 第二章编译系统与可重定向编泽器 厮谪厮蕊 v 竺竺 幽2 5 编译器重定向过程描述 重定向过程中的关键问题是解决“中间表示”到目标机的映射。也就是说, 编译器要读懂特定格式的“机器描述信息”并把“中间表示”结果按照具体目 标机的要求输出成汇编代码。因此,制定一种用户易于书写、编译器易于理解 的机器描述规范是十分必要的。首先编译器要根据标准指令的情况将任何目标 机都可能涉及的一般操作抽象成某种表示形式,这种表示形式必须保证在任何 情况下,面对任何目标机都能够归纳标准操作的指令。向上,它能够和标准语 言的具体命令相对应;向下,它能够和目标机完成该命令的具体指令相对应。 通过这样的一种方式,前端和后端便可以有机结合,实现指定汇编代码的输出, 完成编译器的重定向。 目前,实现了可重定向后端的编译器有g c c 、l c c 和z e p h y r 等,它们有不 同的机器描述规范,用不同的方式实现了中间表示和后端的映射。 g c c 是目前最广泛使用的可重定向编译器。g c c 重定向的核心是中间语言 r t l ( r e g i s t e rt r a l l s f e rl a n g u a g e ) 。r t l 和目标机指令形成映射,对同意义的操 作而言,不同的目标机完成这一操作的指令条数、操作数的形式以及汇编格式 各不相同。g c c 的机器描述文件m a c h i n e m d 中定义了指令样板( t e m d l a t e ) , 用来描述目标机所支持的每一条指令相应的r t l 指令形式和汇编输出格式。指 令样板确定了某种意义的操作到具体目标机对该操作的实现之间的对应关系。 第二章编译系统与司重定向编泽器 依据指令样板生成r t l ,输出汇编指令,实现重定向。 l c c 是p m c e t o n 大学开发的一个a n s ic 的编译器。l c c 中定义了3 6 个“操 作符”( o p e r a t o r ) 来抽象程序的各种操作。它的重定向方法也是对目标机器编写 一个“机器描述”文件,包括规则和函数,完成操作符和目标机汇编语言的语 义对应关系。文件中还有寄存器分配算法,函数调用规则等其它和机器相关的 信息。以此文件作为汇编代码输出的指导,构造出代码生成器,由代码生成器 为相应的目标机生成汇编代码。l c c 的特点是比较简单,重定向工作难度比较 小,但生成的代码质量也相对比较低。 z e p h y r 是美国国家编译器基础设施研究的一部分。它定义了一系列接口抽 象不同目标平台共有的操作。“代码扩展器”( c o d ee x p e n d e r ) 根据不同的目标机的 情况调用这些接口,将中间表示转化为和具体目标机的汇编代码。对不同的目 标机器,z e p h y r 必须手工编写“代码扩展器”,因为一方面各个编译器的中间表 示不同,另方面,不同目标机的特点也必须由“代码扩展器”维护。不过, 编写代码扩展器比针对某个后端重写一个编译程序已经容易很多,所以它所做 的工作是有意义的。z e p h y r 的接口设计存在一些缺陷,比如不包括类型系统, 接口组织比较复杂,不易维护和扩展等。由于关于z e p h y r 编译器使用和构造的 相关资料都比较少,所以本文不做深入讨论。 g c c 和l c c 编译器都是完全的开放的系统,通过对其进行深入分析,剖析 可重定向的技术原理之后。可以以此做为一个尝试的途径,将其重定向到s r p 系统,实现s r p 的交叉c 编译器。下一章将详细介绍g c c 和l c c 的可重定向 实现技术。 第三章编译器重定向技术分析 第三章编译器重定向技术分析 根据前面的分析介绍,要实现s r p 交叉c 编译器,目前有以下几种途径: 1 、自己动手编写一个s r p 的编译器 编译系统是非常复杂的软件,编写者很容易陷入错误和误区中。考虑到编 写编译器所花费的人力物力,很多公司都会放弃独立编写。而源代码开放的编 译器使得错误可以最大限度地减少。作为惯例,一个新的编译系统并不意味着 要从头重写,换句话说,借鉴已有系统是一个捷径。源代码开放的g c c 和l c c 将是非常好的选择。 2 、移植g c c 严格意义上是修改g c c 的机器描述文件,然后用g c c 提供的生成工具生 成新的c 编译器。这样做的好处是编码工作有章可循,而且可以充分利用g c c 提供的一系列优化功能,这些优化对于嵌入式系统来说是非常有益的,它可以 提高程序执行的效率、减少空间的占用。在测试过程中,g c c 提供的测试集也 可以省去编写测试程序的任务。使用这种修改编译器的方法,开发者需要十分 清楚目标机的情况,细致到每个寄存器每一位的具体功能信息,并且要熟悉机 器描述文件的书写格式,对目标机的情况用机器描述文件正确的进行描述。在 描述文件完全正确的前提下,生成的编译器的对错很大程度上就依赖于g c c 了。 据目前情况看,g c c 的编译器生成工具本身也有一些错误,如果错误发生在我 们修改的编译器上,要调试编译器生成工具困难会比较大。 3 、改写移植一个a n s i 的c 编译器 由于我们的目的是要得到一个可以支持标准c 语言的编译器,因而从头改 写一个已经符合a n s i 标准的c 编译器是不错的选择,比如改写l c c 。这样做 的好处是在前端的改动会非常小,因而工作量可能会减少很多。但由于这类编 译器通常都是用c 语言写的,且与编译理论紧密结合,这就需要改写人员精通c 语言和编译原理。虽然这类编译器程序都相对较短( 例如l c c 只有8 0 0 0 行) ,但 是正是由于其代码较短,本身难以实现高度的模块化及层次结构,因此程序逻 辑非常复杂,前后端函数之间耦合紧密,共享数据结构复杂且数量比较多,修 改工作并不会像想象中的那样轻松。 通过上面的分析比较可以看出,完全自己编写一个s r p 的编译器是不明智 第三章编译器重定向技术分析 的,因此我们决定采用移植的方式,以某个现有的编译器作为蓝本,移植到s r p 系统中去。在后续的内容中,将会分别对g c c 和l c c 两个编译器的重定向技 术做详细的分析研究。最终确定采用哪个系统实现s r p 交叉c 编译器。 第一节g c c 编译器重定向技术分析 g c c 是美国自由软件基金会( f r e es o f l w a r ef o u n d a i i o n ) 开发的编译系统, 由于表现优良而倍受程序设计人员们推崇。g c c 表示g n u c o m p j l e r c o j 】e c t j o n , 它包含一系列编译器,这些编译器针对不同语言和不同目标平台,因此g c c 向 上可接收多种语言,向下可支持多种平台,它所接收的语言有c 、c + + 、o b j e c t j v e c 和f o r t r a n 等。g c c 系统用c 语言实现,可优化可移植,高度的优化和可移 植性能是该编译系统最为突出的两大特点,也是技术上的最为成功和精彩的地 方。由于程序设计人员可以彼此共享g n u 有关软件和技术,使得g n u 软件都 较同级的商业软件产品更为稳定可靠、性能指标更高,而且发展极为迅速,每 一个季度就有一个功能更强、品质更优的新版本推出。因此g n u 软件具有很强 的生命力,随着人们对其价值认识的提高,用户也迅速地扩大。由于优化和可 移植性是衡量现代编译系统的主要标准,g c c 当之无愧是当前最优秀的编译器 之。对这样一个优秀的编译器进行分析,可以帮助我们了解可重定向编译器 的设计思想及实现方法,同时也可以帮助我们了解将g c c 重定向到某个目标机 的具体步骤,对实现s r p 的c 编译器有很大帮助。 3 1 1g c c 的系统结构及设计思想 按照传统编译器的划分方法,g c c 编译系统也可以划分为三个部分:与语 言相关的前端;与语言无关、机器相关的后端以及与机器相关的机器描述。 g c c 的前端由词法、语法分析和语义分析部分组成,g c c 在接收到一个新 的高级语言源程序后,首先对它进行上述分析,无论何种高级语言,最后都归 纳为语法树的形式。 g c c 的后端接收前端产生的语法树,将其转换为一种中间语言的表现形 式,在中间语言基础上进行各种优化,结合目标机的具体情况,最终生成目标 机汇编代码。 机器描述部分要描述g c c 所运行的宿主机和目标机的有关情况,并提供给 编译程序的后端使用。下图反应了这三部分之间的关系与作用: 第三章编译器重定向技术分析 关的| j i 端 与目标机相关的后端 幽3 1g c c 的结构 g c c 做了大量工作实现这三个部分的分离,具有很好的模块化,各部分之 间耦合度很低。面对众多不同的系统与体系结构,要想实现支持多平台的编译 程序,必须解决三个根本的问题: 1 、需要设计一种对目标机恰当的描述,这种机器描述既要能描述系统与硬 件的共性,也要能描述它们各自的特性,同时还要适合于编译程序的处理; 2 、需要设计出一种较好中间语言,这种中间语言应当在适当的层次上,向 第三章编译器重定向技术分析 上能支撑多语言的映射,向下能适合多平台转换并且适合于进行各种优化; 3 、在机器描述与编译主体之间需要仔细地设计一种统一接口。 g c c 编译系统的独特设计解决了这三个问题,从而获得了成功。其设计思 想的核心包括三个方面: 1 、目标机描述与定义机制: 2 、r t l 中间代码表示机制; 3 、由目标机的机器描述引导中间代码生成及优化策略; 下面分别详细介绍以上各个方面的内容。 3 1 - 2g c c 的中间语言 g c c 的中问语言称为寄存器传递语言( r e g i s t e r t m s f e rl a l l g u a g e ) ,简称 为r t l 。r t l 中间代码是g c c 的核心数据结构,是g c c 实现高度可移植性的 桥梁。由于它描述了硬件结构中各种寄存器值的相互传送和依赖关系,因此, 编译器能够在其上进行全面而深入的优化,从而达到高度优化的目标。通过r t l , 可以用代数的方式一个一个的描述指令的功能,指令将怎样输出等等。 【2 1 r t l 中间代码的内部数据结构是复杂结构的双向链表,外部e 文表示用来 进行机器描述和调试输出。g c c 将表( 1 i s t l 作为其唯一的逻辑结构( 称为r t x :r t l e x p r e s s i o n ) ,拥有自己的语法和语义。r t l 的语法结构实际上表示的是一种树 结构。利用这种结构,r t l 设计得十分简洁、灵活。 r t l 的语句被称为蹦s n ( i n s t r u c t i o n ) ,用来表达一个完整的动作或含义,其 操作数可以是空指针也可以是r t l 的基本元素n x 。被称为n ) ( 的表达式是r t l 的基本元素,f n s n 也是表示指令的九x 。每个r c x 的内部数据结构与外部语法形 式都是统一的。n x 表达式在形式上也是统一的,但按出现的场合层次可分为四 种: 】、表示指令的r t x 一 处在最上层,r t l 由若干条这样的r f x 指令组成 2 、具有副作用( s i d ee 仃e c t ) 的n x 一构成每条指令中的指令体 3 、表示运算的n x 一一 指令体内部是各种表示运算和初等值的r t x 4 、表示初等值的r t x 基本元素 按其用途分可分为以下几类,每一类用于不同的地方,它们是: 1 、用于构造r t x 的元表达式 第三章编译器重定向技术分析 2 、用于构造指令表的n x 3 、用于机器描述的r t x 4 、用于描述属性的n x , 5 、用于指令链的九x 6 、用于s n 顶层构造的n x 7 、用于描述机器指令行为的n x 8 、用于表达式原始值的n ) 【 9 、用于描述操作动作的r t ) ( 其中第一、二类用作其它表达式的操作数,第三类,第四类用于描述目标 机器;第五类是最外层的n x 单元;第六类,第七类用作者机器描述的操作数; 第八类,第九类作为第六和第七类的操作数。 n x 表达式一般符合如下形式: c o d e :m0 p n lo p n 2 c o d e 是n x 的操作码。它用来指明n x 表示的操作类型。根据操作类型, 后面的操作数个数和各类都会有所不同。 m 表示数据和运行结果的类型,它是数据类型和字长两部分信息的组合。 数据类型主要有整型、浮点类型等。机器字长则分8 位、1 6 位、3 2 位、双6 4 位等。 0 p n 是表达式的操作数。操作数的个数和种类取决于c o d e 操作码。例如 所有表示指令的r t x 的前三个操作数都是整常数,分别表示本条指令编号、前一 条指令编号和后一条指令编号,这样它们相互之间就形成了一条链。这样一个 链式结构往往是源程序中的一个处理单位( 一段代码或是一个函数) ,g c c 中间语 言中每条r t l 语句都实际上表示着目标机的一条指令。这种链式结构十分方便 各种优化处理:川 第三章编译器重定向技术分析 的n x 表达式 的r t x 表达式 图3 2r t l 的链式结构 3 1 3g c c 的机器描述 g c c 的机器描述由两部分组成:m a c h e h 和m a c h i n em d ,对于某个 具体的芯片,这里的m a c h 烈e 替换为该处理机芯片的名字。m a c h i n e h 是一 个头文件,用来描述目标机各种参数定义及宏定义,m a c h i n e m d 是正文件文 件,描述目标机的具体指令。 3 1 3 1m a c h r n e h 文件 宏定义头文件m a c h i n e h 定义目标机相关的各种参数,主要包括以下内 容: 1 、指导编译过程的宏定义。这些宏定义用来指导预处理、编译、汇编、链 接等步骤。 2 、目标机存储器的相关信息。如目标机是8 位寻址还是1 6 位或3 2 位寻 址:数据存储方式是b 晤e n d i a n 还是l i n l e e n d i a l l ;边界对齐约定,如栈的边界、 参数边界、数据边界等对象的边界对齐要求等等。 3 、基本类型数据对象的大小及存储约定。 4 、寄存器的相关信息,寄存器的个数、种类、名称等等。 5 、函数的调用约定以及栈的安排。 6 、有关汇编语言输出的宏定义。 7 、目标机操作系统所支持的目标文件格式和调试输出格式信息。 编译源文件通过群i n c l u d e 包含m a c h i n e m 。g c c 编译程序通过其中的相 关定义合理进行适当的处理。通过这种方式,g c c 编译就含有了与目标机具体 参数相关的代码。 第三章编译器重定向技术分析 3 1 3 2m a c h e m d 文件 m a c h i n e m d 是机器描述文件,其中所有内容均为r t x 表达式。它们包含 目标机指令集相关的内容,在该文件中,要完成标准指令到i 盯l 中间语言的对 应,同时要完成r t l 中间语言到相应汇编代码的对应,其中主要有以下几个方 面: 1 、目标机指令集的相关内容: 指令的分类 指令中的数据类型 指令的长度 2 、指令样板 g c c 抽象了所有目标机都应该支持的标准指令集,指令样板描述了如下对 应关系,即:目标机所应该支持的每条g c c 标准指令相应的i 盯l 指令形式是 怎样的,对于某一条r t l 指令它的汇编输出格式又该是怎样的: 目标机支持的标准指令+ +r t l 指令形式+ +汇编输出格式2 指令样板在g c c 编译过程中两次发生作用,当语法树转换为r t l 中间语言 时和根据r t l 指令格式确定汇编代码的输出格式时。前面介绍r t l 时已指出, r t l 中每一条指令与目标机的指令是相对应的,即有一条r t l 指令则有一条与 之相应的目标机指令。但是,对于同一个标准指令,不同的目标机完成的方式 是不同的,各个目标机所需的指令条数以及具体某条指令的操作数形式都不相 同。于是,g c c 在产生r t l 中间语言时必须有所参照,对于某种运算,可以 依据某种规则知道生成什么样的r t l 指令;在汇编输出时,对于一条给定的r t l 指令,应当生成什么形式的汇编指令。指令样板正是发挥了这样的指导作用: 第三章编译器重定向技术分析 图3 3 指令样板的作_ l j 某个具体目标机的机器描述文件中给出g c c 规定的标准运算所对应的r t l 指令样板。指令样板建立了前端与实际目标机之间的映射关系。r t l 语言的生 成过程中,当需要生成某个标准运算指令的r t l 指令形式时,根据标准运算名 查找机器描述文件,得到相应的r t l 模板。在汇编代码生成过程中,g c c 查看 r t l 指令,如果某条r t l 指令与机器描述中的r t l 模板一致,则按照该样板中 给出的汇编输出模板输出汇编指令。 指令样板也是由许多n x 表达式构成的,指令样板种类及其作用域如下【3 】: 表3 1 瓜指令样板种类 操作码操作数用途 r t l 产生汇编代 d e f i n ei n s n 指令名r t l 模板条件汇编模板任选属性 码输出 d e f i n ee x d a n d 指令名r t l 模扳条件预备语句 r t l 产生 r t l 优化汇编代 d e f i n e - p e e p h o l e指令样板序列条件汇编模板任选属性 码输出 d e f i n es d l i t 指令样板条件新指令样板序列预备语句r t l 优化 d e f i n ea t t r 属性名值表缺省值r t l 优化 第三章编译器重定向技术分析 续表3 1r t x 指令样板种类 操作码操作数用途 d e f i n e a s m a t t r i b 属性集合r t l 优化 u t e d e f i n e d e l a y 属性测试槽口指令序列r t l 优化 d e f i n e f u n c t i o n u 功能部件名相同部件个数并行执行指令 条数属性测试结果就绪时钟周期数功能r t l 优化 n i t 部件占_ l j 时钟周期任选冲突表 专门用于定义指令样板的n x 表达式中,最主要的是d e f i n e i n s n ,d e n n e i n s n 具有若干个操作数,分别为o p n o 一0 p n 4 : 0 p n o 是一个字符串,它可以为空,非空时代表一个指令名。这个指令名可 以是g c c 规定的标准指令名,也可以是开发者任意给定的名字。 0 p n l 是一个不完全的n x 表达式,称为r t l 模板。它表示指令样板中r t l 的指令体。r t l 模板只需列出r t l 指令体中的各种操作以及操作数的位置和操 作数必须满足的条件和限制,并不需要具体的操作数。 0 p n 2 是一个字符串,这个字符串或者为空,或者为c 条件表达式。非空 时,它表示样板有效的条件。 o p n 3 是一个字符串,这一字符串为输出模板。它用来确定与此样板相匹配 的r t l 指令的汇编输出形式。 o p n 4 是一个n ) 【表达式,称为指令属性。它用来给出与这一样板相匹配的指 令的属性。 下面是m i p s m d 文件中的一条指令样板的例子,通过对它进行分析,可以看 到上面所提到的各个操作数所在的位置及其起到的作用: 9 第三章编译器重定向技术分析 【d e n n e - i n s n ”a d d d f 3 ” 操作数og c c 定义的标准指令名 【s e m a l c h 。p 。m d :d f0 “r e g i 8 。p 。瑚d f 一+ 操作数lr t l 模板 【p i u s :d f 【m a t c h - o p e r a n d :d f1 “r e g i s t e p o p e r a l l d ”“f ”】 f m a t c h o p e r a n d :d f2 “r e g i s t e 卜o p e r 锄d ”“f ”】 】 “t a r g e l h a r d f l o a t ” “a d d d t 0 1 啦” 【s e t - a n r “母p e f a d d ”】 s e t - a i t r “m o d e d f ”】 【s e t a n r “l e n g i h 1 ”】 】 一+ 撵鹱耘的条件 - - + 嚣誓嫠蠢一汇编输出格式 - 鸳籀棼池棚 匹配的指令属性 3 、指令样板的补充信息 创建好了指令样板,g c c 便可以根据目标机的相关情况生成相应的汇编代 码了,指令样板的补充信息补充了有关目标机相关优化的内容,比如将一条复 杂r t l 指令分解成多条r t l 指令,进行规范优化,或者将若干条r t l 指令归 并为一条指令等等。 3 1 4 机器描述与后端之间的接口 前面所介绍的机器描述建立了抽象机标准指令、中问语言r t l 、目标机汇 编模板三者之间的联系,它是一个正文文件,需被转换成内部形式,成为g c c 编译器的一部分,这一工作由“g e n 来完成。“g e n 士,是一套专门的转换程序。 它们针对不同的编译处理目的分析机器描述,将正文形式的m d 文件转换成含 有接口所需数据结构与函数的c 文件或h 文件“i n s n ,这些c 源程序与g c c 编译的其它源程序一起才构成了某个机器上运行完整的g c c 编译程序集合。 第三章编译器重定向技术分析 前端输入 汇编代码 图3 ,4g e n + 的作用及处理过程 “g e n ”是实际上是一个m d 文件的编译器,通过构造机器描述文件并利 用g c c 提供的机器描述文件处理程序,我们便可以得到适用于目标机器的g c c 编译器。 3 1 5 小结 g c c 作为g n u 工具链中的编译器,本身的代码量非常庞大,大约有二、三 十万行。不过g c c 文档、代码公开,通过研究分析,我们可以弄清它的前后端 结构,如果选择g c c 进行移植,此时应该能够着手制定相应的移植计划了。 移植g c c 后端的方法,并没有固定的模式。g c c 现存的代码具备对多种体 系结构的支持,使得除非针对新的体系结构编写机器描述,否则多数工作是面 向处理器,也就是统一体系结构的不同处理器实现。例如g c c 自带了对x 8 6 和 a r m 体系结构的支持,那么将g c c 编译器移植到与x 8 6 或a r m 的体系结构 类似的系统上就会相应的比较简单。对于s r p 这种g c c 从未了解的体系结构, 就需要我们完全重新编写机器描述,相对来说比较复杂。 根据上面的介绍,如果我们选择g c c 进行移植,步骤似乎简单明了,首先 构造目标机描述文件m a c h m e h 和m a c h i n e m d 文件;然后将它交给g e n 去 第三章编译器重定向技术分析 处理,目标机的g c c 编译器就出现了。这样的后端移植过程看似清晰,实际上 是一个非常繁琐的过程。因为目前真正针对具体移植过程的指导非常少,g c c 具有很好的局部文档,而各方面的详细文档却比较缺乏,已有的文档比较晦涩 难读也是公认的一个问题。幸好g c c 的注释做的相当出色,通常

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论