一个简单的c++程序的编译过程

Compiling process in terms of a simple c++ program

我试图通过一个简单的 C++ 程序来理解编译过程,如下所示:

#include<iostream.h>
#include<conio.h>
#include<math.h>

#define sum(a,b) a+b

int a;

void main()
{
int b;
cin>>a>>b;
cout<<"hello"<<endl;
cout<<pow(a,2)<<endl;
cout<<sum(a,b);
getch();
}

目前我的理解:

1)预处理:所有宏展开,表达式代入。例如:sum(a,b)。我们在程序中使用的所有函数的函数原型都添加到代码中。例如:来自 math.h

pow() 函数

2) 编译: 将预处理后的代码转换为汇编代码,然后再转换为单个目标代码(这是机器语言)。

3) Linking:决定内存应该如何分配给代码的各个部分——全局(int a)和局部变量(int b)。

在静态链接的情况下,来自各种头文件的函数定义也被添加到代码中。例如:来自 math.h 的 pow() 定义。最终生成一个独立的单一可执行文件。

在动态链接的情况下,不添加函数定义。最终生成了一个可执行文件,但它不是独立的。

我的理解有误吗?我错过了什么?

一般来说,这是一个非常广泛的问题,但我会尽量简短地回答。 一个典型的语言处理系统有以下几个阶段:

1.预处理阶段 - 在此阶段处理所有预处理器和宏,并生成不受这些影响的代码。这涉及到用宏体替换宏调用,用实参替换形参。

2。编译阶段 - 这有几个较小的阶段,例如: 词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成等。 编译阶段may/may 不产生汇编代码。这两种方法各有利弊。我们假设汇编代码是在本次讨论中产生的。

3。汇编阶段 - 汇编器将编译器的输出转换为目标代码。汇编程序本质上可以是一次通过或两次通过。

4.链接阶段 - 已生成的代码有许多对其他模块中定义的子例程的引用和调用。此类模块链接到此阶段的代码,地址分配给具有外部引用的此类指令。

5.加载阶段 - 在此阶段,前一阶段生成的所有段都被加载到 RAM 中以供实际执行,控制权传递给第一条指令。

此答案中列出的所有组件都有很多错综复杂的地方,sub-parts绝不是语言处理器的完整解释。

作者 DM Dhamdere、Tannenbaum 和 Alfred Aho 关于这些主题的书籍很有用。