本节是第一张Parsing的第一章,本书讲解的内容很完整,不仅仅局限在编译器解释器,而是和语言相关的所有应用程序。

第一章:语言应用初探

1 背景

下图中IR代表中间结果

上图包含的主要结构如下:

  1. 文件读取器:根据输入流建立数据结构。常见的文件读取器有配置文件读取器、方法调用分析工具等。例:JAVA的class载入器
  2. 生成器:搜集内部数据结构信息,然后产生输出,常见的有对象关系数据库映射工具、序列化工具、源代码生成器、网页生成器。
  3. 翻译器(改写器):文件读取器+生成器=翻译器。读入内容生成同种或不同种语言的的输出。例如有wikI到HTML的翻译工具、重构工具、代码插桩工具、格式调整器、宏的预处理。编译器和汇编器也可以归在这里,虽然他们已经可以自成一类。
  4. 解释器: 读入文件、解码再执行指令。注意关键是还要执行。

2. 模式概览

作者将以下几个功能点的实现都概括了一些模式:(题外话:每种功能点下重点学会一种模式多加练习我觉得就够了,哈哈)
这些功能点按顺序,也表明了一个语言应用实现大体上的顺序和需要解决的问题。

  1. 解析输入语句: 若干模式。。。。
  2. 构建语法树: 若干模式。。
  3. 遍历树: 若干模式。。
  4. 输入内容的语义分析: 同样的x代表什么类型的变量或者还是方法,这个涉及到符号表。也有若干模式
  5. 翻译语言:处理时可以直接解释执行,也可以翻译成其他语言或者机器码

3. 输入浅出语言应用

通过分析如下几个语言应用的架构,了解语言应用在体系结构之上的相似之处。

3.1 字节码解释器

称作执行其他程序的程序,一般也可以叫做虚拟机。字节码解释器的基本结构如下图:


主流的Java、Python等等都是属于这种语言应用

3.2 Java查错程序

方法一: 文件读取器读入代码,构建中间结果,语义解析器解析配合符号表解析中间结果发现错误生成报告。

方法二:比前面的流水线短了些,因为载入字节码可以用现成的类载入器

3.3 C编译器

首先了解下编译过程如下,其中包含多个组件的协同工作

C语言编译过程中涉及的编译器的流水线过程如下,其中语义分析和语义优化是最核心的地方

C++语言其实没有实现编译器,也仅仅是完成了一个翻译器将C++语言翻译成了C语言,然后利用C语言的编译器来完成编译

4. 为语言选择合适的模式

语法告诉我们该做什么,语义告诉我们这样做是为了什么(这一节出现的一句话,很好的总结了语法分析和语义分析)

根据前面的大局观和语言应用的相应环节,选择合适的模式来解决问题。就是这本书要说的内容了。