C语言程序环境与预处理回顾总结

大概讲解与铺垫

  1. 首先,什么叫c语言的源代码?也就是我自己写的.c文件里面的代码,这个就叫做源代码。
  2. 然后需要知道的是计算机他只认识二进制,因此他只能接收与执行二进制指令。也就是可执行的机器指令。
  3. 然后我们必须得知道,实际上存在着翻译环境与执行环境。在这两种不同的环境之下,会执行不同的操作。
  4. 翻译环境里面干的操作就是把我写的源码转化为计算机能看懂的二进制指令,也就是可执行的机器指令,然后执行环境里面就是实际执行代码。
  5. 我们这边着重去探讨一下翻译环境下的细节。源码转化为计算机能够识别的机器指令就是依赖于翻译环境,换句话来说,翻译环境实际上就是把test.c文件经过一系列处理变成test.exe文件(我知道.exe就是可执行程序,实际上都已经是人是看不懂的,但计算机倒是能看懂的一些二进制指令)
  6. 像我们使用的VS 2019被称为集成开发环境,里面自然就集成了编译环境与执行环境与一体。
  7. C语言程序环境与预处理回顾总结_第1张图片
  8. 如图:在翻译环境下,分为两个部分,就是编译加链接。然后编译又分为三个部分:预处理,编译,汇编。在这三个部分当中新的test.c文件会分别变为test.i,test.s,test.obj,然后汇编执行完之后进行链接,完了之后变为test.exe。对于不同的源文件经过编译器互相互独立,单独进行编译会单独生成一个又一个.obj目标文件,然后这些各自相互独立生成的目标文件在经过链接器会统一生成一个可执行程序。这可执行程序里面就是可执行的机器指令。这就是整个翻译环境下的大概过程。

翻译环境之编译之预处理

  1. 先是翻译环境下的编译下的第一个阶段预处理,当然在现阶段各个.c文件都是各自相互独立的进行的。预处理完系统不会默认生成,但你可以通过gcc命令去生成一个xxx.i文件.
  2. 在这个预处理阶段主要干一些什么事呢?就是删除注释啊,处理预处理指令啊。处理预定义符号啊等等。其中这个预处理指令就包括#include, #define定义的常量与宏等,你会发现其实都是一些文本操作,比如替换与删除。其实没有啥本质意义。再次强调一遍:注意都是一些文本操作,比如切换与删除。这个预处理阶段没有啥高级的。

翻译环境之编译之编译

  1. 接下来就是编译阶段,这个阶段完成之后gcc会默认自动生成xxx.s文件.
  2. 这一步实际上是在干什么呢?就是把c语言被预处理之后的代码翻译成汇编代码。当然里面的细节更是繁多。
  3. 尤其需要注意一下这个符号汇总所谓的这个符号就是具有全局性质的变量名与函数名。然后把他们给汇总记录一下。

翻译环境之编译之汇编

  1. 接下来就进入汇编阶段,gcc会默认自动生成xxx.obj文件/xxx.o文件,也就是目标文件。
  2. 当生成该文件的时候,这个文件里面已经是二进制指令了,直接打开也打不开的,需要借助于readelf,当然具体的细节就不讲了
  3. 反正这个汇编阶段相当于就是把汇编代码给他划分为一个一个段,然后转换为二进制指令。当然具体细节非常多。
  4. 有一个需要特别注意,就是形成符号表。就是说把你之前汇总的符号再加上对应的地址怎么合起来就形成了一个符号表。
  5. 上面的这些编译过程(预处理,编译,汇编)都是各个.c文件编译器当中各自完全独立而走一遍,生成了各自的.obj目标文件。

翻译环境之链接

  1. 接下来就是链接阶段,这个阶段主要分为两个步骤,一个是合并段表,一个是符号表的合并与重定位。
  2. 因为我们知道在汇编阶段,把汇编代码首先分成一个一个的段,然后给它转为二进制指令。那这边就先把之前相互独立的obj文件里面的各自的段全部整合在一起。这个就是合并段表。
  3. 符号表的合并与重定位就是把之前互相独立的编译过程中产生的各自的符号表也整合在一起。这时候之前的符号表的作用就体现出来了嘛,在链接的时候,我就需要通过符号表去查找地址处。然后之前生成的随机地址的话,就用正确的地址给他替代掉。如果说找不到相应的内容,那就会报错。

执行环境

  1. 接下来就是执行环境,执行环境的话必须得载入到内存当中去进行。然后函数栈帧的开辟啦,什么啦,什么啦等等。

关于预处理阶段等的回顾与补充

  1. 还是要回过头来对预处理阶段进行一个回顾,预处理阶段主要是用来删除注释,处理预定义符号,处理预处理指令,一般都是一些文本操作,比如说删除与替换。
  2. 这些预定义符号都是语言本身内置的。
    C语言程序环境与预处理回顾总结_第2张图片
    C语言程序环境与预处理回顾总结_第3张图片
  3. #define 的核心其实就是替换。注意,在字符串当中是不搜索进去的。

C语言程序环境与预处理回顾总结_第4张图片
C语言程序环境与预处理回顾总结_第5张图片
C语言程序环境与预处理回顾总结_第6张图片
C语言程序环境与预处理回顾总结_第7张图片

你可能感兴趣的:(C语言,c语言)