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

sto*_*ren 13 compiler-construction llvm clang

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

Mic*_*idl 17

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

  • LLVM IR和LLVM有什么区别? (2认同)
  • LLVM IR是前端生成和后端转换为不同ISA的中间表示.LLVM只是项目的名称. (2认同)

Chr*_*ern 6

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) 在 youtube 上有一些视频,解释了他参与过的部分叮当声。


Tho*_*son 5

Clang有3种含义:

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