预处理,编译,汇编,链接程序的区别

本文详细阐述了从高级语言源程序到可执行二进制代码的全过程,包括预处理、编译、汇编和链接四个阶段,并通过具体实例帮助理解各阶段的作用及相互间的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

预处理,编译,汇编,链接程序的区别

@(OS)

一段高级语言代码经过四个阶段的处理形成可执行的目标二进制代码。

最难理解的是编译与汇编的区别。这里采用《深入理解计算机系统》的说法。

  • 预处理阶段:写好的高级语言的程序文本比如hello.c,预处理器根据#开头的命令,修改原始的程序,如#include<stdio.h>,将把系统中的头文件插入到程序文本中,通常是以.i结尾的文件。
  • 编译阶段:编译器将hello.i文件翻译成文本文件*hello.s,这个是汇编语言程序。高级语言是源程序。所以注意概念之间的区别。汇编语言程序干嘛?每条语句都以标准的文本格式确切描述一条低级机器语言指令。*不同的高级语言翻译的汇编语言相同。
  • 汇编阶段:汇编器将hello.s翻译成机器语言指令。把这些指令打包成可重定位目标程序,即.o文件。hello.o是一个二进制文件,它的字节码是机器语言指令,不再是字符。前面两个阶段都还有字符。
  • 链接阶段:比如hello程序调用printf程序,它是每个C编译器都会提供的标准库C的函数。这个函数存在于一个名叫printf.o的单独编译好的目标文件中,这个文件将以某种方式合并到hello.o中。链接器就负责这种合并。得到的是可执行目标文件

于是,带着这个理解看2016年的一道命制的习题:
(2016.12)将高级语言源程序转换为机器目标代码文件的程序是(C)
A. 汇编程序
B. 链接程序
C. 编译程序
D. 解释程序

分析:根据上面的描述,这里需要明确的是机器目标代码文件可不可以用来指代汇编程序文件。按照很多文章的解释,这个就是指汇编程序文本。首先,经过汇编程序以后,得到的是可重定位的二进制目标程序,已经不再是含字符的文件了。此外,处理高级程序的一定是预处理程序或编译程序。汇编处理的对象是汇编程序文本,链接处理的是可重定位二进制程序。因此,这里就是在指代编译程序。

之所以会犹豫是因为,看到机器,很容易联想到就是汇编或者链接之后的东西,这是很难抛开的一个概念障碍。

### 嵌入式系统的开发流程 #### 预处理 预处理器负责在编译之前执行一系列准备工作,包括展开所有的头文件、替换程序中的宏定义以及解析条件编译指令并将这些修改后的代码添加到原始文件中[^2]。 ```c #include <stdio.h> #define PI 3.14159 #if defined(DEBUG) // 调试信息 #endif ``` 这段代码展示了如何通过`#include`引入标准库,在实际操作过程中会被替换成对应的实现;同时利用`#define`来创建常量替代符,并且可以根据特定标志的存在与否有条件地包含某些部分的代码。 #### 编译 经过预处理之后得到的新源码会进入编译阶段。在此期间,编译器将C语言这样的高级编程语言转换成低级机器能够理解的形式——即汇编代码(.S)[^1]。此步骤专注于语法分析、语义检查和初步优化工作。 ```assembly .global _start _start: mov $60, %eax /* syscall number for exit */ xor %edi, %edi /* status code 0 */ syscall /* make the system call */ ``` 上述例子表示了一个简单的汇编片段,它由之前的C/C++代码经编译后生成,准备进一步转变为二进制形式的目标文件。 #### 汇编 当获得汇编代码后,下一步就是将其翻译成为计算机可以直接读取并执行的一系列命令序列—也就是常说的目标文件(object file),通常具有.o扩展名。这一过程是由专门设计用来解释汇编语言的工具完成的,称为汇编器(assembler)。 ```bash gcc -c main.c -o main.o ``` 这条命令指示GCC仅进行汇编而不做其他任何事情(比如链接),从而产生名为main.o的对象文件。 #### 链接 最后一个环节涉及把若干个单独编译出来的目标模块组合起来形成完整的应用程序或共享库。这不仅限于静态连接本地产生的obj文件,还包括动态加载外部依赖项如.so(shared object)等资源。整个构建链的最后一站便是链接器(linker), 它还承担着解决符号引用关系的任务,使得不同组件间可以相互调用函数和服务[^3]。 ```bash gcc main.o utils.o -L/path/to/library -lmylib -o myprogram ``` 这里展示的是一个典型的链接命令,其中指定了额外的搜索路径(-L选项) 和需要链接进去的具体库名称 (-l参数).
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值