程序语言C--的编译器设计与实现文献综述
2020-05-04 21:16:41
1.目的及意义
1.1题目:程序语言C--的编译器设计与实现
1.2背景及意义:
编译器是程序员使用的关键工具,必须生成高效的目标代码,但更重要的是,编译器必须生成正确的目标代码,只有可靠的编译器才能生成可靠的应用程序[2]。编译器本身是一个大而复杂的应用程序。编译器构造原理和技术可以说是计算机科学理论与实践相结合的最好典范。
上世纪50年代,IBM的John Backus带领了一个研究小组对FORTRAN语言及其编译器进行开发。由于当时人们对编译理论的了解不多,开发编译器既复杂又艰苦。与此同时Noam Chomsky也开始他对自然语言结构的研究。Chomsky研究出根据语言文法的难易程度以及识别它们所需的算法来对语言分类,即Chomsky架构。它包括了文法的四个层次:0型文法、1型文法、2型文法和3型文法。其中2型文法(上下文无关文法)被证明是程序设计语言中最有用的。解析问题(用于上下文无关文法识别的有效算法)的研究是在60年代和70年代,它相当完善地解决了这个问题,现在它已是编译原理中的一个标准部分。人们接着又深入研究有效生成目标代码的方法,人们通常称为优化技术,并被一直使用至今。
因为编译器作为基础软件,历史十分悠久,很多人都在研究,所以编译器的很多技术已经相当成熟。例如主流的三大C/C 编译器:GCC、Clang、cl,词法分析器生成程序Lex、Flex,语法分析器生成程序Bison、Yacc,编译器基础设施框架LLVM等。
GCC(GUN Compiler Collection),一套由GNU开发的编程语言编译器,它是一套以GPL及LGPL许可证发布的自由软件,现已被大多数操作系统采纳为标准的编译器。GCC 6.0提供了很多新的特性,如OpenMP 4.5、段寄存器支持、目标克隆、扩展存数规则等,完全支持C 14,并支持C 17的实验功能。
LLVM这个名字源于Lower Level Virtual Machine,但这个项目并不局限于创建一个虚拟机,它已经发展成为当今炙手可热的编译器基础框架[4]。LLVM最初以C/C 为编译目标,近年来经过众多机构和开源社区的努力,LLVM已经能够为ActionScript、D、Fortran、Haskell、Java、Objective-C、Swift、Python、Ruby、Rust、Scala等众多语言提供编译支持,而一些新兴语言则直接采用了LLVM作为后端。可以说,LLVM对编译器领域的发展起到了举足轻重的作用。
Lex是一个词法分析器生成器,yacc是一个语法分析器生成器,它们结合使用可以完成编译器前端的大部分工作,生成的LLVM IR由LLVM进行代码优化、机器码生成等,为实现编程语言提供了方便,避免了很多重复的工作。
{title}
本编译器实现的C语言子集。特性如下:
(1) 支持三种数据类型:int、char、int或char的一级或多级指针。
(2) 支持函数定义,函数调用。
(3) 支持if、while控制流语句。
(4) 支持数组、字符串。
(5) 支持枚举类型。
(6) 支持全局和局部两种作用域。
(7) 不支持预处理指令。但对基本库函数提供直接支持。
(8) 不支持多文件。每个程序只能写在单个文件中。
1.1题目:程序语言C--的编译器设计与实现
1.2背景及意义:
编译器是程序员使用的关键工具,必须生成高效的目标代码,但更重要的是,编译器必须生成正确的目标代码,只有可靠的编译器才能生成可靠的应用程序[2]。编译器本身是一个大而复杂的应用程序。编译器构造原理和技术可以说是计算机科学理论与实践相结合的最好典范。
实现一个编译器,可以学习到编译的一些知识,如词法分析、语法分析、代码生成等,还能清晰地了解程序的运行逻辑,例如变量定义、函数调用、参数传递、内存分配等。因为编译器是一个比较复杂的程序,在实现编译器的过程中,需要设计程序模块、设计符号表、设计运行栈、设计中间代码等,并将它们组合在一起,是非常考验系统设计能力的,对编程能力的提升也是十分巨大的。
上世纪50年代,IBM的John Backus带领了一个研究小组对FORTRAN语言及其编译器进行开发。由于当时人们对编译理论的了解不多,开发编译器既复杂又艰苦。与此同时Noam Chomsky也开始他对自然语言结构的研究。Chomsky研究出根据语言文法的难易程度以及识别它们所需的算法来对语言分类,即Chomsky架构。它包括了文法的四个层次:0型文法、1型文法、2型文法和3型文法。其中2型文法(上下文无关文法)被证明是程序设计语言中最有用的。解析问题(用于上下文无关文法识别的有效算法)的研究是在60年代和70年代,它相当完善地解决了这个问题,现在它已是编译原理中的一个标准部分。人们接着又深入研究有效生成目标代码的方法,人们通常称为优化技术,并被一直使用至今。
因为编译器作为基础软件,历史十分悠久,很多人都在研究,所以编译器的很多技术已经相当成熟。例如主流的三大C/C 编译器:GCC、Clang、cl,词法分析器生成程序Lex、Flex,语法分析器生成程序Bison、Yacc,编译器基础设施框架LLVM等。
GCC(GUN Compiler Collection),一套由GNU开发的编程语言编译器,它是一套以GPL及LGPL许可证发布的自由软件,现已被大多数操作系统采纳为标准的编译器。GCC 6.0提供了很多新的特性,如OpenMP 4.5、段寄存器支持、目标克隆、扩展存数规则等,完全支持C 14,并支持C 17的实验功能。
LLVM这个名字源于Lower Level Virtual Machine,但这个项目并不局限于创建一个虚拟机,它已经发展成为当今炙手可热的编译器基础框架[4]。LLVM最初以C/C 为编译目标,近年来经过众多机构和开源社区的努力,LLVM已经能够为ActionScript、D、Fortran、Haskell、Java、Objective-C、Swift、Python、Ruby、Rust、Scala等众多语言提供编译支持,而一些新兴语言则直接采用了LLVM作为后端。可以说,LLVM对编译器领域的发展起到了举足轻重的作用。
Lex是一个词法分析器生成器,yacc是一个语法分析器生成器,它们结合使用可以完成编译器前端的大部分工作,生成的LLVM IR由LLVM进行代码优化、机器码生成等,为实现编程语言提供了方便,避免了很多重复的工作。
2. 研究的基本内容与方案
{title}2.1 基本内容
毕设主要研究设计和实现编译程序的相关技术和方法,主要内容为:
(1)研究词法分析中使用的几种技术,如基于表驱动的词法分析技术,以及硬编码方式的词法分析技术。
(2)研究主流的语法分析技术,包括自顶向下方法(如递归下降法、LL技术等)和自底向上方法(如LR技术等)。
(3)研究语法制导定义和语法制导翻译的方法,以及代码生成的技术。
不仅仅是编译器相关的技术,因为编译器生成的中间代码是虚拟机指令,因此虚拟机的指令设计、虚拟机对指令执行的方式等也需要深入的研究。本编译器实现的C语言子集。特性如下:
(1) 支持三种数据类型:int、char、int或char的一级或多级指针。
(2) 支持函数定义,函数调用。
(3) 支持if、while控制流语句。
(4) 支持数组、字符串。
(5) 支持枚举类型。
(6) 支持全局和局部两种作用域。
(7) 不支持预处理指令。但对基本库函数提供直接支持。
(8) 不支持多文件。每个程序只能写在单个文件中。
(9) 不支持typedef、struct、union类型定义。
采用语法制导的翻译技术,设计与实现一个C--语言的编译程序。为了深入了解程序在计算机中的运行过程,还将实现一个配套的虚拟机,该编译程序生成的目标代码能够在此虚拟机上运行。
剩余内容已隐藏,您需要先支付 5元 才能查看该篇文章全部内容!立即支付