如果clang是编译器的前端,那为什么它可以生成可执行文件?

时间:2014-12-19 14:26:28

标签: compiler-construction clang llvm

我真正理解的一件事是关于clang的功能,如果clang是编译器的前端部分,它应该只为源代码做解析器工作,剩下的工作将完成通过LLVM。但是clang也可以生成可执行文件。那么如何理解呢?clang和llvm之间的关系是什么?

4 个答案:

答案 0 :(得分:17)

如果您非常具体:clang可执行文件是编译器驱动程序。它调用生成可执行文件所需的所有部分。它调用执行前端作业的libclang:parser / lexer,语义分析,构建AST和代码生成。当AST降低到LLVM IR时,前端作业完成,优化器和LLVM启动。在优化代码之后,编译器驱动程序将调用目标指定的LLVM后端,最后调用构建可执行文件的链接器。这就是clang编译器驱动程序可以构建可执行文件的原因。

答案 1 :(得分:4)

LLVM是一个编译器后端,它是在clang之前编写的,它最初在一个名为' llvm-gcc'的工具中使用gcc的前端。 Clang是前端代码的名称,但clang也是包含clang前端的工具的名称,但也会为您运行整个编译。后来的编译阶段要么作为库内置在clang工具中,要么它们是单独的可执行文件,clang知道如何调用它们。使用正确的命令行参数,您可以通过

使clang停止
  • -emit-ast只进行解析并制作抽象语法树
  • -emit-llvm进行LLVM中间表示,但不将其转换为计算机的代码

Clang将作为整个构建的驱动程序,因为这是程序员通常想要的,解析的源,生成的对象,可执行文件。希望抽象语法树向你吐唾沫是非常罕见的。

显然,这是所有LLVM http://llvm.org

的源泉

以下是Chriss Lattner解释LLVM是https://www.youtube.com/watch?v=029YXzHtRy0的视频。钱德勒·卡鲁斯(Chandler Carruth)对你曾经研究过的有关铿锵声的部分内容进行了讨论。

答案 2 :(得分:4)

Clang有三种含义:

  1. 前端(libclang)
  2. 编译器驱动程序(clang可执行文件)
  3. 传统编译器。这不仅包括前端,还广泛使用中端和后端,甚至集成的汇编程序来完成编译阶段。 (驱动程序主要由编译和链接组成)

答案 3 :(得分:0)

实际上,LLVM可以完成制作exe文件的大部分工作