《C语言开发从入门到精通》一1.3 理解编译系统——学习的第一步

简介:

本节书摘来自异步社区《C语言开发从入门到精通》一书中的第1章,第1.3节,作者王长青 , 韩海玲,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.3 理解编译系统——学习的第一步

知识点讲解:光盘:视频PPT讲解(知识点)第1章理解编译系统.mp4

C语言是一门DOS环境下的开发语言,在执行前需要先将其编译,才能正确运行执行结果。要想真正理解编译系统的原理,重要的是要理解何谓“编译”。编译是一个过程,通过这个过程可以把高级语言变成计算机可以识别的二进制语言。计算机只认识1和0格式的二进制数据,编译程序可以把人们熟悉的语言换成二进制的形式。

要想通过编译把一个源程序翻译成目标程序,所做的工作过程分为如下5个阶段:

(1)词法分析。

(2)语法分析。

(3)语义检查中间代码生成。

(4)代码优化。

(5)目标代码生成。

在上述过程中,最为主要的阶段是进行词法分析和语法分析,这又称为源程序分析。如果在分析过程中发现有语法错误,会给出对应的提示信息。具体编译流程如图1-1所示。


9c8e12122107642a278905d4c3311ed078a929f2

图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%


c647d9c27c3c5e8f5e96d51f80b23fd6dd107a56

图1-2 成功提示
相关文章
|
1月前
|
C语言
教你快速理解学习C语言的循环与分支
教你快速理解学习C语言的循环与分支
15 0
|
2月前
|
存储 传感器 物联网
结合物联网开发探讨C语言的变量
在物联网(IoT)开发中,C语言的变量起着至关重要的作用。由于物联网设备资源有限,C语言的高效性和对硬件的直接控制使其成为开发嵌入式系统的首选。
|
3月前
|
Linux Shell C语言
C语言与驱动开发基础
C语言与驱动开发基础
36 0
|
3月前
|
编译器 C语言
C语言函数的学习
掌握函数的使用是学习C语言的关键一环,理解和应用这些基本的函数概念将使你能够更有效地利用C语言的强大功能。
23 0
|
5月前
|
存储 移动开发 C语言
技术心得记录:嵌入式开发中常用到的C语言库函数
技术心得记录:嵌入式开发中常用到的C语言库函数
57 1
|
5月前
|
存储 程序员 Go
|
5月前
|
存储 编译器 C语言
c语言学习历程【1】
c语言学习历程【1】
68 1
|
5月前
|
测试技术 C语言
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
数据结构学习记录——树习题—Tree Traversals Again(题目描述、输入输出示例、解题思路、解题方法C语言、解析)
45 1
|
5月前
|
C语言
C语言学习记录——动态内存开辟常见的错误
C语言学习记录——动态内存开辟常见的错误
33 1
|
5月前
|
C语言