当前位置: 首页 > news >正文

编译和链接知识点

为什么我们在vs等编译器上写出的代码通过运行就会实现相关功能呢?

解决这个问题的关键就是关于编译与链接的知识。

首先从大的分类里有两部分:编译和链接

而编译这一大的部分又分为预处理(也叫预编译),编译,汇编三个小的部分。

第一步:

我们一开始写代码之前,要创建一个文件,这个文件就叫源文件,而引用#include<stdio.h>等一系列的文件就叫头文件(.h就是.head的缩写),我们可以创建多个源文件,也可以同时引用<string.h>,<math.h>多个头文件,它们全部都包括在一个以.c结束的文件里,也就是说,我们写的代码全部放在了.c文件里面了。

第二步:

然后我们使用的vs,dev等编译器就会经过编译(预处理,编译,汇编三部分)成为目标文件(windows以.obj为后缀的文件,Linux以.o为后缀的文件)

预处理——大致四个步骤

一:编译器会将我们写的代码里的#define删除,同时展开所有的宏定义

二:我们引用的头文件也会被全部展开,变成几十行的代码

三:不仅如此,还会处理所有的条件编译指令,如#if,#endif等等

四:我们写的注释也会全部消失不见

最后经过预处理后的文件就会变成以.i为后缀的文件

编译——大致三个步骤(将我们的高级语言编译成汇编语言再编译成机器指令)

一:词法分析

词法分析就是编译器中的扫描器将我们写的代码全部分解为每个记号(相当于一个英语句子拆分成每个字母)

例如array[index]=(index+4)*(2+6)就会拆分成以下16个记号

二:语法分析

在刚刚词法分析中拆分的各个记号中,编译器中的语法分析器开始分析每个记号组成的语句含义(就相当于在一堆积木中,选出哪几块积木可以搭建成门,哪几块积木可以搭建成桥,开始分类)

只不过分类的方式采用树的方式,形成语法树

三:语义分析

在刚刚形成的语法树的基础上,编译器中的语义分析器会分析声明和类型的匹配,类型的转换等,这个阶段会报告错误的语法信息

汇编—— 一个步骤

将汇编代码转变为机器可执行的指令(也就是二进制语言,我们无法看懂的语言)

第三步:

链接(将目标文件.obj转换为可执行文件.exe)

这一部分主要就是将所有的目标文件.obj合并(链接)为一个可执行文件.exe,其中大致分为两个部分,一部分是数据,另一部分叫做符号表(记录函数的名字和地址),每个全局变量和函数(不包括局部变量,因为它的空间在栈帧中),所有的数据合并在一起,同时符号表也合并在一起,此时如果有些函数一开始是使用extern声明的,然后又编写了该函数,那么此时符号表中就会出现两个该函数名和该函数的地址,因为声明函数的时候什么都不知道,所以机器会将该声明的函数地址记为非法地址,而当我们真正写函数时,机器才会给我们一个有效地址,当符号表合并时,就会出现重复的函数名,此时机器就会比较这两个地址哪一个是该函数的真正地址,将真正的地址覆盖非法地址,这个地址修改的过程也被叫做:重定义

所以当我们函数名写错时,自然也就找不到重复的函数名,引用函数时也就找不到创建函数的地址

最后形成的可执行文件.exe对于计算机来说就能看懂了,于是我们写的程序也就经过计算机最后运行出来了。

http://www.lryc.cn/news/328452.html

相关文章:

  • 大话设计模式之工厂模式
  • Windows MySQL通过data 文件夹恢复数据
  • ARP协议定义及工作原理
  • express实现用户登录和注册接口
  • 数字化转型,效率增长才是王道
  • RHCE-2-chrony服务器
  • 音频RK809
  • 解决 linux 服务器 java 命令不生效问题
  • 22 多态
  • 排序算法超详细代码和知识点整理(java版)
  • Java复习第十二天学习笔记(JDBC),附有道云笔记链接
  • Python从零到一构建GPT模型
  • V R虚拟现实元宇宙的前景|虚拟现实体验店加 盟合作|V R设备在线购买
  • 大话设计模式之策略模式
  • 蓝桥杯23年第十四届省赛真题-三国游戏|贪心,sort函数排序
  • P15:PATH环境变量
  • math模块篇(七)
  • wordpress插件,免费的wordpress插件
  • Remote Desktop Manager for Mac:远程桌面管理软件
  • 如何撰写研究论文
  • 数据结构
  • 动态规划相关题目
  • iOS - Runtime - Class-方法缓存(cache_t)
  • 2014年认证杯SPSSPRO杯数学建模B题(第一阶段)位图的处理算法全过程文档及程序
  • 【物联网项目】基于ESP8266的家庭灯光与火情智能监测系统——文末完整工程资料源码
  • Unity中控制帧率的思考
  • 阿里云子域名配置,且不带端口访问
  • C#-ConcurrentDictionary用于多线程并发字典
  • 深入探讨多线程编程:从0-1为您解释多线程(下)
  • 深度学习pytorch——减少过拟合的几种方法(持续更新)