关于预处理器,编译器,汇编器,连接器的介绍与区别

2024-02-02 17:20

本文主要是介绍关于预处理器,编译器,汇编器,连接器的介绍与区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以经常见到的hello.c为例子

hello程序的声明周期是从一个源程序(hello.c/高级c语言)开始,被其它程序转换为一系列的低级机器语言指令,这些指令按照一种称为可执行目标程序的格式打包好,以二进制磁盘文件的形式保存。

在unix系统上,从源文件到目标文件的转化是由编译器驱动程序完成的。

linux>  gcc -o hello hello.c

GCC编译器驱动程序读取源程序文件hello.c,并把它翻译成一个可执行目标文件hello。这个翻译过程分为四个阶段:预处理,编译,汇编,链接 。这四个阶段构成了编译系统。

2.预处理(cpp为例)

预处理器不止一种,而c/c++的预处理器就是其中最低端的一种-词法预处理器,主要是进行文本替换,宏展开,删除注释这类简单工作。

(1)gcc -E选项可以得到预处理后的结果,扩展名为.i;

(2)c/c++预处理不做任何语法检查,不仅是因为它不具备语法检查功能,也因为预处理命令不属于c/c++语句这也是定义宏时不要加分号的原因),语法检查是编译器要做的事;

(3)预处理之后,得到的仅仅是真正的源代码;

(4)GCC确实很强大,如果是VC这种IDE,恐怕就不能看到预处理后的结果;

备注:所谓预处理,就是把程序中的宏展开,把头文件中的内容展开包含进来,预处理不会生成文件,所以需要重定向

3.编译器(ccl)

文本文件.i翻译成文本文件.s,得到汇编语言程序(把高级语言翻译成机器语言),这种语言程序中的每条语句都以一种标准的文本格式确切的描述了一条低级机器语言指令。

(1)gcc -S选项可以得到编译后的汇编代码,扩展名为.s;

(2)汇编语言为不同的高级语言的不同编译器提供了通用的输出语言,比如c编译器和Fortran编译器产生的输出文件用的都是一样的汇编语言。

4.汇编(as)

.s翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序的格式,并将结果保存在目标文件.o中(把汇编语言翻译成机器语言的过程);

(1)gcc -c选项可以得到汇编后的结果,扩展名为.o;

(2).o是一个二进制文件,它的字节编码是机器语言指令而不是字符。如果在文本编译器中打开.o文件,看到的将是一堆乱码。

(3)把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;语义检查和中间代码生成;代码优化;目标代码生成。主要进行词法分析和语法分析,又称为源程序分析,分析过程发现有语法错误,给出提示信息。

5.链接

gcc会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到lib.so.6库函数中去。函数库一版分为静态库和动态库两种,静态库是指编译链接时,把库文件中的代码全部加入到可执行文件中,因此生成的文件比较大。但在运行时也就不再需要库文件了。其后缀名一版为“.a”。动态库与之相反,在编译链接时并没有把库文件中的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一版后缀名为“.so”,如前面的libc.so.6就是动态库。gcc在编译时默认使用动态库。

参考文献:

(1)预处理器,编译器,汇编器,连接器的概念和区别_汇编连接器-CSDN博客

(2)程序详细编译过程(预处理、编译、汇编、链接) - 知乎 (zhihu.com)

这篇关于关于预处理器,编译器,汇编器,连接器的介绍与区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/671426

相关文章

go 指针接收者和值接收者的区别小结

《go指针接收者和值接收者的区别小结》在Go语言中,值接收者和指针接收者是方法定义中的两种接收者类型,本文主要介绍了go指针接收者和值接收者的区别小结,文中通过示例代码介绍的非常详细,需要的朋友们下... 目录go 指针接收者和值接收者的区别易错点辨析go 指针接收者和值接收者的区别指针接收者和值接收者的

售价599元起! 华为路由器X1/Pro发布 配置与区别一览

《售价599元起!华为路由器X1/Pro发布配置与区别一览》华为路由器X1/Pro发布,有朋友留言问华为路由X1和X1Pro怎么选择,关于这个问题,本期图文将对这二款路由器做了期参数对比,大家看... 华为路由 X1 系列已经正式发布并开启预售,将在 4 月 25 日 10:08 正式开售,两款产品分别为华

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

CSS Padding 和 Margin 区别全解析

《CSSPadding和Margin区别全解析》CSS中的padding和margin是两个非常基础且重要的属性,它们用于控制元素周围的空白区域,本文将详细介绍padding和... 目录css Padding 和 Margin 全解析1. Padding: 内边距2. Margin: 外边距3. Padd

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

分辨率三兄弟LPI、DPI 和 PPI有什么区别? 搞清分辨率的那些事儿

《分辨率三兄弟LPI、DPI和PPI有什么区别?搞清分辨率的那些事儿》分辨率这个东西,真的是让人又爱又恨,为了搞清楚它,我可是翻阅了不少资料,最后发现“小7的背包”的解释最让我茅塞顿开,于是,我... 在谈到分辨率时,我们经常会遇到三个相似的缩写:PPI、DPI 和 LPI。虽然它们看起来差不多,但实际应用

GORM中Model和Table的区别及使用

《GORM中Model和Table的区别及使用》Model和Table是两种与数据库表交互的核心方法,但它们的用途和行为存在著差异,本文主要介绍了GORM中Model和Table的区别及使用,具有一... 目录1. Model 的作用与特点1.1 核心用途1.2 行为特点1.3 示例China编程代码2. Tab

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语