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

Compiler construction 如果clang是编译器的前端,那么为什么它可以生成可执行文件呢?,compiler-construction,clang,llvm,Compiler Construction,Clang,Llvm,有一件事我真的不明白,就是关于clang的功能,如果clang是编译器的前端部分,它应该只为源代码做解析器工作,剩下的工作将由LLVM完成。但clang也可以生成可执行文件。那么如何理解它呢?clang和llvm之间的关系是什么呢?如果您非常具体:clang可执行文件是一个编译器驱动程序。它调用生成可执行文件所需的所有部分。它调用libclang,libclang完成前端工作:解析器/词法分析器、语义分析、构建AST和代码生成。当AST降低到LLVM IR时,前端作业完成,优化器和LLVM开始工

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

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

LLVM是在clang之前编写的编译器后端,它最初在名为“LLVM gcc”的工具中使用gcc的前端。Clang是前端代码的名称,但Clang也是包含Clang前端的工具的名称,但也将为您运行整个编译过程。编译的后期阶段要么作为库内置到clang工具中,要么如果它们是单独的可执行文件,clang知道如何调用它们。使用正确的命令行参数,您可以使叮当声中途停止

  • -emit ast只是进行解析并生成抽象语法树
  • -emit llvm生成llvm中间表示,但不将其转换为计算机的代码
Clang将作为整个构建的驱动程序,因为这是程序员通常想要的,资源解析,对象生成,可执行文件生成。想要抽象语法树回吐给你是非常罕见的

显然,这是所有LLVM的来源


下面是克里斯·拉特纳解释LLVM是什么的视频。钱德勒·卡拉斯在youtuble上有一些视频,解释他研究过的叮当声的部分内容。

叮当声有三种含义:

  • 前端(libclang)
  • 编译器驱动程序(叮当可执行)
  • 传统编译器。这不仅包括前端,还广泛使用了中端和后端,甚至是集成汇编程序来完成编译阶段。(驱动程序主要由编译和链接组成)

  • 实际上,在制作exe文件时,大部分工作是由LLVM完成的

    LLVM IR和LLVM之间的区别是什么?LLVM IR是前端生成的中间表示,后端转换为不同的ISA。LLVM只是项目的名称。