编译器结构( 二 )


编译器结构

文章插图
端根据完成任务不同,可以将编译器的组成部分划分为前端(Front End)与后端(Back End) 。前端主要指与源语言有关但与目标机无关的部分,包括词法分析、语法分析、语义分析与中间表示生成 。后端主要指与目标机有关的部分,包括代码最佳化和目标代码生成等 。"端"概念的提出对于编译技术的发展起到了至关重要的作用,它使编译器的框架更明晰,更利于集成与构造 。语言目标代码是机器语言或彙编语言,彙编语言可以通过彙编器生成机器码 。彙编语言的定义取决于CPU的体系架构,目前主要有三种:x86/x64, ARM, MIPS 。中间代码是虚拟机的机器语言,虚拟机目前主要有四种:CLR, JVM, Parrot, LLVM 。CLR用于.Net平台,JVM用于Java语言,这两个是基于栈的虚拟机 。Parrot用于脚本语言,比如Perl,Python,Ruby等;LLVM用于C、C++等语言,这两个是基于暂存器的虚拟机 。在性能上比较而言,基于暂存器的虚拟机优于基于栈的虚拟机 。标準Pascal语言作为设计蓝本,主要有如下几个原因:(1)Pascal语言是一门严谨且优美的程式设计语言 。(2)Pascal语言功能非常强大,适合各种系统软体、套用软体设计 。(3)Pascal语言数据类型非常丰富 。例如,集合类型、函式类型、指针类型等 。(4)Pascal语言的语义複杂度不如C语言,故有利于编译器设计与实现 。同时,便于初学者学习理解 。正由于上述优点,Pascal仍然是算法设计的主要描述语言,也是IOI(国际奥林匹克信息学竞赛)三种参赛程式设计语言之一 。