我了解编译器的前端和后端的结构。然而,我不确定为什么编译器经常被分为前端和后端。我相信有很多原因,你能给我几个吗?因为,大多数书籍/网站都会告诉你它们是什么,但却不能告诉你为什么!
谢谢。
发布于 2012-03-19 13:34:54
前端处理语言本身:扫描、解析、解析树。后端处理目标系统:目标代码格式、机器代码本身……这两件事彼此没有太多关系,对于一个可移植的编译器来说,最好使用同一个前端和多个后端,每个目标一个后端。
你可以更进一步,就像gcc一样,有一个独立于语言的前端/后端接口,这样你就可以在同一个后端使用不同的语言前端。在过去,这被称为MxN问题:您不希望在有M种语言和N个目标系统的情况下编写MxN编译器。这个想法是只需要编写M+N编译器。
MxN问题的解决方案:中间代码解决的一个大问题是,您不需要针对前端语言解析和后端体系结构指令的大型单片编译器。他们称之为MxN问题,所以不是在单片编译器中使用MxN架构和语言的组合--你得到的是M+N组件,其中M处理语言解析等。而N处理从单一中间语言/指令到目标体系结构的指令的转换。
发布于 2012-03-19 13:33:33
如果您正在谈论前端是对源代码进行标记化的解析器,而后端是根据标记化的代码生成可执行代码的位,那么一个非常好的理由是:可移植性。
将解析器与可执行代码生成分离,可以更容易地将编译器从一个处理器体系结构移植到另一个处理器体系结构。
发布于 2012-03-19 13:40:20
因为您希望使用某种内部伪代码或表/数据结构。例如,如果你有一行代码:
a = b + c;您可能希望将其分解为intermediate language或IR (中间表示):
load b
load c
add b + c
store a举个例子--有很多解决方案。对于特定的目标,中间语言比直接使用汇编更好,原因如下:
ADD指令可以是基于堆栈的、采用1个操作数、采用2个操作数、甚至是3个操作数。在这个更高的层次上,我们不需要知道或关心低级硬件implementation.我对此了解不多,但我认为你也有常用的解析器bison/flex,将你归结为某种类型的中间代码/指令集,然后为它编写一个后端。
您还可以受益于,例如,您可以拥有C和C++以及其他语言前端,而不会影响后端。
您还可以从将编译器分解为逻辑模块块中获益,您可以独立于后端开发和测试前端。例如,llvm允许导出和导入中间语言,如果您真的想使用中间语言编写代码并在后端获得多个目标的好处,您可以这样做。
https://stackoverflow.com/questions/9765414
复制相似问题