大家好啊,我是小Bob,本月将继续更新啦~
我们知道,我们写的代码一般都会经过以下处理阶段:
源代码→ 预处理器→ 编译器→ 汇编程序→ 目标代码→ 链接器→ 可执行文件,最后打包好的文件就可以给电脑去判读运行了。
由于最近都是在和C++打交道,所以今天和大家讨论讨论编译器在C++内部是如何工作的。
1.何为编译器?
编译器是一种计算机程序,它会将某种编程语言写成的源代码(原始语言)转换成另一种编程语言(目标语言)。
它主要的目的是将便于人编写、阅读、维护的高级计算机语言所写作的源代码程序,翻译为计算机能解读、运行的低阶机器语言的程序,也就是可执行文件。编译器将原始程序(source program)作为输入,翻译产生使用目标语言(target language)的等价程序。源代码一般为高级语言(High-level language),如Pascal、C、C++、C# 、Java等,而目标语言则是汇编语言或目标机器的目标代码(Object code),有时也称作机器代码(Machine code)。——来源于维基百科
2.内部实现
我们在写C++代码时,是将c++代码写成文本形式保存在一个后缀名为cpp的文件中。那么计算机是如何识别这些代码的呢?
在将代码文本变成计算机能够识别的过程中,包含了两个过程,一个是编译,另一个是链接。
在编译的过程中,我们还需要知道一个名词,那就是编译器。
编译器的作用很简单,就是将我们的代码文件转换成另一种形式,一种更接近于目标文件的中间形式。转换成的中间形式被保存在后缀名为obj(在Windows中是.obj文件,在Linux中是.o文件)的文件中。
3.编译器做了啥?
另一个问题来了,在转换成后缀名为obj的文件过程中,编译器到底做了啥?
首先,编译器需要预处理我们的代码,即所有的预处理语句都会被先处理。当然,在预处理过程中,或多或少的都会进行记号化和解析,将代码整理成编译器能够真正理解和推理的格式。
还需记住的是,在编译Cpp文件中,文件或许不是那么重要,编译器只会将一个cpp文件看成一个翻译单元,有许多个cpp文件就会被看成有许多个翻译单元;当然,还有一种情况是一个很大的cpp文件包含了很多小的cpp文件,那么这时编译器会将这个很大的cpp文件看成一个翻译单元。
C++系列...