编译链接(Compile Link)


前言

在ANSI C的任何一种实现中,存在两个不同的环境。
第1种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。
第2种是执行环境,它用于实际执行代码。
接下来我们就来讲解 翻译环境


一、翻译环境

1、概念

计算机可以识别二进制指令,而我们写的代码时文本信息,计算机无法识别,需要翻译环境进行翻译后,计算机才能识别运行。

2、翻译环境的组成

翻译环境由编译和链接两部分组成

3、什么是编译链接?

如下图所示:

在这里插入图片描述

二、编译

1、编译的阶段

编译分为:
1、预编译(预处理)
2、编译
3、汇编

一共三阶段

2、预编译

VS身为集成开发环境,集成了编译器(cl.exe),链接器(link.exe)和调试器
所以VS不好演示这一过程,这里我们可以使用Linux上的gcc编译器演示

预编译处理的:
1、头文件的展开
2、注释删除
3、宏替换
这些都是文本操作,所有的预处理指令都是在预处理阶段完成的。


3、编译

编译处理的:
1、把c语言代码翻译成了汇编语言
2、语法分析
3、词法分析
4、语义分析
5、符号汇总

1、什么是语法分析?

语法分析(syntax analysis)是编译程序的核心部分,其任务是检查词法分析器输出的单词序列是否是源语言中的句子,亦即是否符合源语言的语法规则。


2、什么是词法分析?

词法分析(英语:lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。


3、什么是语义分析?

语义分析是编译过程的一个逻辑阶段, 语义分析的任务是对结构上正确的源程序进行上下文有关性质的审查,进行类型审查。语义分析是审查源程序有无语义错误,为代码生成阶段收集类型信息。比如语义分析的一个工作是进行类型审查,审查每个算符是否具有语言规范允许的运算对象,当不符合语言规范时,编译程序应报告错误。如有的编译程序要对实数用作数组下标的情况报告错误。又比如某些程序规定运算对象可被强制,那么当二目运算施于一整型和一实型对象时,编译程序应将整型转换为实型而不能认为是源程序的错误。


4、什么是符号汇总?

符号汇总:汇总全局变量
在这里插入图片描述
在这里插入图片描述


4、汇编

汇编所处理的:
1、把汇编代码形成二进制指令
2、形成符号表

1、符号表展示

在这里插入图片描述
在这里插入图片描述


三、链接

链接处理的:
1、合并段表
2、符号表的合并和重定位

1、什么是段表?

在分段式存储管理系统中,每个进程或程序都有一个或多个逻辑段,为使程序或称进程能正常运行,亦即,能从物理内存中找出每个逻辑段所对应的位置,在系统中为每个进程建立一张段映射表,简称段表,段表记录了进程中每一个段在内存中的起始地址(又称为 “基址” )、段号和段的长度。


2、段表的合并

在这里插入图片描述


3、符号表的合并和重定位

重定位:将无效的地址去掉
在这里插入图片描述
extern中的Add只是声明,没有明确的空间,为无效值。

总结

在这里插入图片描述

  • 19
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北尘_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值