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

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

相关文章

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

java中BigDecimal里面的subtract函数介绍及实现方法

《java中BigDecimal里面的subtract函数介绍及实现方法》在Java中实现减法操作需要根据数据类型选择不同方法,主要分为数值型减法和字符串减法两种场景,本文给大家介绍java中BigD... 目录Java中BigDecimal里面的subtract函数的意思?一、数值型减法(高精度计算)1.

Pytorch介绍与安装过程

《Pytorch介绍与安装过程》PyTorch因其直观的设计、卓越的灵活性以及强大的动态计算图功能,迅速在学术界和工业界获得了广泛认可,成为当前深度学习研究和开发的主流工具之一,本文给大家介绍Pyto... 目录1、Pytorch介绍1.1、核心理念1.2、核心组件与功能1.3、适用场景与优势总结1.4、优

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe

Linux中的more 和 less区别对比分析

《Linux中的more和less区别对比分析》在Linux/Unix系统中,more和less都是用于分页查看文本文件的命令,但less是more的增强版,功能更强大,:本文主要介绍Linu... 目录1. 基础功能对比2. 常用操作对比less 的操作3. 实际使用示例4. 为什么推荐 less?5.

Spring Security介绍及配置实现代码

《SpringSecurity介绍及配置实现代码》SpringSecurity是一个功能强大的Java安全框架,它提供了全面的安全认证(Authentication)和授权(Authorizatio... 目录简介Spring Security配置配置实现代码简介Spring Security是一个功能强

Java 关键字transient与注解@Transient的区别用途解析

《Java关键字transient与注解@Transient的区别用途解析》在Java中,transient是一个关键字,用于声明一个字段不会被序列化,这篇文章给大家介绍了Java关键字transi... 在Java中,transient 是一个关键字,用于声明一个字段不会被序列化。当一个对象被序列化时,被

解读@ConfigurationProperties和@value的区别

《解读@ConfigurationProperties和@value的区别》:本文主要介绍@ConfigurationProperties和@value的区别及说明,具有很好的参考价值,希望对大家... 目录1. 功能对比2. 使用场景对比@ConfigurationProperties@Value3. 核

JSR-107缓存规范介绍

《JSR-107缓存规范介绍》JSR是JavaSpecificationRequests的缩写,意思是Java规范提案,下面给大家介绍JSR-107缓存规范的相关知识,感兴趣的朋友一起看看吧... 目录1.什么是jsR-1072.应用调用缓存图示3.JSR-107规范使用4.Spring 缓存机制缓存是每一

Spring Boot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)

《SpringBoot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)》:本文主要介绍SpringBoot拦截器Interceptor与过滤器Filter深度解析... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实