认识编译器

文章介绍了GCC作为早期的开源编译器,因Linux的流行而广为人知,但其高耦合的架构限制了扩展。相比之下,LLVM采用模块化设计,易于扩展,被Apple用于开发Clang。LLVM的前端后端分离架构使得添加新语言或目标平台更为便捷。此外,文章还提到了BPF、EBPF在网络中的应用,以及链接器、解释器、即时编译器(JIT)的工作原理,特别指出Java虚拟机的字节码和GraalVM的多语言统一架构。
摘要由CSDN通过智能技术生成

经过上一篇的编译原理的介绍:
编译器的机构


至此我们介绍下面编译器的现有实现
1GCC:
GCC 的初衷是为了GNU操作系统编写的一款编译器,当时 编写Liunx操作系统的作者想要一个编译器,正好GNU缺一个操作系统,Linux操作系统缺一个编译器。所以经过交流,Linux选择使用GNU的编译器,而最初的 GNU 编译器只是为了做C语言的编译器,只是Linux操作系统火了,所以他也跟着火了,更名为GCC,现在可以支持多种语言的编译器。
因为当初只是为了C语言的编译,所以在设计架构时,并没有考虑到别的语言。所以在架构设计上没有模块化,导致代码高度耦合。如果想要改动代码则牵一发而动全身。
2LLVM:
由于GCC的高耦合,虽然他开源了,但是想要学习他成本是比较大的,但是当时市面上只有GCC,苹果公司也想要一个编译器,就去联系GCC给他定制一个,但是GCC不同意,在被拒绝之后,苹果公司则选择全新开发一套,而LLVM的作者就被苹果公司请去为Apple开发了一套支持苹果系统的 LLVM,而LLVM就成为了Apple官方支持的编译器Clang。
而LLVM使用的架构使用了全新的架构,他们将编译的流程进行梳理使用模块化结构。
总结为如下架构:
前端:词法分析,语法分析,语义分析,生成抽象语法树(ASTA)然后生成中间代码
中间语言:LLVM IR
后端:目标代码生成到指定的指令集,还负责指令选择(指令集的哪个指令),寄存器分配,指令调度
该模型同样适用于解释器和 JIT编译器,Java虚拟机也是使用的该模型,生成的是字节码。

这样的模型,就可以解耦合,如果我有一个 新的语言需要转化为机器语言,那么我只需要在当前的模型中实现前端即可,生成中间语言 IR,则不需要去了解后端是如何执行的。如果我想将这些语言移植到新的指令集上,那么我只需要将后端开发好即可。
1.1 BPF:
在操作系统中也有这样的场景,就是网卡的设计,网卡负责接收网络中的数据,但是如何分发给每个程序就是一个问题,
1.2 EBPF:
3链接器:当程序代码段A需要访问程序代码B时,这时候就需要将两个文件链接起来,就可以执行,简单来说就将两个文件拼接起来。
4解释器:在运行时去做语义分析,词法分析得到目标语言然后执行,当然这样做运行时速度会比编译器慢,应该编译器时启动时慢,但是执行是快,应该已经成为了目标语言直接可以执行。
5即时编译器:与其他编译器不同的是,将编译的结果放到内存中,然后去执行机器语言,而静态编译器则是编译成文件,存放在磁盘上,然后加载去执行机器语言
6JIT :即时编译器的实现
7Java虚拟机:
通过生成中间语言,字节码,然后交由后端生成机器码运行,并在Hotspot中加入了即时编译器。但也有缺点,增加了垃圾回收机制。
8GraalVM : 如下是GraalVM的架构图
官网地址:Architecture Overview


如上图,所示该架构想做的事情,就是想统一所有的语言
而LLVM则在给编译器指定规则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值