title: 编译技术复习(一)

date: 2023-12-4 11:55:00

summary: 编译技术复习

categories: 知识
tags:

  • 编译技术

先吐吐槽,编译技术好难,上课的时候可以说基本没听明白。(虽说这情况挺常见的。

实验也不会,只能相信前人的智慧

好好好,是我太菜太摆了

菜就多练,不会就多看

编译技术复习(一)

第一章

1.1语言处理器

编译器是一种程序,可以阅读源程序(某一种语言编写)并将其翻译成目标程序(目标语言编写)。编译器的重要任务之一是报告它在翻译过程中发现的源程序中的错误。

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

解释器是另一种常见的语言处理器。它并不通过翻译的方式生成目标程序。从用户的角度来看,解释器直接利用用户提供的输入执行源程序中指定的操作。

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

除了编译器之外,创建一个可执行的目标程序还需要一些其他程序。一个源程序可能被分割成为多个模块,并存放于独立的文件中。把源程序聚合在一起的任务有时会由一个被称为预处理器(preprocessor)的程序独立完成。预处理器还负责把那些称为宏的缩写形式转换为源语言的语句(总结:预处理器负责把源程序聚合在一起,并把宏转换为源语言的语句)

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

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

总结:

1.编译器可以将源程序翻译成目标程序,其重要作用之一是报告在编译过程中发现的错误

如果目标程序是可执行的机器语言程序,那么它就可以被计算机执行

2.解释器是直接解释执行用户提供的源程序

3.java语言处理器结合了编译和解释过程

一个Java源程序首先会被编译成一个被称为字节码(bytecode)的中间表达式。然后有一个虚拟机对得到的字节码加以解释进行。

4.除了编译器之外,创建一个可执行的目标程序还需要一些其他程序。

预处理器负责把源程序聚合在一起,并把宏转换为源语言的语句

汇编器负责把汇编语言进行处理,并产生可重定位的机器代码

链接器(linker)能够解决外部内存地址的问题

加载器(loader)把所有的可执行目标文件放到内存中执行

1.2 编译器的结构

编译器 = 分析部分(作为编译器的前端) + 综合部分(作为编译器的后端)

分析部分:

1、将源程序分解为多个组成要素。

2、将组成要素通过语法结构创建该源程序的一个中间表示。

3、检查源程序有没有按照正确的语法结构和语义,如果没有则必须提供有用的信息供用户改正。

4、收集有关源程序的信息存放在一个称为符号表的数据结构。

5、符号表和中间表示形式一起传送给综合部分。

综合部分:

根据中间表示和符号表中的信息来构造用户期待的目标程序。

编译器的步骤

1.2.1 词法分析

词法分析器:读入组成源程序的字符流,并且将它们组织成为有意义的词素(lexeme)的序列。词法分析器会将每个词素生成如下形式的词法单元(token)作为输出:

<token-name, attribute-value>

词法单元生成后会被传送到下一个步骤,即语法分析。

**词法单元 <token-name, attribute-value>**:

第一个分量token-name是一个由语法分析步骤使用的抽象符号,

而第二个分量attribute-value指向符号表中关于这个词法单元的条目。符号表条目的信息会被语义分析代码生成步骤使用。

1.2.2 语法分析

编译器的第2个步骤:语法分析(syntax analysis)或解析(parsing)。语法分析器使用由词法分析器生成的各个词法单元的第一个分量来创建树形的中间表示。该中间表示给出了词法分析产生的词法单元流语法结构。一个常用的表示方法是语法树(syntax tree),树中的每个内部结点表示一个运算,而该结点的子结点表示该运算的分量。在图1-7中,词法单元流(1. 2)对应的语法树被显示为语法分析器的输出。

小结:

1)语法分析器的作用:根据语法结构,将各个词法单元的第一个分量创建成树形的中间表示,并且将中间表示输出。

2)中间表示=词法单元流(各个词法单元里的第一个分量)+语法结构

3)中间表示一般常用的是语法树。

4)语法树中每个内部结点表示运算,而该结点的子结点表示该运算的分量。


文章作者: 求索
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 求索 !
  目录