本节书摘来自异步社区《C语言开发从入门到精通》一书中的第1章,第1.3节,作者王长青 , 韩海玲,更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.3 理解编译系统——学习的第一步
知识点讲解:光盘:视频PPT讲解(知识点)第1章理解编译系统.mp4
C语言是一门DOS环境下的开发语言,在执行前需要先将其编译,才能正确运行执行结果。要想真正理解编译系统的原理,重要的是要理解何谓“编译”。编译是一个过程,通过这个过程可以把高级语言变成计算机可以识别的二进制语言。计算机只认识1和0格式的二进制数据,编译程序可以把人们熟悉的语言换成二进制的形式。
要想通过编译把一个源程序翻译成目标程序,所做的工作过程分为如下5个阶段:
(1)词法分析。
(2)语法分析。
(3)语义检查中间代码生成。
(4)代码优化。
(5)目标代码生成。
在上述过程中,最为主要的阶段是进行词法分析和语法分析,这又称为源程序分析。如果在分析过程中发现有语法错误,会给出对应的提示信息。具体编译流程如图1-1所示。
图1-1 编译系统结构流程
接下来开始讲解上述5个阶段的具体过程。
1.词法分析
词法分析的任务是对由字符组成的单词进行处理,从左至右逐个字符地对源程序进行扫描,产生一个个的单词符号,把作为字符串的源程序改造成为单词符号串的中间程序。执行词法分析的程序称为词法分析程序或扫描器。
2.语法分析
编译程序的语法分析器以单词符号作为输入,分析单词符号串是否形成符合语法规则的语法单位,如表达式、赋值、循环等,最后看是否构成一个符合要求的程序,按该语言使用的语法规则分析检查每条语句是否有正确的逻辑结构,程序是最终的一个语法单位。编译程序的语法规则可用上下文无关文法来刻画。语法分析的方法有两种。
自上而下分析法:从文法的开始符号出发,向下推导,推出句子。
自下而上分析法:使用移进归约法,基本思想是用一个寄存符号的先进后出栈,把输入符号一个一个地移进栈里,当栈顶形成某个产生式的一个候选式时,即把栈顶的这一部分归成该产生式的左邻符号。
3.语义检查中间代码生成
中间代码是源程序的一种内部表示,也称为中间语言。中间代码的作用是使编译程序的结构在逻辑上更为简单明确,特别是使目标代码的优化更容易实现。中间代码即为中间语言程序,中间语言的复杂性介于源程序语言和机器语言之间。中间语言有多种形式,其中最为常见的有4种:逆波兰记号、四元式、三元式和树。
4.代码优化
代码优化是指对程序进行多种等价变换,使得从变换后的程序出发,能生成更有效的目标代码。所谓等价,是指不改变程序的运行结果。有效是指目标代码运行时间较短,而且占用的存储空间较小。这种变换称为优化。
5.目标代码生成
目标代码生成是编译的最后一个阶段。通过目标代码生成器,把语法分析后或优化后的中间代码变换成目标代码。
另外,还有下面两个过程。
1.表格管理程序
编译过程中源程序的各种信息被保留在不同的表格中,编译各阶段的工作都涉及构造、查找或更新有关的表格。
2.出错处理程序
如果编译过程中发现源程序有错误,编译程序将报告错误的性质和错误发生的地点,并且将错误所造成的影响限制在尽可能小的范围内,使得源程序的其余部分能继续被编译下去。有些编译程序还能自动纠正错误,这些工作由错误处理程序完成。
了解了“编译”过程后,整个编译系统概念便一目了然。编译系统就是按照编译原理集合而成的一种机制,这种机制能够实现对程序语言的上述处理。
系统编译与发布是在系统编码之后执行的一项基本操作。编译是用于生成可执行代码,发布是将编译之后的可运行版本发布到服务器,以供用户使用。在编译过程中,编译器将代码翻译成中间语言(MSIL)。运行时会将MSIL翻译成CPU特定的指令,以便计算机上的处理器运行应用程序。应用程序通过编译可以提高代码的运行速度,增加代码的安全性和稳定性。
因为C语言独有的DOS环境特性,所以,在编译时会变得十分麻烦。但是幸好已经有多种编译器工具,通过这些工具可以简捷实现对C语言程序的编译、运行和调试。例如通过专用的编译器,可以对1.2节中的C语言代码进行编译和运行处理,假设使用Turbo C进行编译。
在Turbo C中编写上述代码后,可以按下【F9】键进行编译并链接,成功后弹出成功提示,如图1-2所示。
80%
图1-2 成功提示