




已阅读5页,还剩62页未读, 继续免费阅读
(计算机应用技术专业论文)嵌入式系统c编译器移植中核心技术与归约规则的研究.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ab s t r a c t t h i s d i s s e r t a ti o n m a i n l y d i s c u s s e s i m p l e m e n t a t i o n o f a c r o s s c c o m p i l e r f o r a 1 6 b i t r i s c a n d h a r v a r d a r c h it e c t u r e m i c r o p r o c e s s o r . n o w a d a y s , t h e u s u a l m e a n s o f im p l e m e n t a t io n o f a c r o s s c o m p i l e r i s c r o s s - tr a n s p l a n t g c c c o m p i l e r , b u t s u c h m e t h o d i s a l s o in a d e q u a t e . t h e p a p e r b r ie fl y i n tr o d u c e s g c c a n d g c c tr a n s p l a n t , a n d p o i n t s o u t t h e l i m it a t i o n s a n d s h o rt c o m i n g s o f t h i s m e t h o d o f t r a n s p l a n t a t i o n , a n d p r e s e n t s a n e w m e t h o d f o r t h e r a p i d c r o s s c o m p i l e r d e v e lo p m e n t . l c c i s a r e t a r g e t a b l e o p e n - s o u r c e s m a l l c c o m p i l e . i t is a r ig h t m e t h o d t o i m p l e m e n t c r o s s c o m p i l e r b a s e d o n l c c . t h i s p a p e r f i r s t a n a l y s e s t h e a r c h it e c t u r e o f l c c , t h e n p r e s e n t s i m p l e m e n t a t i o n o f c r o s s c o m p i l e r tr a n s p l a n t a t i o n b a s e d o n l c c . t h i s p a p e r d i s c u s s e s k e y t e c h n o l o g y o f i m p l e m e n t in d e t a i l , w h i c h i n c l u d e s p r o v i d in g c c r o s s c o m p i l e r a b i a n d g iv i n g d a g r u l e s , a n d b a s e d o n p r a c t i c a l e x p e r i e n c e p u t s f o r w a r d g u i d e l i n e s f o r g i v i n g d a g r u l e s . k e y wo r d s : c r o s s c o m p l i e r a b i b a c k e n d d a g r u l e 南开大学学位论文版权使用授权书 木人完全了 解南开大学关于收集、保存、 使用学位论文的规定, 同意如下各项内容:按照学校要求提交学位论文的印 刷本和电子版 本;学校有权保存学位论文的印刷本和电 子版,并采用影印、缩印、 扫描、 数字化或其它手段保存论文; 学校有权提供目 录检索以 及提供 本学位论文全文或者部分的阅览服务; 学校有权按有关规定向国家有 关部门或者机构送交论文的复印件和电子版; 在不以赢利为日 的的前 提下,学校可以适当复制论文的部分或全部内 容用于学术活动。 学 位 论 文 作 者 签 名 : c p l心 补 夕 年9 月; x 日 经指导教师同意,本学位论文属于保密, 在 本授权书。 年解密后适用 指导教师签名:学位论文作者签名: 解密时间: 年月日 各密级的最长保密年限及书写格式规定如下: 内部5年 ( 最长 5 年,可少于 5 年) 秘密*1 0 年 ( 最长 1 0 年,可少于 1 0 年、 机密*2 0 年 ( 最 长2 0 年,可少于 2 0 年) 南开大学学位论文原创性声明 本人郑重声明: 所呈交的学位论文,是本人在导师指导下,进行 研究工作所取得的成果。 除文中己经注明引用的内容外, 本学位论文 的研究成果不包含任何他人创作的、 己公开发表或者没有公开发表的 作品的内容。对本论文所涉及的研究工作做出贡献的其他个人和集 体, 均己在文中以明确方式标明。 本学位论文原创性声明的法律责任 由本人承担。 学 位 论 文 作 者 签 名 : 改 、 砖 - .呵 年s 月 含 日 第一 章 绪论 第一章 绪论 第一节 嵌入式系统简介 嵌入式系统是以 应用为中心,以计算机技术为基础,并且软硬件可裁剪, 适用于对功能、可靠性、成本、体积、功耗有严格要求的实际应用的专用计算 机系统。它一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户 的应用程序等四个部分组成,用于实现对其他设备的控制、监视或管理等功 能。 嵌入式系统同 通用型计算机系统相比具有以 下特点: 1 .嵌入式系统通常是面向 特定应用的。 嵌入式c p u 与通用型c p u 有很大的 不同,它通常都具有低功耗、体积小、集成度高等特点,能够把通用 c p u中许多由板卡完成的任务集成在芯片内部,从而有利于嵌入式系统 设计趋于小型化,移动能力大大增强,与网络的祸合也更紧密。 2 .嵌入式系统必须量体裁衣、 去除冗余, 力争在同样的硅片面积上实现更 高的性能,这样才能在具体应用中对处理器的选择更具有竞争力。 3 .嵌入式系统和具体应用有机地结合在一起, 它的升级换代也是和具体产 品同步进行, 因此嵌入式系统产品一旦进入市场, 具有较长的生命周期 4 .为了提高 执行速度和系统可靠性, 嵌入式系统中的软件一般都固化在存 储器芯片或单片机本身中,而不是存贮于磁盘等载体中。 5 .嵌入式系统本身通常不具备开发能力。 用户通常是不能直接对嵌入式系 统中运行的程序功能进行修改的, 必须有一套开发工具和环境才能进行 开发。 由于上述特点, 嵌入式系统中的软件开发一般采用主从模式。 嵌入式微处理 器所在的 机 器称为目 标 机 ( t a r g e t ) , 而 进行 程序 开 发的 机 器称 为 宿主 机 ( h o s t ) . 通常目 标机的处理器功能和存储容量都十分有限,其主要任务只是运行嵌入式 系统程序而不包括针对本系统的软件开发工具;宿主机通常构建在功能强大的 通用机环境中,完成代码的编辑、编译、汇编、链接和地址分段等开发工作。 同时由于嵌入式系统自 身具备的这些特点使得它必然种类繁多,而针对一款专 用的系统都需要在宿主机上建立良好的软件工具链和开发环境,使得宿主机上 第 章 绪论 针对专用嵌入式系统的软件工具链和开发环境的开发工作变的非常急迫而且重 要。 第二节 嵌入式系统平台及软件工具链简介 在嵌入式系统软件开发中,使用高级语言进行程序开发是一种发展趋势。由 高级语言源文件变为最终的可执行文件需要经过编译、汇编和链接三个过程。 编译器将用高级语言编写的程序文件编译生成特定的汇编文件,汇编器将汇编 文件转换为某种格式的目 标文件,由于一个程序的目 标文件可能有多个,所以 还需要链接器将它们链接在一起, 形成最终的可执行文件。 这个过程如图1 . 1 所 不 . 图1 . 1编译、汇编与链接过程 由于编译器、 汇编器和链接器在宿主机上工作, 但生成的却是目 标机上的可 执行代码, 这种编译器、汇编器和链接器被称为交叉编译器、交叉汇编器和交 叉链接器。 嵌入式开发过程中另一个重要的步骤是调试编写好嵌入式应用程序。 调试时 第一章 绪论 需要将编译链接好的应用程序装载到在宿主机上运行的虚拟机中。虚拟机模拟 目 标机运行并且根据程序运行提供调试信息,便于程序员快速便捷的开发嵌入 式软件。 由此可见, 交叉编译器、 汇编器、 链接器和虚拟机构成了嵌入式系统的开发 工具链.由于它们都是单独的程序,必须以 命令行方式运行,不是很方便,于 是又需要提供带有图形界面的集成开发环境 ( i n t e g r a t e d d e v e l o p m e n t e n v i r o n m e n t 简称i d e ) 。 在 i d e中用户只需点 击工具栏上的按钮就可以 完成编 译、链接等过程, 源代码级调试也用可视化方式进行。编译器、汇编器、链接 器、虚拟机等系统程序完成实质工作,而i d e则提供用户友好的图形界面。二 者的配合大大提高了程序开发的效率。 目 前我们针对一款自 行设计的1 6 位r i s c 微处理器己 经基本完成了 上述系统 程序的开发。他们的基本结构如图1 .2 所示。 i d e集成开发环境 虚拟机链接器 汇编器编译器 图1 .2嵌入式软件开发平台 第三节 本文研究的主要内 容 本文的研究课题为:针对一款自 行研制的1 6 位r i s c体系结构的微处理器 设计实现相应的交叉c编译器。交叉c编译器就是运行在宿主机上,为目 标机 编译生成目 标代码的 编译程序。本文主要讨论设计实现交叉 c编译器中的核心 技术。 在嵌入式系统的软件开发平台中,交叉编译器是工具链中的一个重要的环 节,它对嵌入式系统开发具有重要意义。嵌入式系统的编程语言通常有汇编语 言,但是汇编语言编写烦琐、阅读困难、代码严格依赖于特定机器,束缚了嵌 入式系统的应用与开发,这就需要交叉编译器的支持,它能够大大提高开发速 第一章 绪论 度降低维护成本。 嵌入式系统发展日新月异,快速开发交叉编译器对于嵌入式系统就至关重 要。重新设计开发一款编译器往往要耗费数年时间,因此移植现有的编译器就 不失为一个快速有效的方法。由于现有的大多数嵌入式的软件都是由c语言编 写的,大多数嵌入式系统开发人员习惯使用的高级语言也是 c语言,所以许多 嵌入式系统都是通过移植现有的 c编译器来实现自己的交叉编译器。 我们也是 通过移植现有的c编译器来实现目 标机的交叉编译器的。本文将对嵌入式系统 交叉c编译器的移植技术进行探讨。 本文首先对通过移植 g c c l2 j 来实现交叉 c编译器进行了研究和探讨。g c c 是目 前一款优秀的开源编译器,它的开发人员做了大量的工作使其移植变得简 单且高度抽象化。 文中简要的分析了g c c的结构和移植方法,总结了通过移植 g c c实现交叉c编译器的优点和缺点。由于g c c移植的高度抽象化使得对其 移植缺少灵活性和可伸缩性,特别是对于新设计的、有独特设计的和自 主设计 的嵌入式系统尤其如此,鉴于此我们并没有选择移植g c c . 本文简要分 析了l c c i l 代码, 详细 讨论了 通过移植l c c 实现c 编译器. l c c 也是一款优秀的开源编译器。 文中分析了l c c的前后端的接口 数据结构和函数, 简要描述了l c c的编译过程。文中详细讨论了针对我们的目 标机设计和实现交 叉c编译器过程中的关键技术。 本文最后给出了 通过移植l c c实现交叉c编译 器的实践结果和经验终结。 第四节 本文的结构 本文通过以 下几个部分讨论针对一款1 6 为r i s c的微处理器的交叉c编译 器的设计与实现: 第二章简单介绍了 编译系统的基本概念原理和基本结构,交叉编译系统的 概念。 第三章简要分析 g c c的移植技术和优缺点。详细介绍 l c c的结构和移植 手段。 第四章介绍具体移植的工作。主要讨论交叉 c编译器的设计,以 及移植过 程中的关键技术,包括函数栈帧的实现和归约规则的制定,最后讨论了移植的 交叉c编译器的测试。 第五章总结了 我们的移植工作, 介绍移植的交叉 c编译器还存在的问题, 提出了一些改进方法。 第_ 二 章 编译的基本概念 第二章 编译程序的基本概念 在计算机上执行高级语言程序一般要分为两步:第一步,用一个编译程序 把高级语言编译成机器语言 ;第二步, 运行所得的机器语言程序求得计算结果。 通常将源语言如f o r t r a n , p a s c a l , c这样的高级语言转换成逻辑上等价的诸 如汇编或机器语言的 程序就被称为编译程序4 1 根据不同用途和侧重,编译程序还可以 进一步分类。专门用于帮助程序开 发 和 调 试的 编 译 程 序 被称 为 诊 断 编 译 程 序( d ia g n o s t i c c o m p i le r ) 17 1着重 于 提 高目 标 代码效率的 编译程序叫 优化编译 程序 ( o p t i m i z i n g c o m p i l e r ) .目 前很多 编译程序同时提供了调试、优化等多种功能,用户可以通过一些 “ 开关”进行 选择。运行编译程序的计算机被称为宿主机,运行编译程序所生成的应用程序 的计算机系统叫目 标机。如果一个编译程序产生不同于宿主机的机器代码,则 称之为 交叉编 译 器( c r o s s c o m p i l e r ) , 本文 主 要讨论的即为 此类编译器。 如果不 需要重新编写编译程序中与机器无关的部分就能改变目 标机,则称该编译程序 为 可变目 标编 译 程序 ( r e t a r g e t a b l e c o m p i l e r ) . 本文 提到的g c c , l c c都属于 此类。 第一节 编译过程简介 编译过程是一个复杂的 过程,编译程序也是一个复杂的程序。 在翻译过程 中,一般可以划分为五个阶段:词法分析、语法分析、语义分析与中间代码产 生及优化、目 标代码产生4 1 第一阶段,词法分析。词法分析的任务是:输入源程序,对组成源程序的 字符串进行扫描和分解,识别出其中的单词 ( 亦称单词符号或简称符号) ,如基 本字 ( if , e l s e , f o r , w h i l e 等) ,标识符、常数、算符和界符 ( 标点符号、左右 符号等等) 。单词符号是语言的基础组成部分,是理解和编写程序的基本要素。 在词法分析阶段,依循语言的词法规则识别出各种字符串。描述词法规则的有 效工具是正规式和有限自 动机。 第二阶段,语法分析。语法分析的任务是:在词法分析的基础上,根据语 言的语法规则, 把单词符号串 构成各类语法单位, 如“ 短句” 、 “ 子句” 、 “ 句子气 “ 程序段” 和 “ 程序”等。通过语法分析,确定整个输入串是否构成语法上正 确的“ 程序” 。语法分析所依循的是语言的语法规则。语法规则通常用上下文无 关文法描述。词法分析是一种线性分析,而语法分析是一种层次结构分析。 第三阶段,语义分析与中间代码产生。这一阶段的任务是:对语法分析所 第章 编译的基本概念 识别出的各类语法范畴,分析其含义,并进行初步翻译 ( 产生中间代码) 。这一 阶段通常包括两个方面的工作。首先,对每种语法范畴进行静态语义检查,例 如,变量是否定义、类型是否正确等等。如果语义正确,则进行另一方面工作, 即进行中间代码的翻译。这一阶段所依循的是语言的语义规则。通常使用属性 文法描述语义规则。 “ 翻译”仅仅在这里才开始涉及到。所谓 “ 中间代码”是一 种含义明确、便于处理的记号系统,它通常独立于具体的硬件。这种记号系统 或者与现代计算机指令形式有某种程度的接近,或者能够比 较容易地变换成现 代计算机的机器指令。一般而言,中间代码是一种独立于硬件的记号系统。 第四阶段, 优化。优化的 任务是在对于前面产生的中间代码进行加工变换, 以期在最后阶段产生更为高效 ( 节省时间和空间)的目 标代码。优化的主要方 面有:公共子表达式的提取、 循环优化、删除无用代码等等。在目 前的编译技 术中, 优化己 经成为一个重要的课题,是编译器优劣的重要指标。大量优秀的 优化技术己经在很多商用编译器中运用。 第五阶段,目 标代码生成。这一阶段的任务是:把中间 代码 ( 或经优化处 理后) 变换成特定机器上的低级语言代码。这阶段实现了最后的翻译,它的工 作有赖于硬件系统结构和机器指令含义。这阶段工作非常复杂,涉及到硬件系 统功能部件的运用,机器指令的选择,各种数据类型变量的存储空间分配,以 及寄存器和后备寄存器的调度, 等等。如何产生出足以充分发挥硬件效率的目 标代码是一件不容易的事情。 目 标代码的形式可以是绝对指令代码或可重定位的指令代码或汇编指令代 码。如果目 标代码是绝对指令代码,则这种目 标代码可以立即执行。如果目 标 代码是汇编指令代码,则需汇编器汇编之后才能运行。必须指出,现代多数实 用编译程序所产生的目 标代码都是一种可重定位的指令代码。这种目 标代码在 运行前必须借助一个链接装配程序把各个目标模块 ( 包括系统提供的库模板) 链接在一起,确定程序变量 ( 或常数) 在主存中的位置, 装入内 存中 指定的起 始地址, 使之成为一个可以 运 行的 绝对指令代码程序4 1 第二节 编译器的结构 编译过程的五个阶段是一种典型的分法。编译程序的结构可以 按照这五阶 段的任务分模块进行设计。图2 . 1 给出了编译程序典型的总体框架。 第_章 编译的基本概念 图2 . 1编译器系统处理流程 如图2 . 1 所示, 在编译器中除了完成上述五个阶段任务的五大模块之外还有 表格管理和错误处理两大模块。 编译程序在工作过程中需要保持一系列的表格,以登记源程序的各类信息 和编译各阶段的进展状况。合理地设计和使用表格是编译程序构造的一个重要 问 题。 在编译器的各种表格中, 最重要的是符号表。 它用来登记源程序中出现 的每个名字以及名字的各个属性。编译过程中,当扫描识别出一个名字后,把 该名字添加到符号表中。但这时不能完全确定名字的属性,它的各种属性要在 后续阶段才能填入,编译的各个阶段都要涉及到构造、查找或更新有关的表格。 编译器不仅应能对书写正确的程序进行翻译,而且应能对出现在源程序中 的错误进行处理。如果源程序有错误,编译器应能发现并且把有关错误信息报 告给用户。这部分工作就是由 错误处理模块来完成。编译过程的每个阶段都可 能检测出错误。其中,绝大多数错误可以在编译的前三阶段检测出来。源程序 中的错误通常分为语法错误和语义错误两大类。语法错误是指源程序中不符合 语法或词法规则的错误,它们可以在词法分析和语法分析中检测出来。语义错 误是指程序中不符合语义规则的错误。这些错误在语义分析中检测出来,但有 些语义错误要在运行时才能检测出来。 在概念上,我们往往把编译程序又划分为编译前端和编译后端。前端主要 由与源语言有关但与目标机无关的那些部分组成。这些部分包括词法分析、语 第二章 编译的基本概念 法分析、语义分析与中间代码生成,有时代码优化工作也有一部分在前端进行。 后端包括编译程序中与目 标机有关的那些部分, 如与目 标机相关的代码优化部 分已及目标代码生成等。 通常来说,前端可以 被认为是只依赖于源语言。各种不同编译器的这部分 的功能都类似。由于前端可以根据一些自动机和文法来确定,目前已经有一些 成熟前端自动生成工具,如l e x , y a c c等。正是由于前端具有相对的独立性, 许多编译器可以针对不同的高级语言由不同的模块进行处理,生成相同的中间 代码。比 如g c c的前 端就 可以 接收c , c + + , j a v a 等多 种高 级语言。 前端将接 收到的各种源语言的程序处理之后生成相同格式的中间代码,然后交由后端生 成相应的汇编代码。针对不同高级语言前端的处理程序是不同的,但用户感觉 不到这一点。 后端和前端相比, 更多的依赖于目 标机的体系结构和指令集特性。根据前 端传来的中间代码,不同的后端会生成不同的目 标代码。当然与前端类似,一 个编译器也可以拥有多个后端。用户在使用编译器时设置一些编译选项即可挑 选自己所需的后端来生成相应的目 标机代码。如果选择的后端与宿主机的后端 不同, 那么这就是了 我们通常所说的交叉编译器 ( c r o s s c o m p i l e r ) 。 如果编译器 设计的非常好,代码抽象程度非常高,不需要重新编写编译器中与机器无关的 部 分就能 实 现新的目 标 机 后 端, 则 称该 编译 器为 可 变目 标 编 译 器 7 l ( r e t a r g e t a b l e c o m p i l e r ) 。前、后端之间 进行沟通的 桥梁就是中间 语言。图2 .2展示了典型编 译器前端、后端和中间语言的关系。 第二章 编译的基本概念 翌 臀 其他 源 语 言 前 端 c+十 语 言 的前端 c语 言 的 前 端 x8 6 的 后 端 其他 目标 机 的后端 h 幻 ps 的 后 端 图2 .2典型的编译器前端、后端和中 间语言的关系 所谓中间语言,不同的 编译器大多都会根据本编译器的特点设计一套自己 的中间语言标准。前端对源程序分析的结果按照标准生成相应的中间语言,然 后传递给后端。制定中间语言的标准是一件非常困难的事情,因为一个优秀的 中间语言需要表达多种前端能够表达的语义, 还要便于各种后端理解语义然后 翻译成目标语言,同时,它还需要附加许多额外的信息便于各种优化算法的优 化。可以说在一个编译器的实现过程中,设计一个优秀的中间语言至关重要, 它直接影响到编译器的复杂程度和编译效率。g c c在中间语言的制定上做的非 常优秀,它的中间语言为一种名叫寄存器传递语言一r t l的语言,该中间语言 能够表达十几种前端语言,同时能够提供目 前几乎所有优化技术所需的附加信 息, 还做到了后端的高度抽象化, 做到了可重定向 ( r e t a r g e t a b l e ) ,但是 g c c 也为此在代码量和结构复杂性上付出了巨大的代价。 在编译过程中,优化的问题比较复杂。有些优化在前端即完成了,例如循 环优化等等,因此被认为是前端优化。这些优化大多是对词法语法分析产生的 结果进行的,目前这类优化算法非常成熟,基本上所有的编译器前端都支持。 另一些优化是和目 标机相关的,它必须在后端进行,被认为是后端优化。后端 优化通常与目标机的体系结构和指令集特点紧密相关,如寄存器的调度、特殊 指令的选取等等。还有一些优化是根据语义进行的优化,通常是生成中间代码 后,使用相应的优化算法根据中间代码提供的额外信息进行的优化,这类不能 一t 0- 第二 章 编译的基本概念 简单的归于前端或后端,这类优化不是所有编译器都能够提供的,必须有中间 代码的支持才可。图2 .3 说明了典型编译器中的代码优化。 图2 .3典型的代码优化 前文中 提到的 代码优化器其实是指对中间代码的 优化模块,它还不足以概 括编译器中所有的优化内容。 第三节 典型的c编译器简介 前面简要介绍了编译器原理及其基本构造,下面将简要介绍目 前几款常用 的c编译器及其采用的 技术。 2 .3 . 1 g c c简介e3 g c c 2 1 是 美国自 由 软 件基金会 任 r e e s o ft w a r e f o u n d a t i o n ) 开发的编译系统, 由 于 表现优良 而倍 受程序 设计人员 们推崇。 g c c 表示g n u c o m p i l e r c o l l e c ti o n . 它包含一系列编译器, 这些编译器针对不同语言和不同目 标平台,因此g c c向 上可接收多种语言, 向 下可支持多种平台, 它所接收的 语言有c . c + + , o b j e c t iv e - c 和f o r t r a n等。 g c c系统用c 语言实现, 高度的 优化和可移植性是该编译系 第二章 编译的基本概念 统最为突出的两大特点,也是技术上的最为成功和精彩的地方。由于程序设计 人员可以彼此共享g n u有关软件和技术, 使得g n l 软件都较同级的商业软件 产品更为稳定可靠、性能指标更高,而且发展极为迅速,每一个季度就有一个 功能更强、品质更优的新版本推出。因此g n u软件具有很强的生命力,随着人 们对其价值认识的提高,用户也迅速地扩大。由 于优化和可移植性是衡量现代 编译系统的主要标准, g c c当之无愧是当前最优秀的编译器之一。目 前g c c的 最新稳定版本号是4 . 1 1 . 由于g c c能够交叉编译c程序, 以 及它在代码优化方面的杰出表现和高度 的可移植性,g c c成为了 我们移植c编译器的重要选择,下文中将会对它进一 步分析。 2 3 . 2 l c c简介 l c c 1 1 是一 个可重定向 的a n s i c 编译器, 最初由p r in c e t o n 大学两位老师开 发,仅定位于针对c语言的一个子集的编译器, 作为编译原理的教学、学习使 用,后来演化成了 适于实用的a n s i c编译器,由 于其不凡的性能,开始推广, 成为一个比较流行的c编译器。 l c c比大多数其它a n s i c编译器更小、 更快。 l c c 以产生好的 本地代码为设计目 标,能够生成相当高效的目 标代码,但其它 编译器所具有的全局优化并不在l c c的设计目 标之中。 作为可重定向的编译器, l c c做到了 可以 根据目 标机器的约定产生调用代 码序列,为了实现这一点, l c c也将程序分为与目 标无关的前端及与目 标相关 的后端,前端与后端通过共享数据及接口 进行信息交互,但是由于l c c的代码 只有将近两万行, l c c不可能如 g c c那样做到如此高度的抽象化。但是正是 l c c的代码量相对较少并且结构相对简单使它也成为了我们编译器移植工作的 重要选择,下文中将会详细分析l c c的结构和移植技术。 2 3 . 3 t u r b o c简介 t u r b o c是美国b o r l a n d 公司的产品, b o r l a n d 公司是一家专门从事软件开发、 研制的公司。 该公司在1 9 8 7 年首次推出t u r b o c 1 .0 产品, 其中使用了集成开发 环境,即使用了一系列下拉式菜单,将文本编辑、程序编译、连接以及程序运 行一体化,大大方便了 程序的开发。1 9 8 8 年, b o r l a n d公司又推出t u r b o c 1 .5 版本, 增加了图形库和文本窗口函数库等, 而t u r b o c 2 .0 则是该公司1 9 8 9 年出 第 乙 章 编译的基本概念 版的。 t u r b o c 2 . 0 在原 来集成 开发环境的 基础上 增加了 查 错功能, 并 可以 在t 吻 模式下直接生成.c o m ( 数据、代码、堆栈处在同一 6 4 k 内存中)文件。还可 对数学协处理器 ( 支持8 0 8 7 / 8 0 2 8 7 / 8 0 3 8 7 等) 进行仿真。 t u r b o c系列c编译器也得到了广泛的应用, 而且由于它是商业软件, 其配 套的库文件非常的齐全,集成开发环境也很优秀,但同样因为它是商业软件, 我们不能通过修改它的源代码来移植 c编译器。在此对其就不进行进一步介绍 了。 我们初步分析了 现在几款常用的c编译器,由于g c c和l c c的开源代码 和优秀的性能,最后我们认为这两款编译器将是我们移植工作主要的借鉴对象。 第三章 g c c与l c c的分析 第三章 g c c与l c c编译技术分析 如前一章所述,编译器是非常复杂的系统软件,编写者很容易陷入错误和 误区之中。考虑到编写编译器所花费的人力物力巨大,而移植一个开源代码编 译器可以使得开发的工作量大大减少,同时由于开源代码编译器经过互联网上 用户的广泛使用和测试,还可以相当程度上地减少编译器隐含的错误。所以我 们选择了通过移植一个开源代码编译器来实现我们的交叉 c编译器。g c c和 l c c是两款优秀的开源代码编译器。为了实现我们的交叉c编译器,我们对它 们的整体结构和移植技术进行了比较系统的分析。 第一节 g c c编译技术分析 3 . 1 . 1 g c c的结构 g c c 12 1 作为 一个 可重定向 的编译器( r e t a r g e t a b l e c o m p i l e r ) ,实际 上是一 个 编译器快速开发平台。它不仅包括了 编译器的前端,和一些标准的后端。而且 对于一种新型体系结构的特定指令系统和硬件资源,它提供给设计人员一个配 置接口,使他们能够方便地定义和描述这种机器地体系结构,并根据这种描述 自 动生成面向该机器体系结构的编译器后端,包括代码生成器和优化器。 g c c的与其他编译器类似,前端 ( fr o n t e n d )包括:词法分析和语法分析、 创建符号表、语义分析,生成中间代码。同时前端也进行一部分代码优化 ( 高 层优化) ,和出 错处理。前端主要依赖于源语言,与目 标机体系结构无关。 通过 分析我们了解到, 在g c c中不仅有a n s i c的前端还包括其他十几种高级语言 的前端。 g c c中也包含许多类型的目标机后端,使用者可以通过设定一些编译参数 来选择特定的 后 端。 它的 后端 ( b a c k e n d ) 通常 包 括1 1 2 1 : 代 码优化部分、 代码 选 择、代码生成、寄存器分配、必要的出错处理,以及符号表操作。一般来说, 这些部分独立于源语言,而仅仅依赖于中间表示和目 标机器。 g c c与其他编译器的不同之处在于它规定了自己的中间语言,该语言被称 为寄 存器 传 输 语 言 12 1 ( r e g is t e r t r a n s f e r l a n g u a g e ) , 这 种 语 言的 语句通常 被称 为r t k 表达式, 前端分析的结果就是一个r t x 表达式的双向链表。我们还可以通过一个 被称为机器描述文件的程序来定制后端。g c c自 带的编译器生成工具可以根据 第三章 g c c与 l c c的分析 这些机器 描述 文件生 成一个符合特定目 标机 特性的 后端1 1 2 1 图3 . 1 为我们展示了g c c的具体结构和机器描述文件的作用。 图3 . 1机器描述文件在g c c中的作用 3 . 1 . 2 g c c的移植技术的简单介绍 g c c提供许多编译器的自 动生成工具,我们可以利用它们来自 动生成编译 器的各种部件。利用词法分析器的生成器 ( 例如, l e x工具) ,可以为正则表达 式生成词法分析器; 利用语法分析器的生成器 ( 例如, y a c c工具) , 可以为上 下文无关的文法生成归约语法分析器;利用语法制导的翻译引擎,可以生成周 游和操作 语 法 树的 模 块; 利 用 代码产 生 器的 生 成 器 2 1 ( c o d e g e n e r a t o r g e n e r a t o r 简称c g g ) ,可以为目 标机生成代码生成器 ( c g) . g c c主 要是 面向 具体 机器结构来 生成编译器y18 1 , 它具 有以 下一些 特点和功 能: 1 、 能够提供给设计人员一个清晰方便的硬件资源和指令系统描述接口。 第三章 g c c与l c c的分析 描述包括: 1 )对处理器的指令系统, 包括指令集和寻址方式等的描述。 2 )对寄存器和存储的描述。 3 ) 对各种数据格式的描述。 4 ) 对寄存器使用和函数调用给出编译器约定。如规定参数传递方法, 过程调用时栈的操作等。 5 ) 对于不能直接对应目 标机指令的中间表示操作符,给出实现该操作 的方法。 6 ) 对处理器的其他体系结构特性, 如流水线, c a c h e等的描述。 利用 这些信息可以进行底层的调度和优化。 2 , g c c能够利用这些资源描述来自 动构造一个代码产生器c g和代码优 化器。 如果要想通过移植g c c来实现我们的交叉c编译器, 那么我们不需要重新 编写前端,可以直接使用g c c提供的a n s i c的前端。我们只需要重新编写后 端的机器描述文件,然后使用g c c提供的后端生成器自 动生成后端即可。按照 下面的 步骤就可以完成我们的 移植工作19 1 . l 、 实现目 标机模型 在g c c中, 有 三个文件用来描 述目 标机, 分别是t a r g e t m d , t a r g e t h、 t a r g e t .c ,通过这三个文件对目 标机的特点及其每条指令进行详细的描 述。 t a r g e t .m d : 对所有机器指令进行描述 t a r g e t .h : 另外一些对目 标机器的 描述,以 宏定义的形式记录 t a r g e t s : 以 上两个文件用到的函 数在该文件中进行定义 2 、生成新目 标机的 交叉编译程序 3 ,测试编译结果,重复2 , 3 步,直到生成正确的目 标机汇编代码 很明显,整个移植的过程关键就在于书写和修改那三个目 标机描述文件。 要想写好这三个目 标机描述文件,其前提是制定出一系列行之有效的资源分配 规则。由于我们的嵌入式系统是自 行设计的,许多硬件资源的使用规则就必须 第三章 g c c与l c c的分析 要我们自 行规定。编写二个目 标机描述文件之前,首先应该确定两个方面的规 则: 1 、寄存器的使用规则,这个问题比较重要。它可能决定生成的汇编 代码的执行效率。 2 、如何分配存储空间。 在开始正式书写机器描述文件之前,我们还应该确定通常被称为应用二进 制 接口( a p p l i c a t i o n b i n a ry i n t e r f a c e 简称a b i ) 的内 容。 也就是目 标机是如何实 现应用所需的基本数据类型和函数调用过程。比如,数据类型如何对应到字节 和位, 数据类型的存储空间分配, 如何调用函 数和如何返回函 数值。 实际上a b i 大部分都己 经由 机器的 体系结构决定了。它主要分为两部分19 1 , 1 、目 标机的数据表示,字节编码方式,基本数据类型。 2 、目标机的函数调用过程,函数调用:包含函数帧的使用,参数传 递,函数返回 上述所需信息全部准备好之后,我们可以 进行具体的 移植工作,包括: 1 、移植目标机头文件,主要包括三方面的内容。 ( 1 ) 延时槽定义 ( 2 ) 整数种类约束定义 ( 3 ) 汇编指令修改( 涉及修改很多宏定为 2 、移植目标机描述文件,主要包括两方面的内容。 ( 1 ) 模板描述方法 ( 2 ) 模板分类 a 、算数运算和逻辑运算指令类 b 、跳转指令类 c 、数据移动指令类 d 、函数调用指令 3 、移植目 标机c文件 目 标机描述文件中.mi 文件是一个正文文件,其中除了允许以“ ; ”开始的 注解行之外 ( 字符串中的分号除外) , 其余的均是采用r t l外部语法形式书写的 r t x表达式。这些表达式最外层的操作码是专门用于机器描述的操作码,由它们 组成的 机器描 述包含了目 标机 指令集的 各种内 容, 主要有1 1 1 . 1 、 指令样板, 描述目 标机所支持的每一条指令以 及该指令对应的r t l指令 形式和汇编代码输出格式。 2 、 指令样板的补充, 指出可以进行与目 标相关的优化动作及相应的r t l指 第三章 以二 c与l c c的分析 令形式, 如将一条复杂的r t l 指令分解为多条r t l指令, 进行窥孔优化,或者 将若干条r t l 指令归并为单条指令等等。 3 、 指令有关特性, 这些特性有: 指令的分类, 它指出 有哪几种类型的指令, 如分支、转移、转子、存数、取数、算术运算等等。指令中允许的数据类型, 它指出目 标机具体支持机器模式所规定的各种数据类型中的哪几种类型。指令 的长度, 它指出目 标机具有哪几种长度的指令以及各种长度的指令所属的类型。 指令的延迟槽口,它指出目 标机是否有延迟槽口的指令, 哪些指令具有这一特 征以及在延迟槽口中允许插入什么样的指令等等。功能部件。描述目 标机有哪 些功能部件,各类指令执行所在的部件名称以及功能部件有关的时间参数。具 体书写目 标机描述文件,必须详细了 解这方面的内容,掌握书写的规则、方法。 机器描述它是一个正文文件, 需要被转换成为g c c编译器的一部分, 这一 工作就由“ g en* ” 系列的代码生成器的生成器来完成。u g en* , 是一套专门的 转 换程序。它们针对不同的编译处理目 的分析机器描述, 将正文形式的md文件 转换成含有接口 所需数据结构与函数的c文件或h文件 “ i n s n - ,这些 c源 程序与g c c的其它源程序一起才构成了某个机器上运行完整的g c c编译源程 序, 然后重新编译g c c即可。 g c c具体使用和分析目 标机器描述文件 ( md文 件)的方法如下图3 .2 所示u 伙 第三章 g c c与l c c的分析 图3 .2 md文件的具体作用 3 . 1 . 3 g c c的缺点以及不使用它的原因 g c c是当 前最优秀的开源代码编译器,它的开发人员做了大量的工作使其 移植变得简单且高度抽象化, 如今许多嵌入式系统都是通过移植g c c来实现它 们的交叉编译器。但是,也正是由于g c c移植的高度抽象化使得对其移植缺少 灵活性和可伸缩性,特别是对于新设计的、有独特设计的和自 主设计的嵌入式 系统尤其如此。 根据上面的介绍,如果我们选择g c c进行移植,步骤简单明了,首先构造 目 标机描 述文件m a c h i n e .h 和m a c h i n e .m d 文 件; 然后 将它交 给g en去处理, 目 标机的g c c编译器就出 现了。 这样的后端移植过程看似清晰, 实际上是一个 非常繁琐的过程。 因为如果仅仅通过修改m d文件来移植g c c , 那么g c c只能 产生a t r+r拍 下1古v)i11.去甲姐 c则切 cvd+f杏杏addrf+p ddrf+p,-,-,-k . 产.尹 口户 一 ” 人 c d b a 0 r d o u b le 月一碑,: 鑫 。 ,二fl o c . 图3 .6语法分析后的抽象语法树 这些树使隐含在源代码中的一些含义更加清晰了。上面的类型转换在源代 码中并没有显式的体现, 但是在a n s i c标准中是有明确规定的, 在这些树中完 成了这些类型转换。此外,树中还明确给出了所有操作的类型,如源代码中的 加法都没有显式给出操作类型,但是在树中与对应的节点都标明了具体的操作 类型信息。这些语义分析是前端语义分析器完成的,由于这些操作的实现方法 是完全按照编译理论进行的,在这里就不细述了. 根据图3 .6 的树, l c c前端将生成图3 .7 所示的d a g , 编号为 1 和2 的d a g 第三章 g c c与l c c的分析 是从图3 .6中的树转换而来的。操作符标记中不再有 “ 十 ”号,而是将这些节点 转换成相应的 操作符。 树变成d a g后, 一些隐含的事实变得更加明显 化, 如树 中c n s t + d节点的常量0 . 5 , 在d a g中成了名字为“ 2 ” 的静态变量, c n s t + d 操作符被替换成取地址操作符a d d r g p和取值操作符i n d i r d 。图3 .7中的第 三个d a g定义了 名字为勺”的标号, 该标号将出 现在目 标程序e x a m p l e 的 末 尾处,程序中的返回指令被翻译成跳转到该标号。 cvdiaddd ( q a s g n f 人ddr f p . i ndi rd 杏 人 ddr gp 宁 “ 2 ,. 0 _ 5 妙杏addrfp t. 。 m al 图3 7生成的d a g 前端生成的d a g的顺序与图3 .8 所示的代码表的执行顺序是相同的。代码 表的 第一 个入口 是s an , 后面的 每个入口 代 表e x a m p l e 一部 分代码。 入口d e f p o i n t 表示源代码的 位置, 入口b l o c k b e g 和b l o c k e n d 表示e x a m p l e 代码中复合语句的 边界。 两个入口g e n 分别表示图3 .7 中的d a g1 和d a g 2 。 入口l a b e l 表示d a g 3 。到此l c c前端的工作基本完成。 - 2 4- 第三章 g c c与 l c c的分析 s t a r t d e,二 ,,1, exam ples x . o 丘 比 t = 期 . a . o 幻 ls e t = p - a . n a me =q 。乙n a me 吕 。 山“ ; 丫一 _ 二 s t r l n 以i %d , ,p - z . o ff s e t r 诺荡 馨湍甜增砚 p - - j - = q . s c l a s s = a u t o ; 。 找 妞 t + = r o u n d u p ( q - t y p e - s 咏, 我 矍 、 乏 邵咨 飞 手 然黔聂 愁淤共攘越 鑫 抢夸蠢羲漏熟薰霹篓蘸露蒸 头 一 4 8- 第四章 交叉c编译器的设计与移植 / *
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 现代远程教育培训
- 2026届辽宁省大连西岗区七校联考化学九年级第一学期期末学业质量监测试题含解析
- 2026届河北省衡水中学英语九上期末监测试题含解析
- 2026届安徽省合肥市肥东四中学九年级化学第一学期期中经典试题含解析
- 河南省宝丰县联考2026届九年级英语第一学期期末考试试题含解析
- 2026届山东省青岛市平度市第一中学化学九上期末检测模拟试题含解析
- 2026届山东省安丘市红沙沟镇红沙沟中学九年级化学第一学期期中联考试题含解析
- 2026届湖北襄阳五中学实验中学化学九上期中教学质量检测试题含解析
- 2025年教师资格证考试(高中化学)教育知识与能力专项试题
- 2026届北京市通州区九级化学九年级第一学期期末达标检测模拟试题含解析
- 蔬菜抗营养成分流失工艺考核试卷及答案
- 极端天气下灾害风险评估方案
- 民警培训安全驾驶简报课件
- 消毒灭菌效果监测报告
- 2025年软工导论期末试题及答案
- 2024统编版八年级历史上册全册知识点复习提纲
- 虚拟服装培训教程课件
- 2025年国防教育知识竞赛试题(附答案)
- 非车主押车借款合同范本
- GJB2220A-2018 航空发动机用钛合金饼、环坯规范
- 2025年光大金瓯资产管理有限公司招聘笔试参考题库含答案解析
评论
0/150
提交评论