《C语言编程魔法书:基于C11标准》——1.5 用C语言构建一个可执行程序的流程

简介:

本节书摘来自华章计算机《C语言编程魔法书:基于C11标准》一书中的第1章,第1.5节,作者: 陈轶 更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.5 用C语言构建一个可执行程序的流程

从用C语言写源代码,然后经过编译器、连接器到最终可执行程序的流程图大致如图1-2所示。
从图1-2中我们可以清晰地看到C语言编译器的大致流程。首先,我们先用C语言把源代码写好,然后交给C语言编译器。C语言编译器内部分为前端和后端。前端负责将C语言代码进行词法和语法上的解析,然后可以生成中间代码。中间代码这部分不是必须的,但是它能够为程序的跨平台移植带来诸多好处。比如,同样的一份C语言源代码在一台计算机上编译完之后,生成一套中间代码。然后针对不同的目标平台(比如要将这一套代码分别编译成ARM处理器的二进制机器码、MIPS处理器的二进制机器码以及x86处理器的二进制机器码),只需要编写相应目标平台的编译器后端即可。所以,这么做就可以把编译器的前端与后端剥离开来(这在软件工程上又可称为解耦合),不同处理器厂商可以针对自家的处理器特性,对中间代码生成到目标二进制代码的过程再度进行优化。接下来,由C语言编译器后端生成源文件相应的目标文件。目标文件在Windows系统上往往是.obj文件;而在Unix/Linux系统上往往是.o文件。C语言的源文件在所有平台上都统一用.c文件表示。最后,对于各个独立的目标文件,通过连接器将它们合并成一个最终可执行文件。连接器与C语言编译器是完全独立的。所以,只要最终目标代码的ABI(应用程序二进制接口)一致,我们可以把各个编译器生成的目标代码都放在一起,最后连接生成一个可执行文件。比如,有些源代码可用GCC编译,有些使用Clang编译,还有些汇编语言源文件可直接通过汇编器生成目标代码,最后将所有这些生成出来的目标代码连接为可执行文件。最终用户可以在当前的操作系统上加载可执行文件进行执行。操作系统利用加载器将可执行文件中相关的机器码存放到内存中来执行应用程序。


d19adfee9c7de3afcff185c273dfa245771103aa
相关文章
|
1月前
|
C语言
最简单的C语言程序示例
最简单的C语言程序示例
20 0
|
1月前
|
Serverless C语言
C语言程序通常具有以下基本结构
C语言程序通常具有以下基本结构
10 0
|
1月前
|
C语言 C++
第一个c语言程序
第一个c语言程序
|
1月前
|
程序员 编译器 C语言
C语言的程序常量
C语言的程序常量
10 0
|
1月前
|
C语言
C语言的循环程序
C语言的循环程序
11 0
|
16天前
|
存储 编译器 C语言
深入探索C语言动态内存分配:释放你的程序潜力
深入探索C语言动态内存分配:释放你的程序潜力
28 0
|
1月前
|
C语言
C语言最基本程序控制结构
C语言最基本程序控制结构
14 0
|
1月前
|
存储 Serverless C语言
C语言程序的结构
C语言是一种广泛使用的编程语言,其程序结构清晰,易于理解。下面我们将详细探讨C语言程序的基本结构,并通过一个示例代码来展示这些组成部分是如何协同工作的。 一、C语言程序的基本结构
14 0
|
1月前
|
程序员 C语言
最简单的C语言程序举例
C语言是一种广泛使用的计算机编程语言,适合用于系统编程,也可以用于编写应用程序。它的语法清晰明了,功能强大,是很多程序员的首选语言。下面,我们将通过一个最简单的C语言程序来介绍其基本结构和语法。
26 0
|
1月前
|
前端开发 Unix Linux
Linux indent命令 (格式化C语言源代码的程序)
Linux indent命令 (格式化C语言源代码的程序)
18 0
Linux indent命令 (格式化C语言源代码的程序)