编译预处理是特指什么过程
编译,编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。
如果用一张图来表示:
读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理
[析] 伪指令主要包括以下四个方面
(1)宏定义指令,如#define Name TokenString,#undef等。对于前一个伪指令,预编译所要做的是将程序中的所有Name用TokenString替换,但作为字符串常量的Name则不被替换。对于后者,则将取消对某个宏的定义,使以后该串的'出现不再被替换。
(2)条件编译指令,如#ifdef,#ifndef,#else,#elif,#endif,等等。这些伪指令的引入使得程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。预编译程序将根据有关的文件,将那些不必要的代码过滤掉
(3)头文件包含指令,如#include "FileName"或者#include 等。在头文件中一般用伪指令#define定义了大量的宏(最常见的是字符常量),同时包含有各种外部符号的声明。采用头文件的目的主要是为了使某些定义可以供多个不同的C源程序使用。因为在需要用到这些定义的C源程序中,只需加上一条#include语句即可,而不必再在此文件中将这些定义重复一遍。预编译程序将把头文件中的定义统统都加入到它所产生的输出文件中,以供编译程序对之进行处理。
包含到c源程序中的头文件可以是系统提供的,这些头文件一般被放在/usr/include目录下。在程序中#include它们要使用尖括号(<>)。另外开发人员也可以定义自己的头文件,这些文件一般与c源程序放在同一目录下,此时在#include中要用双引号("")。
(4)特殊符号,预编译程序可以识别一些特殊的符号。例如在源程序中出现的LINE标识将被解释为当前行号(十进制数),FILE则被解释为当前被编译的C源程序的名称。预编译程序对于在源程序中出现的这些串将用合适的值进行替换。
注意:
预编译程序所完成的基本上是对源程序的“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同。下一步,此输出文件将作为编译程序的输出而被翻译成为机器指令。
‘贰’ C语言文件的编译与执行的四个阶段并分别描述
C语言程序的执行经历了四个主要阶段:预处理、编译、链接和运行。以下是这四个阶段的详细描述:
1. **预处理阶段**:
在这个阶段,C语言源代码被预处理器(C Preprocessor, CPP)处理。预处理器会处理所有包含的文件指令(如#include),展开宏定义(如#define),并处理条件编译指令(如#ifdef、#ifndef)。预处理后的结果被保存为扩展名为.i的文件。
2. **编译阶段**:
编译器接下来对预处理后的.i文件进行编译。编译过程包括词法分析(识别源代码中的单词和符号)、语法分析(检查单词和符号的组合是否符合C语言的语法规则)、语义分析(确保代码有意义,比如变量使用前已经定义)以及代码优化。编译的最终产物是一个或多个扩展名为.s的汇编语言文件,以及一个.o的目标文件,该文件包含了可以被计算机处理器直接执行的指令。
3. **链接阶段**:
链接器将一个或多个目标文件.o合并成一个可执行文件.exe。在这个过程中,链接器还会处理程序中调用的外部函数,确保这些函数在程序运行时可以被找到。如果程序中使用了标准库函数,链接器会连接到这些函数所在的库文件上。
4. **运行阶段**:
最后,可执行文件.exe在计算机上运行。操作系统加载该文件到内存中,并从程序的入口点开始执行指令,直到程序结束或者遇到中断(如用户输入、系统调用等)。
通过这四个阶段,C语言源代码最终被转换为可以在特定处理器上执行的程序。
‘叁’ 编译器是如何运行的
编译器运行的主要过程包括以下几个步骤:
源代码输入:
编译器首先接收高级编程语言编写的源代码作为输入。
预处理:
在这一阶段,预处理器会对源代码进行处理,包括宏展开、文件包含、条件编译等,生成预处理后的代码。
编译:
编译器将预处理后的代码转换为汇编代码或中间表示。这一步是编译器工作的核心,涉及词法分析、语法分析、语义分析、中间代码生成、代码优化等多个子步骤。
词法分析:将源代码转换为一系列的标记。
语法分析:根据语言的语法规则,将标记序列转换为抽象语法树。
语义分析:检查代码的语义正确性,并为变量、函数等分配符号表条目。
中间代码生成:将抽象语法树转换为中间表示,便于后续的优化和代码生成。
代码优化:对中间表示进行优化,以提高生成的目标代码的运行效率。
目标代码生成:
编译器将优化后的中间表示转换为目标代码,这是计算机能直接执行的低级语言代码。
链接:
链接器将多个目标代码文件以及所需的库文件链接在一起,生成最终的可执行程序。
链接过程包括符号解析和重定位,确保程序中的函数调用、变量访问等正确指向相应的地址。
总结: 编译器是将高级编程语言代码转换为计算机能直接执行的机器代码的程序。 编译器运行的主要过程包括源代码输入、预处理、编译、目标代码生成以及链接。
‘肆’ c语言的编译过程是什么
c语言的编译过程如下:
1、预处理:预处理过程实际上是处理“#”的过程:#include包含的头文件直接拷贝到hello.c中;#define定义的宏定义进行替换,同时删除代码中没有的注释部分。2、编译:编译的过程实质上是将高级语言翻译成机器语言的过程。3、汇编:汇编器是将汇编代码转变成机器可以执行的命令,每一个汇编语句几乎都对应一条机器指令。汇编相对于编译过程比较简单,根据汇编指令和机器指令的对照表一一翻译即可。4、链接:就像hello.c中使用到了C标准库的东西“printf”,但是编译过程只是将源文件翻译成二进制文件而已,这个二进制文件还不能直接执行,还需要一个动作:将翻译成的二进制文件与需要用到的库绑定在一块。
补充:编译过程可分为6步:扫描(词法分析)、语法分析、语义分析、源代码优化、代码生成、目标代码优化。
‘伍’ 源程序到可执行程序的编译过程
源代码到可执行程序的编译过程涉及四个关键步骤:预处理、编译、汇编和链接。
预处理是程序编译的第一步,由独立的预编译器处理,不属于编译器的直接工作。它主要负责处理预处理指令,如条件编译,但并不涉及运行时间。
编译阶段将源代码转换成特定硬件平台的汇编语言,比如X86的x86汇编或ARM的ARM汇编,生成.s/.asm文件。这个过程涉及语法、词法、语义分析等六大部分,以确保变量、函数等的正确使用和错误检测。
编译过程中,符号表管理至关重要,记录了标识符及其属性,如类型、内存占用和地址,而错误管理则用于识别并报告语法错误(如拼写错误、括号匹配问题)和语义错误(如类型不匹配、作用域错误)。
从源程序到目标程序,可能会进行多次遍历以优化代码,但过多遍历会增加编译时间。最终,汇编阶段将汇编语言转换为机器语言的可重定位目标文件,如.o/.obj。
链接是编译的最后一步,将目标文件、启动代码和库文件结合,形成可执行的.exe文件。链接分为静态和动态两种,静态链接时所有库代码会直接嵌入程序,而动态链接则依赖运行时查找库。