编译器过程
如果这个框架对应LLVM,为什么这么说LLVM是个框架呢?
是因为它提供了中间表示的定义,即前端输出的文本格式定义.
那么 "前端" 可以是两者其一 : Clang 或者 LLVM-GCC
"通用优化" 和 "x86后端" 是 LLVM 提供的. // LLVM 也提供 riscv后端,arm后端
编译器过程涉及到的现成工具
他们通常被用于开发编译器的前端或后端部分,通过自动化生成代码的方式,减少了手动编码的工作量,提高了开发效率和代码质量。
词法分析器生成器:
它根据给定的词法规则和正则表达式,自动生成词法分析器。
常见的词法分析器生成器有Flex和JFlex等。
语法分析器生成器:
它根据给定的语法规则和上下文无关文法,自动生成语法分析器。
常见的语法分析器生成器有Yacc和Bison等。
语义分析和中间代码生成器:
它将源代码转换为中间代码,中间代码是一种与具体机器无关的中间表示形式,方便后续的优化和代码生成。
常见的中间代码生成器有LLVM和GCC等。
中间代码优化器:
它对中间代码进行优化,以提高程序的执行效率和减少资源消耗。
常见的优化器有LLVM的LLVM和GCC等。
目标代码生成器:
它将中间代码转换为目标代码,目标代码是与具体机器相关的机器代码。
常见的目标代码生成器有LLVM和GCC等。
编译器分类
compiler
a tool that takes in a source file and produces a object file for a specific architecture and systems
- LLVM
这不是一个缩写,就是这个项目的全名。
是伊利诺伊大学为了提供一个现代的、基于 SSA(静态单一赋值) 的、可以动态、静态编译任何编程语言的编译方案而开展的研究项目,
核心是个编译器工具集。
LLVM(低级虚拟机)是一个开源的编译器基础设施,它提供了一组模块化的编译器相关工具和库。
LLVM的目标是提供一种灵活、可扩展的编译器框架,支持多种编程语言和平台。
它提供了中间表示(IR)、优化器和代码生成器等组件,可以用于构建编译器、即时编译器和静态分析工具。
LLVM 官方开发的前端有LLVM-GCC 和 CLang.
GCC 的 中间语言是 Generic.
LLVM-GCC 是通过裁剪和修改的 GCC的前端,使其产生 LLVM中间语言(LLVM IR),支持 C,C++,FORTRAN,Ada 等高级语言 .
Clang 则是 LLVM社区开发的前端,支持 C,Object-C 和 C++ 等高级语言.
LLVM 能够 和 LLVM-GCC 或者 Clang 一起完成图中所述的整个编译过程
- GCC
GNU(操作系统)编译器套装(the GNU Compiler Collection)。
是许多现代类 Unix 操作系统默认的编译器,包括 Mac OSX 系统,但后来 Mac OSX 改为用 Clang 编译器了。
GCC 能够单独 完成图中所述的整个编译过程
- Clang
是 LLVM 编译器工具集的前端,输出代码对应的抽象语法树(AST),再编译成LLVM Bitcode,由后端使用 LLVM 编译成平台相关的机器代码。
因为 GCC 使用 GPL 协议(反版权),因此 Apple 无法闭源使用修改版的 GCC,而 LLVM 支持 BSD 协议(商业友好),于是有了 Clang。
Clang是基于LLVM架构的一个C/C++/Objective-C编译器前端。
它使用LLVM作为后端来生成目标代码。
Clang的目标是提供一个高性能、模块化、可扩展的编译器前端,能够提供快速的诊断和静态分析功能。
它具有良好的C++支持,并且可以作为一个库嵌入到其他应用程序中使用。
因为Clang是基于LLVM开发的,所以经常和LLVM一起提及。
在很多情况下,当人们说"LLVM"时,实际上指的是整个LLVM项目,包括LLVM核心以及其他工具和库,如Clang。
因此,有时候会给人一种LLVM包括Clang的感觉。
但是从技术上讲,它们是独立的项目,可以单独使用或组合在一起使用.
要独立使用Clang,您只需要安装Clang本身,而不需要安装整个LLVM项目.
Clang 能够和 LLVM 一起完成图中所述的整个编译过程.
Clang 能单独使用,他能生成LLVM IR.
Clang 不能单独完成编译过程,他只能生成LLVM IR, 后面的过程需要其他工程来处理,著名的工程只有LLVM,目前没有其他工程
你也可以用Clang 放入你的工程中,你的工程负责补足其他的功能,来完成整个编译过程.
compiler compiler
a tool that takes in a grammar file and produces a source file for a compiler
yacc bison lex/flex
Lex是lexical compiler的缩写,是Unix环境下非常著名的工具,
Lex (最早是埃里克·施密特和 Mike Lesk 制作)是许多 UNIX 系统的标准词法分析器(lexical analyzer)产生程式,而且这个工具所作的行为被详列为 POSIX 标准的一部分。
Lex的基本工作原理为:由正则表达式生成NFA,将NFA变换成DFA,DFA经化简后,模拟生成词法分析器。
Lex 主要功能是生成一个词法分析器(scanner)的 C 源码,描述规则采用正则表达式(regular expression)。
描述词法分析器的文件 *.l 经过lex编译后,生成一个lex.yy.c 的文件,然后由 C 编译器编译生成一个词法分析器。
compiler 资料
原理
- [编译器设计第二版]
clang
"Clang Static Analyzer" by Gabor Horvath
该书介绍了 Clang 静态分析器的原理和用法,以及如何使用 Clang 进行代码质量分析和错误检测。
LLVM
-
[LLVM 编译器 实战教程 ]
-
[LLVM Cookbook]
-
LLVM RISCV编译器编译QuickStart
"Getting Started with LLVM Core Libraries" by Bruno Cardoso Lopes and Rafael Auler
这本书介绍了LLVM核心库的基础知识和使用方法,涵盖了词法分析、语法分析、优化和代码生成等方面的内容。
"The LLVM Cookbook" by Mayur Pandey and Suyog Sarda
这本书提供了丰富的实用示例,帮助读者理解和使用LLVM工具链。
它涵盖了各种主题,包括中间代码生成、优化、JIT编译等。
"Clang and LLVM: Advanced Compilation Techniques and Tools" by Rafael Auler
该书深入剖析了 Clang 和 LLVM 的内部实现原理,包括前端编译、优化和后端代码生成等方面的内容。
"LLVM Essentials" by Suyog Sarda
该书从一个实践者的角度出发,介绍了如何使用 LLVM 和 Clang 构建编译器工具链,以及如何进行代码优化和调试。
gcc
"Advanced Compiler Design and Implementation" by Steven Muchnick
这是一本经典的编译器设计与实现的书籍,其中介绍了GCC和其他编译器的设计和实现原理,
包括中间代码表示、代码优化和目标代码生成等方面的内容。
"GNU Compiler Collection (GCC) Internals" by Richard M. Stallman and others
该书是 GCC 开发者的指南,介绍了 GCC 编译器的内部结构、架构和设计原理,以及如何进行编译器扩展和优化。
"GCC: The Complete Reference" by Arthur Griffith
该书全面介绍了 GCC 编译器的各个方面,包括编译过程、优化技术、调试和 profiling 等内容,适合对 GCC 感兴趣的读者。