毕业设计(论文)C语言编译器的设计开发字节代码格式设计与实现_第1页
毕业设计(论文)C语言编译器的设计开发字节代码格式设计与实现_第2页
毕业设计(论文)C语言编译器的设计开发字节代码格式设计与实现_第3页
毕业设计(论文)C语言编译器的设计开发字节代码格式设计与实现_第4页
毕业设计(论文)C语言编译器的设计开发字节代码格式设计与实现_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

1、c语言编译器的设计开发 字节代码格式设计与实现 第 38 页 共 43 页毕业设计(论文)中文摘要c语言编译器的设计开发摘要 编译程序是现代计算机系统的基本组成部分之一,而且多数计算机系统都含有不止一个高级语言的编译程序,对有些高级语言甚至配置了几个不同性能的编译程序。从功能上看,一个编译程序就是一个语言翻译程序。它把一种语(称作源语言)书写的程序翻译成另一种语言(称作目标语言)的等价的程序。比如汇编程序是一个翻译程序,它把汇编语言程序翻译成机器语言程序。如果源语言是像fortran,pascal,或c那样的高级语言,目标语言是像汇编语言或机器语言那样的低级机器语言,则这种翻译程序称作编译程序

2、。一个编译程序的重要性体现在它使得多数计算机用户不必考虑与机器有关的繁索细节,使程序员和程序设计专家独立于机器,这对于当今机器的数量和种类持续不断地增长的年代尤为重要。编译过程划分了词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成、六个阶级。另外两个重要的工作:表格处理和出错处理与上述六个阶级都有联系。关键词 编译程序,源语言,目标语言,词法分析,语法分析,语义分析,字节代码,中间代码,代码优化,目标代码。毕业设计(论文)外文摘要title the design and development of c compiler abstract the compiler proce

3、dure and translate of fundamental is a modern calculator system to constitute the one of the parts, and the system of most calculators all simply the edit and translating of language of a high class the procedure, even installed the procedure of edit and translating of a few and different function t

4、o some high class language.see from the function, and it is procedure of a language translation that edit and translate the procedure.it translate a kind of language( call the source language) procedure that write into the procedure of the another language( call the target language).for example edit

5、 collected materials the procedure is a translation procedure, it to translate edit collected materials the language procedure into the machine language the procedure.if high class language, target language that language is like of fortran, pascal, or the c is so to as edit collected materials the l

6、anguage or machine language so of low class jade article speech, then this kind of translation the procedure call to edit and translate the procedure.an importance that edit and translate procedure now it make most calculatorses the customer need not consider the heavy details that have relation wit

7、h machine, and make the procedure design the experts independence with procedure in the machine, the quantity that this is for the machine that nowadays age keep on with category to constantly increase to importance.edit and translated the process to divide the line the phrase method the analysis, p

8、hrasing the analysis, language the righteousness the analysis, in the center the code is born, code , target the code is born, six rank.another two importance of work:the form handles with come amiss to handle to have connection with above six rankses all.keywords compiler procedure, source language

9、, target language,code generation,middle code, synax analyers,lexical analyzers,intermediate code,byte code 目 次 1 引言(或绪论)12 编译器的基础知识22.1编译器的发展背景 32.2编译器研发的可行性分析32.3编译过程概述 53系统需求分析 83.1 lex概述 832 c语言简介933软件工程方法论的应用1034词法语法分析简介 133.5词法需求分析简介 133.6语法需求分析简介 1437符号表的应用154系统设计 1641系统设计总体流程图164.2语法分析体流程图 1

10、74.3语法分析概要设计 184.4目标代码的分析 2145 80x86指令系统244.6字节代码设计 254.7虚拟寄存器的设计 264.8字节代码详细设计 275 使用说明书 346结论 35致谢 36参考文献371 引言(或绪论)编译器的设计涉及到编译程序构造的一般原理、基本设计方法、主要实现技术和一些自动构造工具。尽管“编译程序”是特指将高级程序设计语言翻译成低级语言的软件,但编译程序构造的基本原理和技术也广泛应用于一般的设计和实现,因此,是一门对实践性要求较高的课程。目前,世界上存在着数千种源语言,既有fortran和pascal这样的传统程序设计语言,也有各计算机应用领域中出现的专

11、用语言。目标语言也同样广泛,目标语言可以是另一种程序设计语言或者是从微处理机到计算机的任何计算机的机器语言。不同语言需要不同的编译器。根据编译器的构造方法或者它们要实现的功能,编译器被分为一遍编译器、多遍编译器、装入并执行编译器、调试编译器、优化编译器等多种类别。从表面上看,编译器的种类似乎千变万化,多种多样,实质上任何编译器所要完成的基本任务都是相同的。通过理解这些任务,我们可以利用同样的基本技术为各种各样的源语言和目标机器构建编译器。编译器也可能没有生成真正的可执行代码,而是生成了某种形式的汇编代码,这必须由汇编器、链接器和装入器进行进一步处理。汇编器、链接器和装入器可由操心系统提供或由编

12、译器自带。在翻译期间,中间表示或ir代表了源程序和数据结构。虽然抽象语法树是源代码完美充分的表达,即使对于代码生成也不过这样,但是它与目标代码极不相像,在控制流构造上尤为如此。在控制流构造上,目标代码使用转移语句而不是if和while语句。因此,编译器编写者可能希望从语法树生成一个更接近目标代码的中间表示形式,或者用这样一个中间表示代替语法树,然后再从这个新的中间表示生成目标代码。中间代码生成在进行了上述的语法分析和语义分析的工作之后,有的编译程序将源程序变成一种内部表示形式,这种内部表示形式叫做中间语言或中间代码。所谓“中间代码”是一种结构简单、含义明确的记号系统,这种记号系统可以设计为多种

13、多样的形式,重要的设计原则为两点:一是容易生成;二是容易将它翻译成目标代码。很多编译程采用了一种近似“三地址指令”的“四元式”中间代码,这种四元式的形式为:(运算符,运算对象1,运算对象2,结果)。2编译器的基础知识一个编译程序就是一个语言翻译程序。它把一种语(称作源语言)书写的程序翻译成另一种语言(称作目标语言)的等价的程序。比如汇编程序是一个翻译程序,它把汇编语言程序翻译成机器语言程序。如果源语言是像fortran,pascal,或c那样的高级语言,目标语言是像汇编语言或机器语言那样的低级语言,则这种翻译程序称作编译程序。2.1 编译器的发展背景编译程序是现代计算机系统的基本组成部分之一,

14、而且多数计算机系统都含有不止一个高级语言的编译程序,对有些高级语言甚至配置了几个不同性能的编译程序。从功能上看,一个编译程序就是一个语言翻译程序。它把一种语(称作源语言)书写的程序翻译成另一种语言(称作目标语言)的等价的程序。比如汇编程序是一个翻译程序,它把汇编语言程序翻译成机器语言程序。如果源语言是像fortran,pascal,或c那样的高级语言,目标语言是像汇编语言或机器语言那样的低级语言,则这种翻译程序称作编译程序。一个编译程序的重要性体现在它使得多数计算机用户不必考虑与机器有关的繁索细节,使程序员和程序设计专家独立于机器,这对于当今机器的数量和种类持续不断地增长的年代忧为重要。除了编

15、译程序外,还需要一些其它的程序才能生成一个可在计算机执行的目标程序。一个源程序有时可能分成几个模块存放在不同的文件里,将这些源程序汇集在一起的任务,由一个叫做预处理程序的程序完成,有些预处理程序也负责宏展开,像c语言和预处理程序要完成文件合并、宏展开等任务。也就是说,一个编译程序的输入可能要一个或多个预处理程序来产生,另外,为得到能运行的机器代码,编译程序的输出可能仍需要进一步地处理。词法分析阶级是编译过程的第一个阶级。这个阶级的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别一个个单词(也称为单词符号或符号)。这里所谓的单词是指逻辑上紧密相连的一组字符

16、,这些字符具有集体含义。比如标识是由字母开头,后跟字母、数字字符序列组成的一种单词,。保留字是一种单词,此外还有算符,界符等等。语法分析是编译过程的第二个阶段。语法分析的任务是在词法分析的基础上将单词序列分解成各类语法短语。如“程序”,“语句”,“表达式”等等。一般这种语法短语也称为语法单位,可表示成语法树。语法分析所依据的是语言的语法规则,即描述程序结构的规则。通过语法分析确定整个输入串是否构成一个语法上正确的程序。典型的文法的语法分析器有三类:一类是通用的语法分析方法,如cocke-younger-kasami算法和early算法,这些方法在生成编译器时效率太低。编译器常用的是自顶向下和自

17、底向上的方法。采用自顶向下的递归子程序法,就是对应每个非终结符语法单元,编一个独立的处理子程序。语法分析从读入第一个单词开始,由非终结符即开始符出发,沿语法描述图箭头指出的方向进行分析。当遇到非终结符时,则调用相应的处理子程序,从语法描述图看也就进入了一个语法单元,再沿当前所进入的语法描述图的箭头方向进行分析,当遇到终结符时,则判断当前读入的单词是否与图中的终结符相匹配,若匹配,则执行相应的语义程序。再读取下一个单词继续分析。遇到分支点时将当前的单词与分支点上的多个终结符逐个相比较,若都不匹配时可能是进入下一非终结符语法单位或是出错。自顶向下的分析算法通过在最左推导中描述出各个步骤来分析记号串

18、输入。之所以称这样的算法为自顶向下是由于分析树隐含的编号是一个前序编,而且其顺序是由根到叶子。自顶向下的分析程序有两类:回溯分析程序和预测分析程序。预测分析程序试图利用一个或多个先行记号来预测出输入串中的下一个构造,而回溯分析程序则试着分析其他可能的输入,当一种可能失败时就要求输入中备份任意数量的字符。虽然回溯分析程序比预测强大许多,但它们都非常慢,一般都在指数的数量级上,所以对于实际的编译器并不适合。递归下降程序分析和ll(1)分析一般地都要求计算先行集合,它们分别称作first集合和follow集合。由于无需显示地构造出这些集合就可以构造出简单的自顶向下的分析程序,所以在基本算法的介绍之后

19、我们再讨论它们。之后我偿还要谈到一个由递归下降分析构造的分析程序。由于代码生成较复杂,所以编译器一般将这一阶段分成几个涉及不同中间数据结构的步骤,其中包括了某种称作中间代码的抽象代码。编译器也可能没有生成真正的可执行代码,而是生成了某种形式的汇编代码,这必须由汇编器、链接器和装入器进行进一步处理。汇编器、链接器和装入器可由操心系统提供或由编译器自带。在翻译期间,中间表示或ir代表了源程序和数据结构。虽然抽象语法树是源代码完美充分的表达,即使对于代码生成也不过这样,但是它与目标代码极不相像,在控制流构造上尤为如此。在控制流构造上,目标代码使用转移语句而不是if和while语句。因此,编译器编写者

20、可能希望从语法树生成一个更接近目标代码的中间表示形式,或者用这样一个中间表示代替语法树,然后再从这个新的中间表示生成目标代码。这种类似目标代码的中间表示称为中间代码。2.2编译器研发的可行性分析编写编译器的原理和技术具有十分普遍的意义,以致于在每一个计算机科学家的研究生涯中,许多原理和技术都会反复用到。编译器的编写涉及到程序设计语言、计算机体系结构、语言理论、算法和软件工程等学科。幸运的是,有几种基本编译器编写技术已经被用于构建许多计算机的多种语言翻译器。简单的说,编译器是一个程序,它读入用某种语言(源语言)编写的程序并将其翻译成一个与之等价的以另一种语言(目标语言)编写的程序。作为这个翻译过

21、程匠一个重要组成部分,编译器能够向用户报告被编译的源程序中出现的错误。编译器由两部分组成:分析与综合。分析部分将源程序切分成一些基本块并形成源程序的中间表示,综合部分把源程序的中间表示转为所需的目标程序。在分析期间,源程序所蕴含的操作将被确定下来并被表示成为一个称为语法树的分层结构。语法树的每个节点表示一个操作,该节点的子节点表示这个操作的参数。许多操纵源程序的软件工具都首先完成某种类型的分析。下边是这类工具的示例:1 结构编辑器,结构编辑器将一个命令序列作为输入一构造程序。2 智能打印机,智能打印机能够对程序进行分析,打印出结构清晰的程序。3 静态检查器,静态检查器读入一个程序,分析这个程序

22、,并在不运行这个程序的条件试图发现程序的潜在错误。4 解释器,解释器不是通过翻译来产生目标程序,而是直接执行源程序中蕴含的操作。目前,世界上存在着数千种源语言,既有fortran和pascal这样的传统程序设计语言,也有各计算机应用领域中出现的专用语言。目标语言也同样广泛,目标语言可以是另一种程序设计语言或者是从微处理机到计算机的任何计算机的机器语言。不同语言需要不同的编译器。根据编译器的构造方法或者它们要实现的功能,编译器被分为一遍编译器、多遍编译器、装入并执行编译器、调试编译器、优化编译器等多种类别。从表面上看,编译器的种类似乎千变万化,多种多样,实质上任何编译器所要完成的基本任务都是相同

23、的。通过理解这些任务,我们可以利用同样的基本技术为各种各样的源语言和目标机器构建编译器。从20世纪50年代早期第一个编译器出现到今,我们所掌握的有关编译器的知识已经得到了长足的发展。整个20世纪50年代,编译器的编写一直被认为是一个极难的问题。目前我们已经系统地掌握了处理编译期间发生的许多重要任务的技术。良好的实现语言、程序设计环境和软件工具也已经被开发出来。20世纪50年代末有人开始研究编译程序的自动生成技术,提出并研制编译程序的编译程序。它的功能是以任一语言的词法规则、语法规则和语义解释出发,自动产生该语言的编译程序。目前,很多自动生成的工具已广泛使用,如词法分析的生成系统lex,语法分析

24、程序的生成系统yacc等。20世纪60年代起,不断有人使用自展技术来构造编译程序。自展的主要特征是用被编译的语言来书写该语言自身的编译程序。自从1971年,pascal的编译程序用自展技术生成后,起影响就越来越大。研究编译程序是有意义在于:1) 编译程序构造是计算机科学中的一个非常成功的分支,也是最早获的成功的分支之一;2) 它与文件转换程序关系密集,且不仅仅适用于编译程序;3) 它包含许多在实际应用中有用的算法。由于近几年并行机及多处理机的发展,对软件的并行处理技术提出了新的要求。特别是并行编译技术发展很快,目前处理并行编译技术有两种方法:第一种方法,运用重构技术把已有的串行语言编写的程序经

25、过相关分析,分解成可并行的成分,分配到多cpu或多处理机上运行,这种技术国内已有fortran和c语言的并行重构处理系统,相当成功。第二种方法,即在程序设计语言机制上允许用户自己编写并行程序,这当然比编写串行语言对编程人员提出的要求更多。即用户自己必须知道程序各模块之间逻辑结构关系及调用关系乃至运算量,以确定哪些模块可以并行执行。若编程者能按程序设计情况编出并行程序,无疑并行程序效率将比第一种方法要好。随着并行技术和并行语言的发展,处理并行语言的并行编译技术正在深入研究之中,将串行程序转换成并行程序的自动并行编译技术也正在深入研究之中。代码生成较复杂,所以编译器一般将这一阶段分成几个涉及不同中

26、间数据结构的步骤,其中包括了某种称作中间代码的抽象代码。编译器也可能没有生成真正的可执行代码,而是生成了某种形式的汇编代码,这必须由汇编器、链接器和装入器进行进一步处理。汇编器、链接器和装入器可由操心系统提供或由编译器自带。在翻译期间,中间表示或ir代表了源程序和数据结构。虽然抽象语法树是源代码完美充分的表达,即使对于代码生成也不过这样,但是它与目标代码极不相像,在控制流构造上尤为如此。在控制流构造上,目标代码使用转移语句而不是if和while语句。因此,编译器编写者可能希望从语法树生成一个更接近目标代码的中间表示形式,或者用这样一个中间表示代替语法树,然后再从这个新的中间表示生成目标代码。这

27、种类似目标代码的中间表示称为中间代码。然后编译程序再调用相应的处理程序,将中间代码转换为计算机能处理的机器指令,最终得到目标代码。23编译过程概述编译程序是现代计算机系统的基本组成部分之一,而且多数计算机系统都含有不止一个高级语言的编译程序,对有些高级语言甚至配置了几个不同性能的编译程序。从功能上看,一个编译程序就是一个语言翻译程序。它把一种语(称作源语言)书写的程序翻译成另一种语言(称作目标语言)的等价的程序。比如汇编程序是一个翻译程序,它把汇编语言程序翻译成机器语言程序。如果源语言是像fortran,pascal,或c那样的高级语言,目标语言是像汇编语言或机器语言那样的低级玉器言,则这种翻

28、译程序称作编译程序。一个编译程序的重要性体现在它使得多数计算机用户不必考虑与机器有关的繁索细节,使程序员和程序设计专家独立于机器,这对于当今机器的数量和种类持续不断地增长的年代忧为重要。除了编译程序外,还需要一些其它的程序才能生成一个可在计算机执行的目标程序。高级语言程序的处理过程如图: 需处理的源程序 预处理程序 源程序编译程序 目标汇编程序 汇编程序 可再装配的机器代码装配/连接编辑程序 可在装配的目标文件 绝对机器代码 一个源程序有时可能分成几个模块存放在不同的文件里,将这些源程序汇集在一起的任务,由一个叫做预处理程序的程序完成,有些预处理程序也负责宏展开,像c语言和预处理程序要完成文件

29、合并、宏展开等任务。也就是说,一个编译程序的输入可能要一个或多个预处理程序来产生,另外,为得到能运行的机器代码,编译程序的输出可能仍需要进一步地处理。编译程序完成从源程序到目标程序的翻译工作,是一个复杂的整体的过程。从概念上来讲,一个编译程序和整体工作过程是划分成阶级进行的,每个阶级将源程序的一种表示形式换成另一种表示形式,各个阶级进行的操场作在逻辑上是紧密连接在一起的,如图1所示,给出了一个编译过的和各个阶级,这是一种比较典型的划分方法。表格管理目标代码生成代码优化中间代码生成语义分析语法分析词法分析 源程序出错处理 图1图1将编译过程划分了词法分析、语法分析、语义分析、中间代码生成、代码优

30、化、目标代码生成、六个阶级。另外两个重要的工作:表格处理和出错处理与上述六个阶级都有联系。编译过程是源程序和各种信息被子保留在种种不同的表格里,编译各阶级的工作都涉及到构造、查找或更新有关的表格,因此需要有表格处理的工作;如果编译过程中发现源程序有错误,编译程序应报告错误的性质和错误发生的地点,并且将错误所造成的影响限制在尽可能小的范围内,使得源程序的其余部分能继续被编译下去,有些编译程序还能自动校正错误,这些工作称之为出错处理。词法分析阶级是编译过程的第一个阶级。这个阶级的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别一个个单词(也称为单词符号或符号

31、)。这里所谓的单词是指逻辑上紧密相连的一组字符,这些字符具有集体含义。比如标识是由字母开头,后跟字母、数字字符序列组成的一种单词,。保留字是一种单词,此外还有算符,界符等等。语法分析是编译过程的第二个阶级。语法分析的任务是在词法分析的基础上将单词序列分解成各类语法短语,如“程序”,“语句”,“表达式”等等。一般这种语法短语,也称为语法单位,可表示成语法树。语法分析所依据的是语言的语法规则,即描述程序结构的规则。通过语法分析确定整个输入串是否构成一个语法上正确的程序。词法分析和语法分析本质上都是对源程序的结构进行分析。但词法分析的任务仅对源程序进行线性扫描即可完成,比如识别标识符,因为标识符的结

32、构是字母打头的字母和数字序列,这只要顺序扫描输入流,遇到既不是字母又不是数字字符时,将前面所发现的所有字母和数字组合在一起而构成单词标识符。但这种线性扫描则不能用于识别递归定义的语法成分,比如就不能用此办法去匹配表达式中的括号。语义分析阶级是审查源程序有无语义错误,为代码生成阶级收集类型信息。比如语分析的一个工作是进行类型审查,审查每个算符是否具有语言规范允许的运算对象,当不符合语言规范时,编译程序应报告错误。如有的编译程序要对实数用个数组下标的情况报告错误。又如某些语言规定运算对象可被强制,那么当二目运算一整数和一实型时,编译程序应将整型转换成实型而不能认为是源程序的错误。中间代码生成在进行

33、了上述的语法分析和语义分析的工作之后,有的编译程序将源程序变成一种内部表示形式,这种内部表示形式叫做中间语言或中间代码。所谓“中间代码”是一种结构简单、含义明确的记号系统,这种记号系统可以设计为多种多样的形式,重要的设计原则为两点:一是容易生成;二是容易将它翻译成目标代码。很多编译程采用了一种近似“三地址指令”的“四元式”中间代码,这种四元式的形式为:(运算符,运算对象1,运算对象2,结果)。代码优化在此阶级的任务是对前阶级产生的是间代码进行变换或进行改造,目的是使生成的目标代码更为高效,即省时间和省空间。目标代码生成的任务是把是间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指

34、令代码。这是编译的最后阶级,它的工作与硬件系统结构和指令含义有关,这个阶的工作很复杂,涉及到硬件系统功能部件的运用、机器指令的选择、各种数据类型变量的存储空间分配以及寄存器和后缓寄存器的调度等。有时,常常把编译的过程分为前端和后端,前端由那样一些阶级组成:这些阶级的工作主要依赖于源语言而与目标机无关。通常这些阶段包括词法分析、语法分析、语义分析和中间代码生成,某些优化工作也可在前端做,也包括与前端每个阶级相关的出错处量工作和符号表管理工作。后端工作指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。若按照这种姐合方式实现编译程序,可以

35、设想,某一编译程序的前端加上相应不同的后端则可以为不同的机器构成一个源语言的编译程序。也可以设想,不同语言编译的前端生成同一种中间语言,再使用一个共同的后端,则可为同一机器生成几个语言的编译程序。一个编译过程可由一遍、两遍或多遍完成。所谓“遍”,也称作“趟”,是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。每一遍扫视可完成上述一个阶段或多个阶段的工作。例如一遍可以只完成词法分析工作;一遍完成词法分析和语法分析工作;甚至一遍完成整个编译工作。对于多遍的编译程序,第一遍的输入是用户书写的源程序,最后一遍是输出是目标语言程序,其余是上一遍的输出为下一遍的输入。3系统需求分析3.1

36、lex概述lex是一个词法分析器(扫描器)的自动产生系统,它的示意图如下:lex源程序 lex yylex输入串 yylex 单词符号串 lex源程序是用一种面向问题的语言写成的。这个语言的核心是正规表达式(正规式),用它描述输入串的词法结构。在这个语言中用户还可以描述某一个词形被识别出来时要完成的动作,例如在高级语言的词法分析器中,当识别出一个关键字时,它应该向语法分析器返回该关键字的内部编码。lex并不是一个完整的语言,它只是某种高级语言(称为lex的宿主语言)的扩充,因此,lex没有为描述动作设计新的语言,而是借助其宿主语言来描述动作。lex自动地把表示输入串词法结构的正规式及相应的动作

37、转换成一个宿主语言的程序,即词法分析程序,它有一个固定的名字yylex,在这里yylex是一个c语言程序。32 c语言简介语言是在 70 年代初问世的。一九七八年由美国电话电报公司(at&t)贝尔实验室正式发表了语言。同时由b.w.kernighan和d.m.ritchit合著了著名的“the c programming language”一书。通常简称为k&r,也有人称之为k&r标准。但是,在k&r中并没有定义一个完整的标准c 语言,后来由美国国家标准协会(american national standards institute)在此基础上制定了一个c 语言标准,于一九八三年发表。通常称之

38、为ansi c。早期的c 语言主要是用于unix系统。由于语言的强大功能和各方面的优点逐渐为人们认识,到了八十年代,c开始进入其它操作系统,并很快在各类大、中、小和微型计算机上得到了广泛的使用,成为当代最优秀的程序设计语言之一。目前最流行的语言有以下几种: microsoft c 或称 ms c borland turbo c 或称 turbo c at&t c这些语言版本不仅实现了ansi c标准,而且在此基础上各自作了一些扩充,使之更加方便、完美。语言的特点:1c语言简洁、紧凑,使用方便、灵活。ansi c一共只有32个关键字:autobreakcasecharconstcontinued

39、efaultdo double else enum extern float for goto if int long register return short signed static sizof struct switch typedef union unsigned void volatilewhile9种控制语句,程序书写自由,主要用小写字母表示,压缩了一切不必要的成分。turbo c扩充了11个关键字:asm_cs_ds_es_sscdeclfarhugeinterruptnearpascal注意:在c语言中,关键字都是小写的。2运算符丰富。共有34种。c把括号、赋值、逗号等都作

40、为运算符处理。从而使c的运算类型极为丰富,可以实现其他高级语言难以实现的运算。3数据结构类型丰富。4具有结构化的控制语句。5语法限制不太严格,程序设计自由度大。6c语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。因此有人把它称为中级语言。7生成目标代码质量高,程序执行效率高。8与汇编语言相比,用c语言写的程序可移植性好。但是,c语言对程序员要求也高,程序员用c写程序会感到限制少、灵活性大,功能强,但较其他高级语言在学习上要困难一些。c语言的字符集:字符是组成语言的最基本的元素。语言字符集由字母,数字,空格,标点和特殊字符组成。在字符常量,字

41、符串常量和注释中还可以使用汉字或其它可表示的图形符号。 1.字母小写字母az共26个大写字母az共26个 2.数字09共10个 3.空白符空格符、制表符、换行符等统称为空白符。空白符只在字符常量和字符串常量中起作用。在其它地方出现时,只起间隔作用,编译程序对它们忽略不计。因此在程序中使用空白符与否,对程序的编译不发生影响,但在程序中适当的地方使用空白符将增加程序的清晰性和可读性。4.标点和特殊字符c语言词汇: 在语言中使用的词汇分为六类:标识符,关键字,运算符,分隔符,常量,注释符等。 1.标识符 在程序中使用的变量名、函数名、标号等统称为标识符。除库函数的函数名由系统定义外,其余都由用户自定

42、义。c 规定,标识符只能是字母(az,az)、数字(09)、下划线(_)组成的字符串,并且其第一个字符必须是字母或下划线。 以下标识符是合法的:a, x, x3, book_1, sum5 以下标识符是非法的: 3s 以数字开头 s*t 出现非法字符* -3x 以减号开头 bowy-1 出现非法字符-(减号) 在使用标识符时还必须注意以下几点: (1)标准c不限制标识符的长度,但它受各种版本的c 语言编译系统限制,同时也受到具体机器的限制。例如在某版本c 中规定标识符前八位有效,当两个标识符前八位相同时,则被认为是同一个标识符。 (2)在标识符中,大小写是有区别的。例如book和book 是两

43、个不同的标识符。 (3)标识符虽然可由程序员随意定义,但标识符是用于标识某个量的符号。因此,命名应尽量有相应的意义,以便于阅读理解,作到“顾名思义”。 2.关键字 关键字是由语言规定的具有特定意义的字符串,通常也称为保留字。用户定义的标识符不应与关键字相同。语言的关键字分为以下几类: (1)类型说明符 用于定义、说明变量、函数或其它数据结构的类型。如前面例题中用到的int,double等 (2)语句定义符 用于表示一个语句的功能。如例1.3中用到的if else就是条件语句的语句定义符。 (3)预处理命令字 用于表示一个预处理命令。如前面各例中用到的include。 3.运算符 语言中含有相当

44、丰富的运算符。运算符与变量,函数一起组成表达式,表示各种运算功能。运算符由一个或多个字符组成。 4.分隔符 在语言中采用的分隔符有逗号和空格两种。逗号主要用在类型说明和函数参数表中,分隔各个变量。空格多用于语句各单词之间,作间隔符。在关键字,标识符之间必须要有一个以上的空格符作间隔,否则将会出现语法错误,例如把int a;写成 inta;c编译器会把inta当成一个标识符处理,其结果必然出错。 5.常量 c 语言中使用的常量可分为数字常量、字符常量、字符串常量、符号常量、转义字符等多种。在后面章节中将专门给予介绍。 6.注释符c 语言的注释符是以“/*”开头并以“*/”结尾的串。在“/*”和“

45、*/”之间的即为注释。程序编译时,不对注释作任何处理。注释可出现在程序中的任何位置。注释用来向用户提示或解释程序的意义。在调试程序中对暂不使用的语句也可用注释符括起来,使翻译跳过不作处理,待调试结束后再去掉注释符。33软件工程方法论的应用 软件工程是指导计算机软件开发和维护的工程学,采用工程的概念、原理、技术、和方法开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来。 自从1968年在联邦德国召开的国际会议上正式提出并使用了“软件工程”这个术语以来,研究软件工程的专家学者们陆续提出了100多条关于软件工程的准则或“信条”。著名的软件工程专家b.w.boeh

46、m综合这些学者们的意见并总结了trw公司多年开发软件的经验,于1983年在一篇论文中提出软件工程的七条原理。他认为这七条原理是确保软件产品质量和开发效率的原理的最小集合。这七条原理是互相独立的,其中任意六条原理的组合都不能代替另一条原理,因此,它们是缺一不可的最小集合,然而这七条原理又是相当完备的,人们虽然不能用数学方法严格证明它们是一个完备的集合,但是,可以证明在此之前已经提出的100多条软件工程原理都可以由这七条原理的任意组合蕴含或派生。l 用分阶段的生命周期计划严格管理经统计表明,不成功的软件项目中有一半左右是由于计划不周造成的。boehm认为,在软件的整个生命周期中应制定并严格执行六类

47、计划:项目概要计划、里程碑计划、项目控制计划、产品控制计划、验证计划、运行维护计划l 坚持进行阶段评审大部分错误是在编码之前造成的错误发现与改正得越晚,所需付出的代价越高。因此,在每个阶段都进行严格的评审,以便尽早发现在软件开发过程的错误l 实行严格的产品控制在软件开发过程中不要随意改变需求,因为改变某项需求往往需要付出较高的代价,但在实践中用户往往会提出需求变更,因此需要采取科学的产品控制技术。目前主要实行基准配置管理:基准配置是指经过阶段评审后的软件配置成分,如各个阶段产生的文档或程序代码。对涉及基准配置的修改,必须经过严格的评审,通过后才能实施修改。l 采用现代程序设计技术实践表明:采用

48、先进的技术既可提高软件开发的效率,又可提高软件维护的效率。80年代及之前:结构化分析、设计技术90年代:面向对象分析、设计技术l 结果应能清楚地审查软件产品是看不见、摸不着的逻辑产品,开发过程难以评价和管理。根据软件开发项目的总目标及完成期限,规定开发组织的责任和产品标准,使所得的结果能够清楚地审查l 开发小组的人员应该少而精开发小组人员的素质和数量是影响软件产品质量和开发效率的重要因素。开发小组人员数目的增加,使相互交流复杂、费用增加。l 承认不断改进软件工程实践的必要性遵循前6条基本原理,就能够按照当代软件工程基本原理实现软件的工程化生产,但不能保证赶上时代前进的步伐。积极主动采纳新的软件

49、技术,且不断总结经验软件工程的传统途径是“生命周期法”,强调“结构化分析、结构化设计”。(1)“生命周期法”的起源 人类解决复杂问题时普遍采用的一个策略是“各个击破”,也就是对问题进行分解,然后再分别解决各个子问题的策略。 软件工程采用的“生命周期法”,就是从时间角度对软件开发和维护的复杂问题进行分解,把软件生存的漫长周期依次划分为若干个阶段,每个阶段有相对独立的任务,然后再逐步完成每个阶段的任务。(2)生命周期划分的原则各阶段的任务彼此间尽可能相对独立,同一个阶段各项任务的性质尽可能相同,从而降低每个阶段任务的复杂性,简化不同阶段之间的联系,有利于软件开发过程的组织管理。(3) 生命周期的划

50、分软件生命周期一般分为:软件定义(问题定义、可行性研究、需求分析)、软件开发(总体设计、详细设计、编码和单元测试、综合测试)、软件维护等三个时期。软件工程各阶段的基本任务l 问题定义:问题定义阶段需要回答的关键问题是:“有解决的问题是什么?”通过问题定义阶段的工作,系统分析员应该提出关于问题性质、工程目标和规模的书面报告。通过对实际用户和使用部门负责人的访问调查,分析员扼要地写出他对问题的理解,并在用户和使用部门负责人的会议上认真讨论这份书面报告,澄清含糊不清的地方,改正理解不正确的地方,最后得到一份双方都满意的文档。l 可行性研究这个阶段要回答的关键问题是:“对于上一个阶段所确定的问题有行的

51、通的解决方法吗?”在问题定义阶段提出的对工程目标和规模的报告通常比较模糊。可行性研究阶段应该导出系统的高层逻辑模型(通常用数据流图表示),并且在此基础上更准确、更具体地确定工程规模和目标。然后分析员更准确地估计系统的成本和效益,对建议的系统进行仔细的成本/效益分析。l 需求分析 这个阶段的任务是“为了解决这个问题,目标系统必须做什么”,主要是确定目标系统必须具备哪些功能。在需求分析阶段确定的系统逻辑模型是以后设计和实现目标系统的基础,因此必须准确完整地体现用户的要求。该阶段有写的文档有规格说明书、初步的用户使用手册、系统功能框架图等。l 总体设计这个阶段要回答的关键问题是:“概括地说,应该如何

52、解决这个问题?”首先应该考虑几种可能的解决方案。例如,目标系统的一些主要功能是用计算机自动完成还是用人工完成。通常至少考虑下述几类可能的方案:低成本解决方案、中等成本的解决方案和高成本的“十全十美”的系统。系统分析员应该使用系统流程图或者其他工具描述每种可能的系统。l 详细设计总体设计阶段以比较抽象概括的方式提出了解决问题的方法。详细设计阶段的任务就好似把解决方法具体化,也就是回答下面这个关键问题:“应该怎样具体地实现这个系统呢?”这个阶段的任务还不是编写程序,而是设计出程序的详细规格说明。通常用hipo图(层次图加输入/处理/输出图)或pdl语言(过程设计语言)描述详细的结果。该阶段要产生的文档有伪代码、详细的测试计划、最终的用户使用手册等。l 编码和单元测试这个阶段的关键任务是写出正确的容易理解、容易维护的程序模块。程序员应该根据目标系统的性质和实际环境,选取一种适当的高级程序设计语言,把详细设计的结果翻译成用选定的语言书写的程序,并且仔细测试编写出的每一个模块。l 综合测试这个阶段的主要任务是通过各种类型的测试(及相应的调试)使软件达到预定的要求。最基本的测试是集成测试和验收测试。所谓集成测试是根据设计的软件结构,把经过单元测试检验的模块按某种选定的策略装

温馨提示

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

评论

0/150

提交评论