* 本学期开了编译原理这门课,自己会问这样的问题
- 课本上介绍了词法分析器 ,语法分析器 ,语义分析器,那么这在成熟的编译器中,占据着怎样的角色?
- 日常,我接触的最多的编译器是gcc ,clang(当然,还有vb之类的),他们的有啥差别?该如何选择?
- 基于gcc,如何设计一门自己的语言(或者从编译器的角度去看待一门计算机语言),编译工具链如何快速跟上?
- 一款新的处理器被推出,如何解决针对它的平台的编译工具的快速生成?
总结理解如下:
一个现代编译器的总体的框架
编译器在随着硬件和语言的发展,编译器的构造也趋于稳定~
gcc clang
* 在此说明:讨论的是下面编译器的编译部分,至于编译器的汇编和链接部分不做讨论 *
clang
独立的前端 + LLVM
优势是LLVM(编译器后端)
GCC
独立的前端 + 独立的后台
(优势是前端,支持多种语言的前端处理)
中间代码是RTL
当我知道他们的优势分别在front end 和 back end 时,我想有没有一款是他们综合的编译器,靠,还真有
LLVM-GCC
诞生的目的真是为了综合两者的优点,但为啥这款编译器没有前两者有名?
原来是随着clang 的不断迭代更新,它的前端已经非常强大,所以LLVM-GCC 就落寞了
维护的力度在不断削弱
* 具体这两个编译器的编译过程,到他们的官网会有详细说明
解决疑惑
前两个问题,不再陈述
针对后两个问题,进行思考回答:
我要自己去开发一门新的语言,然后加入自己的语法,但我没有足够的精力去完全设计一个编译器(或者我想最快的实现这一目的)其中之一的办法就是基于上面两个主流的编译器,只做编译器前端,编译器前端有两个有名的工具,LAC和YACC,有了他们,我们就无需自己去手动做词法和语法分析的工作(手动指的是自己去实现词法和语法分析器)。
但是,用这两种工具也有大量不足新的处理器被推出来,那么,处理器厂商,提供它的处理器编译支持,从而得到该平台下汇编代码,所以各个处理器厂商都会有编译器团队(非常核心)
- 由于clang的前端非常棒,所以很多静态语法分析,错误检查检查器,都基于clang去做
如何基于clang 自制插件