接上文
OK! Right now! Let's go!
C++编译器是如何工作的?C++编译器实际负责什么?
我们把C++代码写成文本。就是这样,他只是一个文本文件,然后我们需要一些将文本转换为实际应用程序的方法,我们的计算机可以运行。从文本形式到实际可执行的二进制文件,我们基本上有两个主要的操作需要进行,其中一个叫做编译,另外一个被称为链接。
首先,我们先讨论编译,编译器实际上需要做的唯一一件事,将我们的文本文件拿来,转换成一种称为目标文件(.obj)的中间格式。然后这些obj文件传递到链接。
编译器在生成这些obj时实际上做了几件事。首先,他需要预处理我们的代码。这意味着所有的预处理语句都会先被处理。
一旦我们的代码被预处理,接下来我们将或多或少地进行记号化和解析,基本上把这个英语C++语言整理成编译器能够真正理解和推理的格式。这就导致了所谓的抽象语法树被创建,就是我们代码的一种表示,但是是抽象的语法树。
编译器每天的工作是:转换我们所有的代码,转换成常量数据或指令。一旦编译器创建了这个抽象语法树,他可以开始实际生成代码,这段代码就是实际的机器(我们的CPU)将执行的代码,我们还得到了其他各种数据,比如一个储存所有常量、变量的地方。
接下来我们详细看一下预处理
结果表示Math文件编译成功了。这是因为所有编译器做的是打开头文件,复制所有内容,粘贴。
让我们添加更多的预处理器语句,看看发生什么。
define预处理器语句基本上只进行搜索INTEGER,并将其替换为后面的内容(int)
我们可以看到这个 .i 结尾的文件,这个就是我们预处理后的C++代码,在记事本中打开这个文件:
这里我们可以看到预处理器实际上生成了什么
include预处理器语句
在以上的例子中,编译器把我们的EndBrace.h文件插在这里。
IF预处理器语句可以让我们包含或排除基于给定条件的代码,这里写if 1
如果我改成0,Visual Studio将会淡出下面的函数,显示它是被禁用的代码
再来看一下include <iostream>
很明显iostream文件中包含了大量的代码
一旦我们预处理这个阶段结束,我们可以继续实际编译C++代码
(记住要把预处理器中的预处理到文件选项关掉,否则不能生成.obj文件)
让我们来看看obj文件里是什么吧,我们用文本编辑器打开,会看到全是二进制。
但这里实际是当我们调用这个乘法函数时,我们的CPU将运行的机器代码。
因为全是二进制,我们把它转成看得懂的
这基本上是一个可读的文件,往下我们可以看到调用Multiply函数,然后我们有一堆汇编指令,这些是CPU将要执行的实际指令。
编译器的工作原理:它将获取源文件并输出一个obj文件,obj文件是包含机器代码的文件以及其他我们定义的常数数据。基本上是这样,现在我们有了这些obj文件,我么可以将它们链接成一个包含所有内容的可执行文件中,可执行文件是包含了需要运行的机器代码。
标签:文件,obj,代码,C++,那些,编译器,我们 From: https://blog.csdn.net/2401_87088772/article/details/142266837