三类开源编译器(LLVMClang,GCC,Open64)及(LLVMGNU)及工具链(编。。。

三类开源编译器(LLVMClang,GCC,Open64)及
(LLVMGNU)及⼯具链(编。。。
LLVM Clang编译器
什么是clang编译器?
clang是LLVM编译器⼯具集的⼀个⽤于编译C、C++、Objective-C的前端。LLVM项⽬的⽬标是提供⼀个GNU编译器套装(gcc)的替代品,由苹果公司的赞助开发,其源代码授权采⽤的是类BSD的伊利诺伊⼤学厄巴纳-⾹槟分校开源码许可。
clang编译器的优势与劣势
1相⽐于gcc,clang具有如下优点:
1.1编译速度更快:在某些平台上,clang的编译速度要明显快于gcc。
1.2占⽤内存更⼩:clang⽣成的AST所占⽤的内存通常是gcc的五分之⼀左右。
1.3模块化的设计:clang采⽤基于库的模块化设计,更易于IDE的集成及其他⽤途的重⽤。
1.4诊断信息可读性强:在编译过程中,clang会创建并保留⼤量详细的元数据 (metadata),这将更有利于调试和错误报告。
1.5设计更清晰简单,容易理解,易于扩展加强。与代码基础较为古⽼的gcc相⽐,学习曲线会显得更为平缓。
2当前 Clang 还处在不断完善过程中,相⽐于gcc, clang在以下⽅⾯还需要加强:
2.1需要⽀持更多语⾔:gcc除了⽀持 C/C++/Objective-C, 还⽀持Fortran/Pascal/Java/Ada/Go等其他语⾔。clang ⽬前基本上只⽀持C/C++/Objective-C/Objective-C++这四种语⾔。
2.2需要加强对C++的⽀持:clang对C++的⽀持依然落后于gcc,clang 还需要加强对C++ 提供全⽅位⽀持。
2.3需要⽀持更多平台:由于gcc流⾏的时间⽐较长,已经被⼴泛使⽤,对各种平台的⽀持也很完备。clang⽬前⽀持的平台有
食品网络营销Linux/Windows/Mac OS。
LLVM Clang=compiler+assemble
LLVM llc=LLVM static compiler
llvm-link=linker
llvm-as=assemble
LLDB=Debugger
GCC(GNU CC)=compiler
GNU Binutils-as=assemble
GNU Binutils-ld=linker
GNU Debugger=GDB
toolchain=compiler+assemble+linker+simulator+debugger+emulator+lib+...
⼯具链=编译器+汇编器+链接器+模拟器+调试器+f仿真器+各种库+...
LLVM静态编译器(LLVM Static Compiler,llc)是⼀个将DAG内容可视化的优秀⼯具。
模拟器(simulator)是⽤于分析研究⽬标系统本⾝,模拟器系统本⾝要跟⽬标系统保持⼀致。例如飞⾏模拟器对于⽤户来讲其本⾝要跟真正的飞机⼀致;再⽐如gem5模拟器,其本⾝要跟CPU所有内部⾏为⼀致(包括内部运⾏原理都要⼀致)。好的模拟器本⾝也可以仿真其⽬标系统,但不是所有模拟器都有这个特性。
仿真器(emulator)的⽬的是作为⽬标系统的替代品,可以完全替代⽬标系统,完成其对外的功能,即仿真器系统只需要保证呈现给外部的⾏为跟⽬标系统⼀致(不需要保证内部运⾏原理⼀致)。例如想在电脑上玩⼩时候玩的街机游戏,就需要在电脑上安装⼀个街机仿真器(虽然很多⼈喜欢称其为“街机模拟器”)。使⽤仿真器的⽬的是模拟⽬标系统呈现出的运⾏环境,仿真器保证的是完成⽬标系统相同的⾏为,不在乎其内部实现原理,再例如EMU8086仿真器,可以在另⼀台⾮8086电脑上仿真8086微处理器的⾏为。即使再好的仿真器也不能作为模拟器⽤于研究⽬标系统内部运⾏原理。针对gem5,其本⾝是⼀个CPU模拟器,但是因为其也能做到仿真器可以完成的⼯作(gem5运⾏于Atmoic模式), 尽管其运⾏速度相⽐真正CPU差很多,也可以认为其是⼀个类似于EMU8086的CPU仿真器。但是尽管gem5运⾏于乱序(Out Of Order, 简称O3)时,gem5可以被看做CPU模拟器,其内部模拟的CPU各个模块也不是完全⼀样,所以也可以任务,gem5是由仿真多个部件的仿真器构成的。总之,模拟器针对⽬标系统内部进⾏模拟,仿真器⽤于仿真⽬标系统对外的⾏为。
编译⽣成可执⾏⽂件
-o 指定了输出⽂件的名称
clang hello.c -o hello
得到 LLVM 字节码⽂件(不可读字节码⽂件)
我为人民鼓与呼-O3: 表⽰使⽤编译优化级别3来编译程序
-emit-llvm: 表⽰要通过 clang 得到 LLVM 的字节码⽂件(.bc)或者汇编⽂件(.ll)
-c: 表⽰要得到字节码⽂件
-o: 指定了输出⽂件的名称,字节码⽂件⼀般以 .bc 结尾
clang -O3 -emit-llvm hello.c -c -o hello.bc
llvm-dis
⽤llvm-dis⼯具反汇编得到 LLVM 汇编⽂件(可读)
llvm-dis hello.bc hello.ll
得到 LLVM 汇编⽂件(可读)
-S: 表⽰要得到汇编⽂件
clang -O3 -emit-llvm hello.c -S -o hello.ll
llvm-as
⽤ llvm-as ⼯具通过汇编⽂件(.ll ⽂件)得到字节码⽂件(.bc ⽂件)
llvm-as hello.ll hello.bc
编译 cpp ⽂件
clang++: 编译 .cpp ⽂件
-Wall: 输出警告信息
-g: ⽤于 gdb 调试
-
std: 编译的标准(-std=c++98、-std=c++03、-std=c++11、-std=c++0x)
-stdlib: C++ 标准头⽂件
clang++ -Wall -g -std=c++11 -stdlib=libc++ Hello.cpp -o hello
clang++ -Wall -std=c++11 -stdlib=libc++ -emit-llvm -c Hello.cpp -o hello.bc
GCC : GNU Compiler Collection(GUN 编译器集合)
gcc是开放源代码领域使⽤最⼴泛的编译器,功能强⼤,⽀持性能优化。⽬前gcc可以⽤来编译才C/C++,JAVA等多种语⾔,使⽤⼴泛。 -o  指定⽣成的输出⽂件
-E 仅执⾏编译预处理
-S 将C代码转化为汇编代码
-c 仅执⾏编译操作,不进⾏连接
gcc的编译分为四个部分:
1.编译预处理(展开头⽂件,展开宏,⽣成.i⽂件),如:gcc -E test.c -o test.i
马克思主义认识论
2.编译阶段(进⾏语法规范性的检查,并编译成汇编语⾔,⽣产 .s⽂件),如:gcc -S test.i -o test.s
3.汇编阶段(转化为⼆进制⽬标代码),如:gcc -c test.s -o test.o
4.链接阶段(将汇编⽣成的机器码汇集成⼀个可执⾏的⼆进制代码⽂件),如:gcc test.o -o
gcc:GCC中的GUN C Compiler(C 编译器)
g++:GCC中的GUN C++ Compiler(C++编译器)
关于gcc、glibc和binutils模块之间的关系,以及在现有系统上升级glibcgcc、glibc和binutils模块之间的关系
1) gcc(gnu collect compiler)是⼀组编译⼯具的总称。它主要完成的⼯作任务是“预处理”和“编译”,以及提供了与编译器紧密相关的运⾏库的⽀持,如libgcc_s.so、libstdc++.so等。
2) binutils提供了⼀系列⽤来创建、管理和维护⼆进制⽬标⽂件的⼯具程序,如汇编(as)、连接(ld)、静态库归档(ar)、反汇编(objdump)、elf结构分析⼯具(readelf)、⽆效调试信息和符号的⼯具(strip)等。通常,binutils与gcc是紧密相集成的,没有binutils的话,gcc是不能正常⼯作的。
3) glibc是gnu发布的libc库,也即c运⾏库。glibc是linux系统中最底层的api,⼏乎其它任何的运⾏库都会倚赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本⾝也提供了许多其它⼀些必要功能服务的实现,主要的如下: (1)string,字符串处理
(2)signal,信号处理 (3)dlfcn,管理共享库的动态加载 (4)direct,⽂件⽬录操作 (5)elf,共享库的动态加载器,也即interpreter (6)iconv,不同字符集的编码转换 (7)inet,socket接⼝的实现 (8)intl,国际化,也即gettext的实现 (9)io (10)linuxthreads (11)locale,本地化 (12)login,虚拟终端设备的管理,及系统的安全访问 (13)malloc,动态内存的分配与管理 (14)nis (15)stdlib,其它基本功能
[
程序从源⽂件到可执⾏⽂件,之间经过的过程有:
编译  源⽂件到汇编代码
汇编  汇编代码到⽬标⽂件
陈迪网球
链接  ⽬标⽂件到可执⾏⽂件
gcc 所做的⼯作是编译
binutils 是⼀个⼯具集,内部包含各种各样的⼯具,最主要的两个⼯具是 as 和ld
as是个汇编器,⽤于汇编
ld是个链接器,⽤于链接
]
OPEN64
Open64 是⼀款⽤于并⾏计算等⾏业专业领域的⾼级编译⼯具软件,⽀持多种芯⽚、ISA架构的同时还能够⽀持复杂的编译优化、芯⽚适配。它深刻影响了GCC,LLVM,NVCC的整体结构
中间语⾔ WHIRL
WHIRL 的流程
a,⼀种IR,多层表⽰
b,编译过程即不断降低表⽰层次的过程
c,每个优化都有其最适合做的表⽰层som
d,共享分析结果
e,阶段之间没有冗余操作
指令体系
WHIRL的指令分为陈述语句、表达式和结构化流程控制。
VH WHIRL
抽象的层次关系依然存在
可以反编译到F90/C
逗号是允许的
嵌套调⽤时允许的
三元运算符是允许的
内联代码可以被替换
High WHIRL
湖南水利水电杂志⽀持针对循环的优化
较为固定的数据流动
核⼼:
* ARRAY* DO 循环
*IF 指令
– IPA, PREOPT 和 LNO 都在这层开展⼯作
可以被反编译
Mid WHIRL
– 和RISC⼀对⼀匹配
– WOPT 在本层⼯作
Low WHIRL
– 最终要输⼊CG的WHIRL
– 调试过可以跑的

本文发布于:2024-09-21 08:42:48,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/444533.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:编译   系统   编译器
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议