c语⾔程序从源代码到⼆进制机器码,C语⾔源代码转变为可执
⾏程序的过程
Hello.c
#includeint main()
{
printf("Hello World\0");
return 0;
}
我们在VS下只需要Ctrl+F5便能打印出Hello World,
在Linux下也只需要两⾏命令
gcc Hello.c
.
/a.out
但程序为什么要被编译器编译之后才能运⾏?
因为计算机能够识别的只有机器语⾔,机器语⾔就是由⼆进制0和1构成。所以为了让计算机执⾏我们写的程序,必须翻译成计算机能够识别的机器语⾔程序(⽬标程序)。
编译器把C语⾔程序转换成可以执⾏的机器码的过程做了什么?怎么做的?
1.预处理:展开头⽂件/宏替换/去掉注释/条件编译
2.编译:检查语法,⽣成汇编代码
3.汇编 :把汇编代码转化成⼆进制的机器码
4.链接 合成可执⾏的程序,并对声明 在其他⽬标⽂件到对应的定义
Linux环境下有sum.c和text.c两个源⽂件⽣成可执⾏⽂件。过程图解
过程详解:
预处理过程主要处理那些源代码⽂件中的以“#”开始的预编译指令
将所有的“#define”删除,并且展开所有的宏定义。
处理所有条件预编译指令
处理#include预编译指令,将包含的⽂件插⼊到该预编译指令的位置。(这个过程是递归进⾏的,也就是说被包含的⽂件可能还包含其他⽂件)
删除所有的注释
添加⾏号和⽂件名标识,以便于编译时编译器产⽣的调式⽤的⾏号信息及⽤于编译时产⽣编译错误或警告时能够显⽰⾏号。
保留所有的#pragma编译器指令,因为编译器须要使⽤它们。
编译:
编译过程就是把预处理完的⽂件进⾏⼀系列词法分析、语法分析、语义分析及优化后⽣产相应的汇编
代码⽂件。
编译器就是将⾼级语⾔翻译成机器语⾔的⼀个⼯具
编译过程⼀般可以分成6步:扫描、语法分析(语法树)、语义分析、源代码优化、代码⽣成和⽬标代码优化
编译器所能分析的语义是静态语义(即在编译期可以确定的语义){动态语义:只有在运⾏期才能确定的语义。},包括:声明和类型的匹配,类型的转换。
汇编:
汇编器是将汇编代码转变成机器可以执⾏的指令,每⼀个汇编语句⼏乎对应⼀条机器指令。
链接:
把各个模块之间相互引⽤的部分都处理好,使得各个模块之间能够正确的衔接。
html代码转链接链接过程主要包括地址和空间分配、符号决议和重定位等这些步骤。
重定位所做的就是给程序中每个这样的绝对地址引⽤的位置“打补丁”,使它们指向正确的地址。
链接的接⼝--------符号
链接过程的本质就是要把多个不同的⽬标⽂件之间相互粘到⼀起。
在链接中,⽬标⽂件之间相互拼合实际上是⽬标⽂件之间对地址的引⽤,即对函数和变量的地址的引⽤
在链接中,我们将函数和变量统称为符号,函数名和变量名就是符号名
每⼀个⽬标⽂件都会有⼀个相应的符号表,这个表⾥⾯记录了⽬标⽂件中所⽤到的所有符号,每个定义的符号有⼀个对应的值,叫做符号值,对于变量和函数来说,符号值就是它们的地址、
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论