C编译过程总结

本文详细介绍了C语言的编译过程,从全局概览到预处理、编译优化、汇编和链接四个阶段。预处理负责替代宏定义和条件编译指令,编译阶段将源代码转换为汇编代码并进行优化,优化包括删除公共表达式、循环优化等。汇编过程将汇编代码转化为机器语言,链接程序则解决符号引用和重定位问题,将目标文件整合为可执行程序。动态链接和静态链接各有优缺点,动态链接节省磁盘和内存空间,静态链接则在运行时不需要重新链接。
摘要由CSDN通过智能技术生成

一、编译的全局概览

编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格式的要求链接生成可执行程序。

 编译的完整过程:C源程序-->预编译处理(.c)-->编译、优化程序(.s、.asm)-->汇编程序(.obj、.o、.a、.ko)-->链接程序(.exe、.elf、.axf等)

二、各部分介绍

2.1 编译预处理

读取c源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。

预编译程序所完成的基本上是对源程序的“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同。下一步,此输出文件将作为编译程序的输出而被翻译成为机器指令。

2.2 编译、优化阶段

编译程序所要作得工作就是通过词法分析和语法分析,在确认所有的指令都符合语法规则之后,将其翻译成等价的中间代码表示或汇编代码。
优化处理是编译系统中一项比较艰深的技术。它涉及到的问题不仅同编译技术本身有关,而且同机器的硬件环境也有很大的关系。优化一部分是对中间代码的优化。这种优化不依赖于具体的计算机。另一种优化则主要针对目标代码的生成而进行的。
对于前一种优化,主要的工作是删除公共表达式、循环优化(代码外提、强度削弱、变换循环控制条件、已知量的合并等)、复写传播,以及无用赋值的删除,等等。后一种类型的优化同机器的硬件结构密切相关,最主要的是考虑是如何充分利用机器的各个硬件寄存器存放的有关变量的值,以减少对于内存的访问次数。另外,如何根据机器硬件执行指令的特点(如流水线、RISC、CISC、VLIW等)而对指令进行一些调整使目标代码比较短,执行的效率比较高,也是一个重要的研究课题。(有些是不能优化的,要使用volitate关键字)

为什么编译器都要先生成汇编代码?

1、直接把高级语言的源代码直接编译成机器码的话那要做高级语言到机器码之间的映射,这样 每个写编译器的都必须 熟练机器码。(类比网络的分层,每一层都屏蔽上一层的差异

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言编译过程是将C语言源代码转化为可以在计算机上执行的可执行文件的过程。这个过程包括了预处理、编译、汇编和链接四个主要步骤。 首先是预处理阶段,预处理器负责对源代码进行处理,将所有的宏定义、条件编译指令、头文件包含等处理为实际的C代码。预处理器会将处理后的文件保存为.i文件。 接下来是编译阶段,编译器会将预处理后的代码翻译成汇编代码,该代码使用一种特定的汇编语言表示。编译器会对代码进行语法检查、语义分析、优化等处理,并生成汇编代码。编译器将处理后的代码保存为.s文件。 然后是汇编阶段,在这个阶段,汇编器将汇编代码转化为机器码指令,这些指令可以被计算机直接执行。汇编器将处理后的代码保存为.o文件。 最后是链接阶段,链接器将多个目标文件(.o文件)和库文件进行合并,生成最终的可执行文件。链接器会解析并处理数据和函数引用,将它们与实际的定义进行链接。同时,链接器还会进行地址重定位、符号解析等操作,确保连接的正确性和可执行文件的完整性。 总结起来,C语言编译过程包括预处理、编译、汇编和链接四个步骤,分别将源代码转化为预处理后的代码、汇编代码和机器码,并最终生成可执行文件。每个阶段都有特定的处理任务和输出文件,形成了完整的编译过程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值