首页 > 其他分享 >三大编译器

三大编译器

时间:2024-10-15 20:34:16浏览次数:9  
标签:GCC LLVM 前端 Clang 编译器 优化 三大

编译器的一般构成

  1. 三个部分: 前端(frontEnd) + 优化器(Optimizer) + 后端(backEnd)
  • 前端 :词法和语法分析
  • 优化器 :承前基础 + 优化代码 = 更加高效
  • 后端 : 将中间代码转化为各个平台的机器代码!
  1. GCC可以处理
  • C++
  • Fortran
  • Pascal
  • Objective - C
  • Java
  • Ada
  1. LLVM(Low Level Virtual Machine,底层虚拟机)
  • 提供了与编译器相关的支持,能够进行程序语言的编译期优化、链接优化、在线编译优化、代码生成。简而言之,可以作为多种编译器的后台来使用
  • 苹果公司一直使用 GCC 作为官方的编译器。GCC 作为一款开源的编译器,一直做得不错,但 Apple 对编译工具会提出更高的要求
  1. 是 Apple 对 Objective-C 语言(包括后来对C语言)新增很多特性,但 GCC 开发者并不买Apple的账——不给实现,因此索性后来两者分成两条分支分别开发,这也造成 Apple 的编译器版本远落后于 GCC 的官方版本。
  2. GCC 的代码耦合度太高,很难独立,而且越是后期的版本,代码质量越差,但 Apple 想做的很多功能(比如更好的 IDE 支持),需要模块化的方式来调用 GCC,但 GCC一直不给做。

LLVM2.0 - Clang

  1. Apple 打算从零开始写 C、C++、Objective-C语言的前端 Clang,完全替代掉GCC。
  2. Clang 是LLVM的前端,可以用来编译C,C++,ObjectiveC等语言
  3. Clang则是以LLVM为后端的一款高效易用,并且与IDE 结合很好的编译前端。
  4. Clang 只支持C,C++和Objective-C三种语言。2007年开始开发,C编译器最早完成,因此在2009年时,已经完全可以用于生产环境。C++ 在后来也得到了支持。

GCC 和 Clang 对比

  • Clang特性
  1. 速度快,通过编译 OS X 上几乎包含了所有 C 头文件的 carbon.h 的测试
  2. 内存占用小:Clang 内存占用是源码的 130%,Apple GCC 则超过 10 倍。
  3. 兼容性好:Clang 从一开始就被设计为一个API,允许它被源代码分析工具和 IDE 集成。GCC 被构建成一个单一的静态编译器,这使得它非常难以被作为 API 并集成到其他工具中。
  4. 诊断信息可读性强 :其中错误的语法不但有源码提示,还会在错误的调用和相关上下文的下方有 ~~~~~ 和^的提示,相比之下 GCC 的提示很天书。
  5. Clang有静态分析,GCC没有
    ![[Pasted image 20240905033026.png]]
  • GCC 优势:支持 JAVA/ADA/FORTRAN

GCC 支持更多平台

GCC 更流行,广泛使用,支持完备

GCC 基于 C,不需要 C++ 编译器即可编译

GCC、LLVM 和 Clang 如何选择?

  1. 目前不推荐使用老的GCC4.2,因为苹果不会维持它了,而且LLVM-GCC看起来会更好。在项目中途改编译选项可是一个大变动,需要慎重。
  2. 对新的项目而言,LLVM-GCC 看起來应该是个安全的选择,苹果公司认为它够稳定够成熟,所以才把它当做Xcode 4的预设选项。而且,既然选项使用的是GCC parser,向后兼容性应该没问题。
  3. LLVM-GCC是个安全的选项,但并不是指Clang/LLVM比较不安全,只是成熟度还沒那么高效了。

总结 - 再探LLVM

  1. 但GCC到底有什么问题呢?LLVM的优点也正是GCC的缺点。传统编译器工作的时候前端负责解析源代码,检查语法错误,并将其翻译为抽象的语法树(Abstract Syntax Tree)。优化器对这一中间代码进行优化,试图使代码更高效。后端则负责将优化器优化后的中间代码转换为目标机器的代码,这一过程后端会最大化的利用目标机器的特殊指令,以提高代码的性能。事实上,不光静态语言如此,动态语言也符合上面这个模型,例如Java。JVM也利用上面这个模型,将Java代码翻译为Java bytecode。这一模型的好处是,当我们要支持多种语言时,只需要添加多个前端就可以了。当需要支持多种目标机器时,只需要添加多个后端就可以了。对于中间的优化器,我们可以使用通用的中间代码。
  2. 这种三段式的结构还有一个好处,开发前端的人只需要知道如何将源代码转换为优化器能够理解的中间代码就可以了,他不需要知道优化器的工作原理,也不需要了解目标机器的知识
  3. 虽然这种三段式的编译器有很多优点,并且被写到了教科书上,但是在实际中这一结构却从来没有被完美实现过。做的比较好的应该属Java和.NET虚拟机。虚拟机可以将目标语言翻译为bytecode,所以理论上讲我们可以将任何语言翻译为bytecode,然后输入虚拟机中运行。但是这一动态语言的模型并不太适合C语言,所以硬将C语言翻译为bytecode并实现垃圾回收机制的效率是非常低的。GCC也将三段式做的比较好,并且实现了很多前端,支持了很多语言。但是上述这些编译器的致命缺陷是,他们是一个完整的可执行文件,没有给其它语言的开发者提供代码重用的接口。即使GCC是开源的,但是源代码重用的难度也比较大。
  4. LLVM最初的定位是比较底层的虚拟机。它的出现正是为了解决编译器代码重用的问题,LLVM一上来就站在比较高的角度,制定了LLVM IR这一中间代码表示语言。LLVM IR充分考虑了各种应用场景,例如在IDE中调用LLVM进行实时的代码语法检查,对静态语言、动态语言的编译、优化等。从上面这个图中我们发现LLVM与GCC在三段式架构上并没有本质区别。LLVM与其它编译器最大的差别是,它不仅仅是Compiler Collection,也是Libraries Collection。举个例子,假如说我要写一个X语言的优化器,我自己实现了PassX算法,用以处理X语言与其它语言差别最大的地方。而LLVM优化器提供的PassA和PassB算法则提供了X语言与其它语言共性的优化算法。那么我可以选择X优化器在链接的时候把LLVM提供的算法链接进来。
  5. LLVM不仅仅是编译器,也是一个SDK。Apple LLVM compiler 4.2是一个真正的LLVM编译器,前端使用的是Clang,基于最新的LLVM 3.2编译的。LLVM GCC 4.2编译器的核心仍然是LLVM,但是前端使用的是GCC 4.2编译器。从LLVM的下载页面可以看出,LLVM从1.0到2.5使用的都是GCC作为前端,直到2.6开始才提供了Clang前端。
  6. 如果你下载 LLVM 的代码,那么它就是一个IR到ARM/机器码的编译器。比如bin/opt就是对IR的优化器,bin/llc就是IR->ASM的翻译,bin/llvm-mc就是汇编器。如果你再从http://llvm.org下载Clang,那么就有了C->IR的翻译以及完整的编译器Driver。GDB是GNU的调试器。只要编译器支持DWARF格式,就可以用GDB调试。

标签:GCC,LLVM,前端,Clang,编译器,优化,三大
From: https://www.cnblogs.com/mathMing66/p/18468370

相关文章

  • 腾势N9三大黑科技,问界M9理想L9都给不了你
    文|AUTO芯球作者|雷慢理想L9,问界M9的好日子可能要到头了,比亚迪也要来抢高端SUV市场了!别不信啊,来看腾势N9的野心都写出来了,5米3车长,全尺寸SUV,比问界M9和理想L9至少都长7厘米以上了,轴距至少超过3米1,许多人看不懂这车的设计语言,其实说白了,N9更像一个方形版的Z9,来看N9的前大灯和行......
  • 三大顶刊对比!TGRS、RSE、ISPRS你选谁?中一篇安家费直接怒涨20w~
    【SciencePub学术】众所周知,顶刊的论文含金量UP!UP!UP!目前遥感领域在检的期刊共35本(见下图),本期,小编就给大家介绍一下公认的遥感三大顶刊:TGRS、RSE、ISPRS。版面有限,后台私信小编,获取35本遥感领域期刊实时IF排名及EXCEL版完整名单!1精选SCIIEEETransactionsonGeosci......
  • 手把手教你学 GPU SoC 芯片(8.1)--GPU SOC芯片编译器优化的编译器选项和标志
    目录常见的编译器优化选项示例:使用nvcc编译CUDA程序示例:使用GCC编译CPU程序特定于GPU编译器的优化选项NVIDIAnvccAMDROCm结论GPUSoC(SystemonChip)芯片的编译器优化对于提高性能和效率至关重要。不同的编译器可能支持不同的优化选项和标志,但大多数现代编译器都提......
  • GCC 编译器 与 GDB 调试器的基本操作
    一、GCC编译器1.什么是GCCGCC是GNUCompilerCollection(GNU编译器套装)的简称,目前GCC可以支持C,C++,ADA,JAVA,Fortran,PASCAL等多种高级语言。支持主流的CPU平台,完成从源程序向特定CPU硬件平台上自标代码的转换。2.GCC编译流程2.1方法一:四步完成编译1)预处理对......
  • 交叉编译器的命名规则是什么?
    交叉编译器(cross-compiler)是用来编译可在与编译器运行环境不同的架构或操作系统上运行的代码的工具。交叉编译器的命名通常遵循一个约定,以便能够描述编译器的目标平台。这个命名规则主要包含以下几个组成部分,通常顺序为:目标架构(TargetArchitecture):表示编译器生成代码的目标处......
  • JavaWeb三大组件之Servlet
    1.Servlet一、Servlet介绍1、概念Servlet(ServerApplet)是JavaServlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。2、实现过程1.客户端发送请求至服务器端;2.服务器......
  • 三大翻译软件推荐
    在全球化的今天,外贸已经成为许多企业拓展市场的重要途径。然而,语言障碍仍然是外贸业务中的一大挑战。尤其是在跨文化、跨语言的交流中,确保双方能够顺畅沟通显得尤为重要。这时,一款好用的翻译软件就能为外贸人员提供巨大的帮助。本文将推荐三款出色的翻译软件,帮助外贸业务人员更......
  • GCC编译器CFLAGS、LDFLAGS详解
    目录CFLAGSLDFLAGS在编译C/C++程序时,可以使用CFLAGS和LDFLAGS环境变量来设置编译器和链接器的选项。下面对CFLAGS和LDFLAGS进行详解:CFLAGSCFLAGS是用于设置C/C++编译器选项的环境变量。它可以用来指定编译过程中的各种选项,如优化级别、警告级别、头文件包含路......
  • PICO 2 RP2350使用官方推荐RISC-V编译器在O3优化下的coremark跑分,与Hazard3库宣传跑分
    编译环境:WSLUbuntu22.04GCC13.2.0 Hazard3存储库https://github.com/Wren6991/Hazard3/RP2350默认频率150MHz,编译内核为其RISC-V架构内核,在此频率下实测O3等级跑分453左右,O2等级跑分429左右。在测试时,当我打开第二个核心后,并且第二个核心只用来控制led灯,此时coremark跑......
  • sizeof vs strlen - 关于代码可读性、性能考量和编译器优化
    1、起因经常在咱们代码里面见到sizeof(“HEADER”)这类代码来计算常量字符串的长度,例如上次的一个代码review:之所以这么写可能基于以下几点考虑:(1)sizeof()是运算符而不是函数调用,编译时确定而不是运行时执行,因此不占用运行时时间(2)strlen()是GLIBC标准库函数,运行时需要进行......