优秀国内个人网站网址,高端品牌网站建设策略,湖南智能网站建设哪里好,大良营销网站公司从源程序到可执行文件的四个过程 预处理编译汇编链接 程序要运行起来#xff0c;必须要经过四个步骤#xff1a;预处理、编译、汇编和链接#xff0c;如下图所示#xff1a;
-E选项#xff1a;提示编译器执行完预处理就停下来#xff0c;后边的编译、汇编、链接就先不执… 从源程序到可执行文件的四个过程 预处理编译汇编链接 程序要运行起来必须要经过四个步骤预处理、编译、汇编和链接如下图所示
-E选项提示编译器执行完预处理就停下来后边的编译、汇编、链接就先不执行了。-S选项提示编译器执行完编译就停下来不去执行汇编和链接了。-c选项提示编译器执行完汇编就停下来。-o选项生成可执行文件。
预处理
预处理之后的文件仍然是一个C文件预处理过程进行的操作如下
将所有的“#define”删除并且展开所有的宏定义处理所有的条件编译指令比如“#if”、“#ifdef”、“#elif”、“#else”、“#endif”处理“#include”指令将被包含的头文件插入到该指令的位置。这个过程是递归进行的因为被包含的文件可能还包含了其他文件删除所有的注释“//”和“/* */”。添加行号。
编译
编译过程主要包括词法分析、语法分析、语义分析等操作。编译完成后生成一个 .s 文件即汇编文件。
词法分析 词法分析是使用一种叫做 lex 的程序实现词法扫描它会按照用户之前描述好的词法规则将输入的字符串分割成一个个记号。产生的记号一般分为关键字、标识符、字面量包含数字、字符串等和特殊符号运算符、等号等然后他们放到对应的表中。
语法分析 语法分析器根据用户给定的语法规则将词法分析产生的记号序列进行解析然后将它们构成一棵语法树。对于不同的语言只是其语法规则不一样。
语义分析 语法分析完成了对表达式语法层面的分析但是它不了解这个语句是否真正有意义。有的语句在语法上是合法的但是却是没有实际的意义比如说两个指针的做乘法运算这个时候就需要进行语义分析但是编译器能分析的语义也只有静态语义。 静态语义在编译期就可以确定的语义。通常包括声明与类型的匹配、类型的转换。比如当一个浮点型的表达式赋值给一个整型的表达式时其中隐含一个从浮点型到整型的转换而语义分析就需要完成这个转换再比如将一个浮点型的表达式赋值给一个指针这肯定是不行的语义分析的时候就会发现两者类型不匹配编译器就会报错。 动态语义只有在运行期才能确定的语义。比如说两个整数做除法语法上没问题类型也匹配听着好像没毛病但是如果除数是0的话这就有问题了而这个问题事先是不知道的只有在运行的时候才能发现他是有问题的这就是动态语义。
汇编
汇编对应生成的文件是目标文件目标文件由机器码写成。
链接
目标文件经过链接可以形成一个可执行文件。链接过程主要包括了符号决议和重定位。
符号决议 有时候也被叫做符号绑定、名称绑定、名称决议、或者地址绑定其实就是指用符号来去标识一个地址。比如说 int a 6这样一句代码用a来标识一个块4个字节大小的空间空间里边存放的内容就是6。
重定位 重新计算各个目标的地址过程叫做重定位重定位分为以下两步
合并相同类型的节然后链接器将运行时的内存地址赋给新的聚合节。这一步完成程序中的每条指令和全局变量都有唯一的运行时内存地址了。链接器修改代码节和数据节中对于每个符号的引用使得他们指向正确的运行时地址。