编译器引论

1 语言处理器

简单地说,一个编译器就是一个程序,它可以阅读以某一种语言(源语言)编写的程序,并把该程序翻译成为-一个等价的、用另一种语言(目标语言)编写的程序,参见图1-1。编译器的重要任务之一是报告它在翻译过程中发现的源程序中的错误。
在这里插入图片描述

如果目标程序是-一个可执行的机器语言程序,那么它就可以被用户调用,处理输入并产生输出。参见图1-2。

在这里插入图片描述
解释器( interpreter)是另一种常见的语言处理器。它并不通过翻译的方式生成目标程序。从用户的角度看,解释器直接利用用户提供的输入执行源程序中指定的操作。参见图1-3。

在把用户输人映射成为输出的过程中,由一个编译器产生的机器语言目标程序通常比-一个解释器快很多。然而,解释器的错误诊断效果通常比编译器更好,因为它逐个语句地执行源程序。
在这里插入图片描述

Java语言处理器结合了编译和解释过程,如图1-4所示。
在这里插入图片描述
一个Java源程序首先被编译成一个称为字节码(bytecode)的中间表示形式。然后由一个虚拟机对得到的字节码加以解释执行。这样安排的好处之一是在一台机器上编译得到的字节码可以在另一台机器上解释执行。通过网络就可以完成机器之间的迁移。
为了更快地完成输人到输出的处理,有些被称为即时(just in time)编译器的Java编译器在运行中间程序处理输人的前刻首先把字节码翻译成为机器语言,然后再执行程序。

如图1-5所示,除了编译器之外,创建- -一个可执行的目标程序还需要一些其他程序。
在这里插入图片描述

一个源程序可能被分割成为多个模块,并存放于独立的文件中。把源程序聚合在一起的任务有时会由一个被称为预处理器(preprocessor)的程序独立完成。预处理器还负责把那些称为宏的缩写形式转换为源语言的语句。

然后,将经过预处理的源程序作为输人传递给–个编译器。编译器可能产生一个汇编语言程序作为其输出,因为汇编语言比较容易输出和调试。接着,这个汇编语言程序由称为汇编器( assembler)的程序进行处理,并生成可重定位的机器代码。

大型程序经常被分成多个部分进行编译,因此,可重定位的机器代码有必要和其他可重定位的目标文件以及库文件连接到一-起,形成真正在机器上运行的代码。一个文件中的代码可能指向另一个文件中的位置,而链接器(linker)能够解决外部内存地址的问题。最后,加载器(loader)把所有的可执行目标文件放到内存中执行。

待补充 18 练习题

2 一个编译器的结构

到现在为止,我们把编译器看作-一个黑盒子,它能够把源程序映射为在语义上等价的目标程序。如果把这个盒子稍微打开一点,我们就会看到这个映射过程由两个部分组成:分析部分和综合部分。

分析( analysis)部分把源程序分解成为多个组成要素,并在这些要素之上加上语法结构。然后,它使用这个结构来创建该源程序的一个中间表示。如果分析部分检查出源程序没有按照正确的语法构成,或者语义上不-致,它就必须提供有用的信息,使得用户可以按此进行改正。分析部分还会收集有关源程序的信息,并把信息存放在一个称为符号表( symbol table) 的数据结构中。符号表将和中间表示形式- -起传送给综合部分。

综合(synthesis)部分根据中间表示和符号表中的信息来构造用户期待的目标程序。分析部分经常被称为编译器的前端(frontend),而综合部分称为后端(backend)。

如果我们更加详细地研究编译过程,会发现它顺序执行了一-组步骤(phase)。每个步骤把源程序的一种表示方式转换成另一种表示方式。-个典型的把编译程序分解成为多个步骤的方式如图1-6所示。在实践中,多个步骤可能被组合在一起,而这些组合在一起的步骤之间的中间表示不需要被明确地构造出来。存放整个源程序的信息的符号表可由编译器的各个步骤使用。

在这里插入图片描述

有些编译器在前端和后端之间有一个与机器无关的优化步骤。这个优化步骤的目的是在中间表示之上进行转换,以便后端程序能够生成更好的目标程序。如果基于未经过此优化步骤的.中间表示来生成代码,则代码的质量会受到影响。因为优化是可选的,所以图1-6中所示的两个优化步骤可以被省略。

2.1 词法分析

编译器的第一个步骤称为词法分析(lexical analysis)或扫描(scanning)。词法分析器读人组成源程序的字符流,并且将它们组织成为有意义的词素(lexeme)的序列。对于每个词素,词法分析器产生如下形式的词法单元(token)作为输出:

< token-name, attribute-value >

这个词法单元被传送给下一个步骤,即语法分析。在这个词法单元中,第一个分量token-name是一个由语法分析步骤使用的抽象符号,而第二个分量attribute-value指向符号表中关于这个词法单元,的条目。符号表条目的信息会被语义分析和代码生成步骤使用。

比如,假设一个源程序包含如下的赋值语句

position = initial + rate * 60     (1.1)

这个赋值语句中的字符可以组合成如下词素,并映射成为如下词法单元。这些词法单元将被传递给语法分析阶段。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值