站在建筑工程的角度理解编译原理

49 阅读3分钟

软件工程就是建筑工程的一种抽象表达和演化,只是建筑工程是用实体建造出工程,而软件工程则是用代码组成的程序。程序本质上是存储在硬盘上的文件,那么文件是如何被电脑识别和执行的呢?

这是一段简单的C语言代码,它表示要打印出一个"hello, world"的文字。

#include <stdio.h>

int main()
{
    printf("hello, world\n");
}

将这段文字保存在 hello.c 文件中,然后用C语言的编译工具编译成hello.exe,即可用计算机运行。

image.png

这是一个文本文件,它是如何编译并且被计算机执行的呢?

这里面的关键流程就是编译。编译两字是编译系统的简称,里面包含了四个关键步骤。

传统编译原理的四个步骤

预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)、链接(Linking)是组成传统编译系统的四个主要步骤。这些步骤通常按顺序依次进行,以将源代码转换为可执行程序。

image.png

  1. 预处理(Preprocessing) : 在这一阶段,预处理器会处理源代码文件。它主要负责处理以“#”符号开头的预处理指令,如#include、#define等。这些指令会被解释并相应地展开,生成一个经过处理的新源文件。预处理还包括删除注释、条件编译等操作。
  2. 编译(Compilation) : 编译器接收经过预处理的源代码文件,并将其翻译成汇编代码。编译阶段的任务是将高级语言代码翻译成特定的机器语言指令序列。编译器会进行词法分析、语法分析、语义分析以及生成中间代码等操作。
  3. 汇编(Assembly) : 汇编器接收编译生成的汇编代码,并将其翻译成机器语言指令。汇编阶段的主要任务是将汇编语言翻译成二进制机器码表示。每条汇编指令通常都会对应到一条机器指令。
  4. 链接(Linking) : 链接器将多个目标文件(经过汇编的文件)以及需要的库文件链接在一起,生成可执行程序。链接的过程包括符号解析、重定位以及生成最终的可执行文件。链接器会解决多个文件之间的引用关系,确保程序能够正确运行。

类比建筑工程

这四个步骤可以类比为建造一座房子的过程:

  • 预处理就像房屋设计师根据需求草拟初始设计图,考虑布局、尺寸和功能区域。

image.png

  • 编译类似于建筑工程师根据设计图纸和规范将设计概念转换成建造指南,编写具体施工方案。

image.png

  • 汇编相当于建筑工地上的现场施工工人根据施工图纸和指南,将原材料如砖石、木材等组装成建筑物的构件和结构。

image.png

  • 链接就像建筑现场的总包商,负责整合来自各个工种的成果,确保所有部分紧密衔接,最终建造出完整的建筑物。

image.png

C语言的编译流程

C语言的编译流程就是传统的编译流程,从预处理、编译、汇编、连接,这四大步骤可以看出,它最终的目标是生成一段可执行文件,也就是我们在Windows系统中常见的exe文件。

image.png