编译器过程

编译器过程

在这里插入图片描述

如果这个框架对应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 放入你的工程中,你的工程负责补足其他的功能,来完成整个编译过程.

在centos发行版上,clang包依赖 llvm , 所以你调用clang -S main.c -o main.asm 是可以运行的,原因是他调用了 libLLVM.so

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 进行代码质量分析和错误检测。
clang  main.c -o main --verbose // 能看到四个过程,最后一个过程使用的是 binutils 中的 ld

LLVM

clang -emit-llvm -S -c main.c -o main.ll  // 中间文件
llvm-as -o main.bc main.ll                // 字节码文件
llc -filetype=asm -o main.asm main.ll(bc) -x86-asm-syntax=att // 汇编文件
llc -filetype=obj -o main.o   main.ll(bc) // 重定位文件
使用clang 的第四个过程的ld 可链接.o , llvm 好像没有提供链接工具. // 可执行文件
    
问题: 从包管理角度来看, clang 依赖 llvm 和 libgcc , llvm 依赖 libgcc
"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 感兴趣的读者。

猜你喜欢

转载自blog.csdn.net/u011011827/article/details/132341545