编译链接(Compile Link)

简介: 编译链接(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只是声明,没有明确的空间,为无效值。

总结

目录
相关文章
|
编译器 C语言
QT编译fabs not declared in this scope
QT编译fabs not declared in this scope
167 0
|
Java API Android开发
Gradle 依赖关系中 compile和 implementation的区别
将在一个项目中展示implementation,api以及compile之间的差异。 假设我有一个包含三个Gradle模块的项目: • app(Android应用) • my-android-library(Android库) • my-java-library(Java库) app具有my-android-library与依赖。my-android-library具有my-java-library依赖。
596 0
|
7月前
|
人工智能 机器人 测试技术
【CMake报错】Cannot specify compile definitions for target “PRIVATE“ which is not built...
【CMake报错】Cannot specify compile definitions for target “PRIVATE“ which is not built...
|
7月前
|
存储 Shell iOS开发
CMake中文手册_target_link_libraries(3.26)
CMake中文手册_target_link_libraries(3.26)
357 0
|
编译器
[√]添加预处理的2个不同方式:target_compile_definitions / add_definitions
[√]添加预处理的2个不同方式:target_compile_definitions / add_definitions
238 0
|
缓存 Java Python
一日一技:请不要再用re.compile了!!!
一日一技:请不要再用re.compile了!!!
83 0
编译pluma: pluma/Makefile.am:192: error: HAVE_INTROSPECTION does not appear in AM_CONDITIONAL
编译pluma: pluma/Makefile.am:192: error: HAVE_INTROSPECTION does not appear in AM_CONDITIONAL
114 0
|
Java C++
C++编译错误解决办法:Class_Label[abi:cxx11]'被多次定义
C++编译错误解决办法:Class_Label[abi:cxx11]'被多次定义
163 0
|
编译器 C语言
CodeBlocks出现Can‘t find compiler executable in your search path for GNU GCC Compier错误
CodeBlocks出现Can‘t find compiler executable in your search path for GNU GCC Compier错误
463 0
CodeBlocks出现Can‘t find compiler executable in your search path for GNU GCC Compier错误
|
开发者 Python
Re.compile 方法的使用 | 学习笔记
快速学习 Re.compile 方法的使用