网站建设方案实验报告,广州市羊城晚报,许昌住房城乡建设局网站,wordpress 存储空间文章目录 一.程序的翻译环境和运行环境二.翻译环境#xff1a;预编译编译汇编链接#xff08;一#xff09;预编译#xff08;二#xff09;编译1#xff09;词法分析2#xff09;语法分析3#xff09;语义分析 #xff08;三#xff09;汇编(四#xff09;链接1.编… 文章目录 一.程序的翻译环境和运行环境二.翻译环境预编译编译汇编链接一预编译二编译1词法分析2语法分析3语义分析 三汇编(四链接1.编译过程中进行符号汇总2.汇编过程中生成符号表3.链接符号表汇总 运行环境 一.程序的翻译环境和运行环境 在ANSI C的任何⼀种实现中存在两个不同的环境。 第1种是翻译环境在这个环境中源代码被转换为可执⾏的机器指令。 第2种是执行环境它⽤于实际执⾏代码 二.翻译环境预编译编译汇编链接
翻译环境 一个程序可能不止一个.c文件 • 多个.c⽂件单独经过编译出编译处理⽣产对应的目标文件 • 多个⽬标⽂件和链接库⼀起经过链接器处理⽣成最终的可执⾏程序。 • 链接库是指运⾏时库(它是⽀持程序运⾏的基本函数集合)或者第三⽅库。
编译过程可以分为预处理编译汇编三个阶段。
一预编译
1.将所有的#define删除展开所有的宏定义
//预处理前
#define M 5
int main()
{int a M;return 0;
}//预处理后
int main()
{
int a5;
return 0;
}2.处理所有的条件编译指令如#if、#ifdef、#elif、#else、#endif 。 3.处理#include 预编译指令将包含的头⽂件的内容插⼊到该预编译指令的位置。这个过程是递归进⾏的也就是说被包含的头⽂件也可能包含其他⽂件。
#includestdio.h
//将头文件插入到目标文件中4.删除所有的注释以减小目标文件的大小。 5.添加行号和文件名标识⽅便后续编译器⽣成调试信息等。 6.或保留所有的#pragma的编译器指令编译器后续会使⽤。
二编译
把c语言代码翻译成汇编代码 编译过程就是将预处理后的⽂件进⾏⼀系列的词法分析、语法分析、语义分析及优化⽣成相应的汇编代码⽂件。 对下⾯代码进⾏编译的时候会怎么做呢假设有下⾯的代码 array[index] (index4)*(26);1词法分析 将代码分割成一系列的记号例如**关键字、标识符、字⾯量、特殊字符等** 2语法分析 接下来语法分析器将对扫描产⽣的记号进⾏语法分析从⽽产⽣语法树。这些语法树是以表达式为节点的树。 3语义分析 由语义分析器来完成语义分析,编译器所能做的分析是语义的静态分析。通常包括声明和类型的匹配类型的转换等。这个阶段会报告错误的语法信息。 4符号汇总 在后面链接部分会讲到 汇总的符号一般是全局的符号
三汇编
把汇编代码翻译成了二进制的指令生产了.o文件目标文件生成符号表 汇编器是将汇编代码转转变成机器可执⾏的指令每⼀个汇编语句⼏乎都对应⼀条机器指令。就是根 据汇编指令和机器指令的对照表⼀⼀的进⾏翻译也不做指令优化 (四链接 链接目标文件和链接库生成可执行程序二进制程序 1.符号表的汇总 2.符号表的合并和重定义 1.编译过程中进行符号汇总
前面我们说到在编译过程中会进行符号汇总。 在如下add.c文件中汇总到一个 Add符号 在test.c文件中汇总到 Add和main
2.汇编过程中生成符号表 3.链接符号表汇总 运行环境
程序必须载⼊内存中。在有操作系统的环境中⼀般这个由操作系统完成。在独⽴的环境中程序的载⼊必须由⼿⼯安排也可能是通过可执⾏代码置⼊只读内存来完成。程序的执⾏便开始。接着便调⽤main函数。开始执⾏程序代码。这个时候程序将使⽤⼀个运⾏时堆栈stack存储函数的局部变量和返回地址。程序同时也可以使⽤静态static内存存储于静态内存中的变量在程序的整个执⾏过程⼀直保留他们的值。终⽌程序。正常终⽌main函数也有可能是意外终⽌。
码字不易感谢观看。
如果对你有帮助的话记得点赞评论关注哦