编译器小结(转)

原文:https://blog.csdn.net/wuhenyouyuyouyu/article/details/104669179/

 

全部的语言编译器都拥有共通的中介架构:
1. 一个前端,用于解析匹配此语言的源代码,这个前端会产生一个抽象语法树;
2. 将此语法树翻译成为 GCC的 寄存器传递语言(register transfer language) 的 后端。
编译器最优化与静态代码解析技术在此阶段应用于代码上。最后,适用于此硬件架构的汇编语言代码以杰克·戴维森与克里斯·弗雷泽发明的算法产出。

几乎全部的GCC都由C/C++写成,除了Ada前端大部分以Ada写成。

 

GCC:GCC的外部接口长得像一个标准的Unix编译器。用户在命令行下键入gcc之程序名,以及一些命令参数,以便决定每个输入文件使用的个别语言编译器,并为输出代码使用适合此硬件平台的汇编语言编译器,并且选择性地运行连接器以制造可执行的程序。

GCC通常是跨平台软件的编译器首选。有别于一般局限于特定系统与运行环境的编译器,GCC在所有平台上都使用同一个前端处理程序,产生一样的中介码,因此此中介码在各个其他平台上使用GCC编译,有很大的机会可得到正确无误的输出程序。

GCC支持的主要处理器架构:ARM、x86、x86-64、MIPS、PowerPC等。

 

Clang:是一个C、C++、Objective-C和Objective-C++编程语言的编译器。它采用了底层虚拟机(LLVM)作为其后端。
它的目标是提供一个GNU编译器套装(GCC)的替代品。

Clang项目包括Clang前端和Clang静态分析器等。这个软件项目在2005年由苹果电脑发起,是LLVM(Low Level Virtual Machine)编译器工具集的前端(front-end),目的是输出代码对应的抽象语法树(Abstract Syntax Tree, AST),并将代码编译成LLVM Bitcode。接着在后端(back-end)使用LLVM编译成平台相关的机器语言。

 

GCC与Clang区别

GCC特性:除支持C/C++/ Objective-C/Objective-C++语言外,还是支持Java/Ada/Fortran/Go等;当前的Clang的C++支持落后于GCC;支持更多平台;更流行,广泛使用,支持完备。

Clang特性:编译速度快;内存占用小;兼容GCC;设计清晰简单、容易理解,易于扩展增强;基于库的模块化设计,易于IDE集成;出错提示更友好。

Clang采用的license是BSD,而GCC是GPLv3。

GCC相比Clang:

  • GCC支持clang不支持的语言,如Java、Ada、FORTRAN、Go等

  • GCC比LLVM支持更多的“目标”

  • GCC支持许多语言扩展,其中有些Clang不能实现

 

 

不同的编译器有自己的lib,例如MSVC STL、GCC 的 libstdc++、Clang 的 libc++,每个编译器自己的lib源码都不同。

比如对STL中vector的扩容因子的选择,这几个lib中源码实现是不同的。(参考:https://www.zhihu.com/question/602673820/answer/3046369283)

又比如,在编译选项 -stdlib 中,可以选择 libstdc++ 或 libc++ 来指定编译器编译时依赖的标准库。

gcc编译器没有-stdlib 这样命令行选项,LLVM clang编译器支持。 这是因为clang为您提供链接LLVM标准C ++库( libc ++ )或GNU标准C ++库( libstdc ++ ),而gcc只支持 libstdc ++ 。 简单说就是两个都是 C++ 标准库,libc++ 是针对 Clang 编译器特别重写的 C++ 标准库,而 libstdc++ 则是 GCC 的对应 C++ 标准库。

编译程序范例指定: CXXFLAGS = -std=c++11 -stdlib=libstdc++

(https://blog.csdn.net/turbock/article/details/89645593)

 

以下:https://www.zhihu.com/question/20235742/answer/202509397

 

posted @ 2023-07-01 18:47  大黑耗  阅读(13)  评论(0编辑  收藏  举报