了解编译器的工作原理

时间:2014-09-13 18:23:44

标签: c++ compiler-construction linker object-files

我正在学习C ++编程语言,我对编译器如何创建可执行文件有疑问。我的书说:

  

C ++是一种编译语言,因此您需要将源代码翻译成计算机可以执行的文件。这个文件是由编译器生成的,它被称为目标代码(.obj),但像hello world程序这样的程序由我们编写的部分和C ++库的一部分组成。

这是hello world计划中的哪一部分?

然后我的书说:

  

您必须编译并链接程序的两个部分以生成可执行文件。

这是否意味着可执行文件是链接程序的两个部分并且无法执行目标代码的结果?

3 个答案:

答案 0 :(得分:1)

这两部分是1)"你的代码调用print函数并将字符串传递给",这是你编译的hello world程序; 2)实现打印功能的代码(例如" std :: cout<<")。我们称之为标准库。

显然,如果没有标准的库对象文件,由于缺少std :: cout的实现,你无法获得完整的可执行文件。

标准库的原因之一是使用户代码(您的hello world文件)在不同的操作系统中更具可移植性,因为在Unix系统中,您实际上必须使用&# 34;写"函数打印字符串;但在其他系统中,您可以使用"写"以外的功能。标准库为您统一。

有关标准库对象文件的详细信息包括模板实例化等技术,您现在可能对此不感兴趣。

答案 1 :(得分:0)

没错:C和C ++都有单独的编译和链接步骤。源被编译为该特定处理器的目标代码。目标文件和库链接在一起然后执行。

Java和C#都使用由各自的虚拟机解释和执行的字节代码。

答案 2 :(得分:0)

必须编译C和C ++。您将使用将您的代码转换为特定于平台的可执行文件的编译器。

编译器执行了许多步骤:

  • 首先对代码进行预处理(用值替换宏(#define),并按内容替换包含文件(#include)。
  • 检查C ++语法有效的语法分析
  • 用于构建指令树的语义分析
  • 优化(如果要求)
  • 代码生成:它编写特定于目标平台的汇编代码
  • 链接:将所有代码放在一个可执行程序中

在皮带上,这就是我在学校学到的东西......