编译原理的应用
准备系统地整理学习编译原理的相关知识。虽然这部分知识很多时候非常抽象,却能够很高的提高程序员内在的修养。如果每一种程序语言是一套招式,那么编译原理就是内功。不管程序语言如何变,都摆脱不了编译原理研究的BNF范式。具体来说,学习编译原理可能有以下几个方面的用处。
- 在平常写代码中的需要。我们在处理结构化文本(例如去除文本中的干扰内容,解析web页面等),计算复杂的表达式(既包括数值的计算,也可能包括字符串的操作)时,都会有意无意地用到编译原理的知识。
- 软件开发的需要。在开发文本编辑器,尤其是代码编辑器时,都免不了要对用户输入的文本进行处理。这个过程与编译原理的知识密切相关。
- 模式识别以及自然语言处理的应用。编译原理是的本质就是解析文本的生成模式。
- 编写开发工具。常听到有人说,一流的程序员,主要精力都花在编写工具上面。一个开发工具,其实就是一个代码解释器。
编译的过程
- 预处理:主要处理文件包含以及宏定义。将所有源文件中的代码整合为一个整体。代码中用到宏,都被替换成实际的字符串。
- 线性分析:也称为词法分析。将代码分割成一系列的记号(token)组成的集合。这些记号从语法分析的角度,被称为终结符。它可以是关键字,变量,运算符以及常量等。
- 语法分析:语法分析处理的是词法分析阶段输出的记号序列。它的主要工作是分析这一串记号序列的模式(更准确地说,这串记号序列是通过哪些产生式生成的)。
- 语义分析:包括变量检查,类型检查等。更复杂的语义检查可能会分析函数的每条运行路径是否都有返回值等。通常语义分析比语法分析要困难很多。因此需要单独提取出来。但是对于BNF语法,语义分析和语法分析可以同时完成。当语法分析完毕,句子的语义随之明了,中间代码生成完毕。这样的翻译过程称为语法制导翻译。
- 生成中间代码:所谓中间代码是指介于源代码和目标代码之间的代码。它的特点是易于从源代码产生,同时又易于生成目标代码。
- 中间代码优化:是指对中间代码进行优化,删去不必要的操作以提高运行效率。代码优化是编译过程中最具艺术性的过程。
- 目标代码生成:将中间代码翻译成目标代码。