C语言编译器设计与实现Word文档格式.docx
《C语言编译器设计与实现Word文档格式.docx》由会员分享,可在线阅读,更多相关《C语言编译器设计与实现Word文档格式.docx(46页珍藏版)》请在冰豆网上搜索。
重点的说明了系统设计的重点、设计思想、难点技术和解决方案。
关键词:
编译技术,编程程序,高级语言
ClanguagecompilerdesignandImplementation
Abstract
Withthewideapplicationofthecomputer,computerprogramminglanguagesaredevelopedfromtheearlymachinelanguageintoassemblylanguage,andnowavarietyofhigh-levelprogramminglanguage.Thecompilertechnologyisthebackboneofcomputerlanguagedevelopment,butalsothefastestgrowingincomputerscience,abranchofthemostmature,heepitomizestheessenceofthecomputerandthefruitsofdevelopment.
Thecoreideaisthesamelogicalstructureoftheprogramandideasexpressedintheconversionfromonelanguagetoanotherlanguageprogramrepresented.Fromthehigh-levellanguage,andevenrunningwithhigh-levellanguagevirtualplatformtomachinelanguage,andultimatelytothehardwareimplementationofthephysicalsignal,thelayersoftransformationinvolvesapplicationofcompilertechnology.
SystemusesC++astheprogramminglanguage.Paperintroducesthedevelopmentbackgroundofthetopic,thedevelopmentandfunctiontocompletetheprocess.Notethefocusofsystemsdesign,designideas,technologiesandsolutionsdifficult.
KeyWords:
Compilertechnology,Programmingprocedures,High-levelprogramminglanguage
目 录
第一章绪论
1.1开发背景
随着计算机科学技术的飞速发展,计算机技术被应用在了越来越广泛的领域,实现各种各样功能的计算机程序被大量地开发出来,应用在我们的生活、学习和工作当中。
相应地,也产生了许多用以编写这些计算机程序的高级程序设计语言。
程序编制者通过特定语言的编译器将自己编写的源程序翻译为特定机器上的目标程序,从而能够最终达到程序执行的目的。
从20世纪60年代以来,编译器设计就一直是计算机研究发展和开发领域中的一个活跃主题。
虽然编译器设计已有很长的历史,并且也是一门相对成熟的计算机技术,但编译器毕竟是一种实现由高级语言源程序至机器或汇编指令的高效映射工具,随着计算机软、硬件水平的飞速发展,使得计算机应用日新月异,程序语言的设计在不断地变化,目标机体系结构也在不断地改进,软件越来越复杂,其规模也越来越大。
尽管编译器设计问题在高级层次上没有变化(或变化很小),但当我们深入其内部研究时就会发现,编译器的内部构造其实也一直在变化。
此外,由于我们能够提供给编译器本身使用的计算资源也在不断增加。
因此,现代编译器可以采用比以前更耗费时间和空间的算法。
当然,编译技术研究人员也在继续努力开发新的、更好的技术来解决传统编译器的一些设计性问题[1]。
另一方面,很多编译“前端”技术,如文法、正则表达式、语法分析器以及语法制导翻译器等,仍然被广泛使用。
1.2开发目标和意义
编译器是一种相当复杂的系统程序,其代码的长度可从几千行到几百万行不等,所以编写甚至读懂这样的一个程序都不是一件容易的事。
绝大多数的计算机专业人员从来没有编写过一个完整的编译器,但是,几乎所有形式的计算均要用到编译器,而且任何一个与计算机打交道的专业人员都应该掌握编译器的基本结构和操作。
除此之外,计算机应用程序中经常遇到的一个任务就是有关命令解释程序和界面程序的开发,这比编译器的开发规模要小,但使用的却是很类似的技术。
因此,掌握编译器的开发技术具有非常重大的实际意义。
编译器的设计的原理和技术还可以用于编译器设计之外的众多领域。
因此,这些原理和技术通常会在一个计算机科学家的职业生涯中多次被用到。
研究编译器的编写讲设计程序设计语言、计算机体系结构、形式语言理论、算法和软件工程。
编译器的设计从本质上来说是一种工程活动,它所使用的方法必须很好地解决现实中出现的各种翻译问题(即用真实的语言编制且在真实的机器上能够执行的真实的程序)。
大多数情况下,开发编译器的人必须接受他们面对的语言和机器,很少能够去影响或改善这两者的设计。
在开发过程中做什么样的分析和转换,以及什么时候去做,这些都是工程上的选择,但正是这些选择决定了一个编译器的性能高低。
本实验就建立在一个自主开发的名为C的微型编译器基础之上,该编译器虽然功能弱于像TurboC或BorlandPascal这样的经典编译器,但也已经完全具备了一个编译器应有的所有特征。
虽然本实验只是一个规模很小的微型编译器的开发,但所谓“麻雀虽小,五脏俱全”,作为一次较为完整的编译开发实践,它已经足够让我透彻地了解一个编译器开发过程了,同时能更深刻地理解和运用编译开发过程中的众多技术和方法,并能在此基础上针对编译器的优化展开深入的讨论,这些对于自己以后的研究和发展方向将起到非常大的推动作用。
C编译器以C++语言作为开发语言,以MicrosoftVisualStudio2012作为开发工具,C编译器的各个阶段以类的形式表示,最后以项目文件为单位来编译生成C编译器的可执行文件。
本实验以MicrosoftVisualStudio2012作为开发工具,用标准C++进行开发,因此可以很好的的移植到其他平台(比如:
linux,用g++编译生成可执行文件)。
1.2当前编译器国内外的发展情况
在编译器技术的发展过程中,如何提高编译的效率一直是核心研究目标之一,编译效率主要是根据该编译器所生成的目标代码在执行过程中的时间指标和空间指标来衡量的,所以编译优化也必定围绕时间和空间这两个方面来实施。
在编译过程中针对代码优化的技术有很多,它们通常是通过搜集源代码或中间代码的特定信息,然后利用这些信息对代码中的数据结构或算法操作实施等价的改进变换,从而力求在时间效率和空间效率上达到一个最佳平衡点。
编译器的开发者们总是希望能够将各种代码优化技术充分地运用在自己的编译器设计中,但往往事与愿违,毕竟优化操作本身也是需要付出开销的。
在C编译器的开发过程中,虽然没有运用到太复杂的代码优化技术,但通过本实验的研究,在现有开发的C编译器基础之上,能够在后续相关项目的开发中有效地提高程序代码的编译质量,对于自己以后的研究和发展方向将起到非常大的推动作用。
这正是本实验的研究意义所在。
本实验是以C微型编译器的项目开发为基础,该项目的开发目标是自定义一种C高级语言,然后编码实现出C语言的编译器(称为C编译器),完成将C语言源程序翻译为基于MM机(MiniMachine)的目标代码的任务,这是本实验的实际应用背景。
编译器的开发具有极高的实用价值和意义,高级语言编译器的性能决定了基于该语言平台所开发出的软件的质量。
所以国内外很多大学的科研和技术人员也在积极地开展这方面的技术探索和项目实践。
他们大多是以特定的软件项目为背景来进行一些与编译器开发相关或类似的研究分析,他们的研究目标大多是基于某种实验型高级语言的编译器开发和优化改进,然后把有价值的研究成果移植或运用到产品级的编译器开发中(比如.NET平台编译器)。
最近十年以来,国外关于编译器设计的发展动态主要体现在:
首先,编译器采用了大量的更加复杂的算法,主要用于推断或简化程序中的信息,这又与更为复杂的程序设计语言的发展结合在一起,其中典型的有用于函数语言编译的Hindley-Milner类型检查的统一算法[2]。
其次,编译器已越来越成为基于窗口的可视化交互开发环境(InteractiveDevelopmentEnvironment,IDE)的一部分,该环境还包括了智能编辑器、连接程序、调试程序以及项目管理程序等,已经成为了事实上的编译器行业标准。
另一方面,尽管国内外的专家学者们近年来在编译原理领域进行了大量的研究,但是基本的编译器设计原理在近20年中都没有多大的改变,它现在正迅速地成为计算机科学课程中的中心环节之一。
在九十年代,作为GNU项目或其它开放源代码项目的一部分,许多免费的编译器或编译器构造工具被开发出来。
这些工具可用来编译数种程序设计语言的源程序(典型的就是GCC)。
它们中的一些项目被认为是高质量的,而且对现代编译理论感兴趣的人都可以较容易地得到它们的免费源代码。
典型的是在1999年,SGI公布了他们的一个工业化的并行优化编译器Pro64的源代码,随后被全世界多个编译器研究小组用做研究平台,并命名为Open64。
Open64的设计结构好,分析优化全面,是编译器高级研究的理想平台。
反观国内,现阶段对于编译技术的相关研究,基本上都是着眼于特定编译器的特定部分来展开的,而本实验将研究和分析的重点主要集中于一个完整的微型编译器的构造的讨论。
第二章理论基础
2.1编译系统概述
2.1.1什么是编译器
编译器,是将便于人类编写、阅读、维护的计算机高级语言程序翻译为机器能够识别、运行的计算机低级语言程序的一种系统软件。
编译器将源程序(SourceProgram)作为输入,翻译产生使用目标语言的等价目标程序((TargetProgram)。
其中,源程序一般为高级语言(High-levellanguage),如Pascal,C++等,而目标语言则是汇编语言或目标机器的机器语言[3]。
编译器的这一作用如图2-1所示:
图2-1编译器的作用
2.1.2编译器的产生
本世纪四十年代,由于冯·
诺依曼在存储程序计算机方面的先锋作用,使得编写一串代码或程序已成为可能和必要,这样计算机就可以执行所需的计算。
在初期,这些程序都是用机器语言编写,编写或维护这样的代码是非常枯燥乏味且效率低下的,所以机器语言很快就被汇编语言代替了。
汇编语言大大提高了程序编写速度和准确度,但它也有许多缺点。
于是发展编程技术的下一个重要革新就是以一个