美文网首页
编译器前端和后端

编译器前端和后端

作者: 北山学者 | 来源:发表于2019-01-29 15:59 被阅读0次

编译器粗略分为词法分析,语法分析,类型检查,中间代码生成,代码优化,目标代码生成,目标代码优化。把中间代码生成及之前阶段划分问编译器的前端,那么后端与前端是独立的。后端只需要一种中间代码表示,可以是三地址代码或四元式等,而这些都与前端生成的方式无关。按照这个分类,自己动手编写编译器,可以不必从头开始了。

试想一下,是否可以为不同的高级语言单独写一个前端,然后为不同的处理器架构单独写一个后端呢?

GCC基本上也是这么实现的,不过不要误会,并没有一个统一的gcc执行程序能够处理如此多的前端和后端,每个语言的编译器都是一个独立的程序(如C语言的编译器是gcc,C++的编译器是g++),而不同的后端也要对应不同的可执行程序。你可以下载单独的一份GCC源代码,通过不同的configure来生成自己需要的编译器。而且,编译器的实现也比上图要复杂的多,前端的主要功能是产生一个可供后端处理的语法树,而语法树结构实际上很难与处理器架构脱钩,这些都是编译器应用中需要解决的问题。

GCC强大的真正原因是什么?是因为它支持了众多的前端和后端吗?这些都不过是一个表象而已。GCC是一款真正自由的编译器,我们可以随时把代码拿过来修改以实现自己需要的功能。如果你的硬件平台增加了一些指令,而普通的编译器并不能产生这些指令怎么办?在GCC后端添加这些指令吧。如果你觉得C语言用的不太顺手,想给它添加一些功能怎么办?修改GCC的前端吧。因为有了GCC,我们才拥有这些自由,以及迅速实现自己想法的能力,而这些才是GCC强大背后的基础。

GCC编译的前端将不同的高级编程语言经过词法分析、语法分析转化为与前端语言无关的统一的中间表示。有了与前端无关的中间表示,GCC的前端将不同的高级编程语言转换成这种中间表示,这就是GCC处理器支持多种编程语言的根本原因。

参考文献

1、LLVM和Clang背后的故事
2、利用FLEX & BISON 快速实现简单的C 语言编译器前端
3、简述 LLVM 与 Clang 及其关系
4、编译器(GNU & GCC & clang & llvm)
5、gcc编译器---前端和后端

相关文章

  • ios编译以及clang插件

    ios的编译器组成分为前端和后端,clang是前端,llvm是后端,swift语言的前端编译器是swift。前端编...

  • LLVM初探

    LLVM是编译器相关 1、广义:前端+后端2、狭义:后端 前端 后端 ------------分割线-------...

  • 读书笔记-编译之美

    一. 编译器的前端技术 编译分前端技术后端技术image.png 这里的“前端”指的是编译器对程序代码的分析和理解...

  • Java - JIT即时编译

    Java - JIT即时编译 前端编译器 VS 后端编译器 前端编译器:javac 编译,在程序运行前,将 源文件...

  • iOS 编译过程

    iOS 编译采用 Clang 作为编译器前端,LLVM 作为编译器后端,编译器前端负责语法分析,语义分析,生成生成...

  • 编译器前端和后端

    编译器粗略分为词法分析,语法分析,类型检查,中间代码生成,代码优化,目标代码生成,目标代码优化。把中间代码生成及之...

  • Java JIT Just In Time 即时编译

    更多 Java 虚拟机方面的文章,请参见文集《Java 虚拟机》 前端编译器 VS 后端编译器 前端编译器:jav...

  • 编译原理笔记

    原文:传送门 或者:传送门 编译器的前后端 编译器以中间代码为界限,又可以分前端和后端。比如 clang 就是一个...

  • iOS llvm-1

    LLVM 传统编译器 LLVM区别于传统的编译器,它前端和后端分开了 LLVM流程1.所有的代码会经过[词法分析,...

  • Flutter 前端编译器编译流程分析

    1. 前端编译器和后端编译器的区别 编译流程粗略分为词法分析、语法分析、类型检查、中间代码生成、代码优化、目标代码...

网友评论

      本文标题:编译器前端和后端

      本文链接:https://www.haomeiwen.com/subject/stvxsqtx.html