编译原理—笔记

编译原理—笔记

翻译程序(Translator Process)

翻译程序,是指把某一种语言,翻译成另外一种语言。
并不特定于高级语言到低级语言之间的转换,可以是高级语言之间,或者低级语言之间的转换。
语言A -》翻译程序 -》语言B

编译程序(Compiler Process)

编译程序,是翻译程序的一个子集。编译程序把高级语言的源码作为输入,经过翻译,分析,处理优化之后,输出面向机器的语言。
机器语言就是目标程序,由计算机执行。
高级语言A -》编译程序 -》 机器语言B (编译过程存在中间语言)

编译的过程

  1. 词法分析:把表达式文本解析成词法元素列表(token list)。
  2. 语法分析:把tokenList解析成语法树(Syntax Tree)。
  3. 语义分析,源码优化并产生中间代码 :把语法树转成汇编语言的代码(asm)。

中间代码的优化

生成目标码 : 把汇编代码翻译为机器码(字节码)。
目标码优化

  1. 编译过程框图如下:
    a.词法分析(Lexical Analysis) -》 b.语法分析(Syntax Analysis) -》
    c.语义分析(Semantic Analysis) -》 d.中间代码的生成(Intermediate Code Generation) -》
    e.中间码的优化(Intermediate Code Optimization) -》 f.生成目标代码(Target Code Generation) -》
    g.目标码的优化(Target Code Optimization)

注:现代编译器将编译的过程分为三个阶段:Front end, Middle end, Back end
Front end: 从词法分析,到产生中间代码;(上图的a-d)
Middle end:对中间代码进行优化;(上图的e)
Back end:从中间代码,到目标代码的最后生成。(上图的f-g)

词法分析:正则表达式与词法分析器

概念:passes

在进行词法分析之前,需要对源码进行扫描。就会涉及一个问题:扫描的次数。
比如对于C语言这种需要整体扫描的语言,passes表明扫描的次数。
目前编译器一般无法一次扫描(one pass / single pass)就可以完成词法分析,一般需要多次扫描(Multi pass)。

概念:token sequence

扫描源码后,通过分割符,得到词法单元的序列(token sequence)。
token是带有附加信息的字符串。
注意,此处的词法,是单独的一个单元,但是单元之间有序列。词法是编程语言中最小的语法单元。
在生成词法单元的阶段,可以检查词法错误。
一个词法单元(token),包含两部分:类别与语义。
类别,包括标识符,常数,关键字,操作符,风格符。
语义,包括字符串(变量/常量名称,过程名,数组名等),常数,数值,关键字等具体的编程语言定义的含义。

C语言与词法分析

词法分析的主要意义是处理源代码,过滤掉无意义的符号,判断单词的合法性。分解出正确的单词与序列并保存。
看一个C语言的例子

int main()
{
	int a = 0;
	return a;
}

经过词法分析器的处理后,则可得到

line1 : type, int
line1 : keyword, main
line1 : bracket, (
line1 : bracket, )
line2 : bracket, {
line3 : type, int
line3 : indentify, a
line3 : OPT, =
line3 : integer, 0
line3 : bracket, ;
line4 : keyword, return
line4 : indentify, a
line4 : bracket, ;
line5 : bracket, }

从例子可以看出,词法分析器能准确地分析哪种属于关键字,哪种属于类型,变量,符号。
比如 int iff; 如果这样定义,词法分析器可以得出iff是定义(indentify),而不是if关键字(keyword)。

概念:Regular Expressions & Lexical Analysis Compiler

正则表达式 与 词法分析器 是词法分析阶段的两大利器。
通过制定特定的正则表达式,使用词法分析器,比如flex,可生成对应的词法分析源代码。
词法分析的源代码,可生成词法单元序列,即token。然后即可为语法分析做准备。
flex词法分析器,是一个开源的项目,由自由软件基金会制作:https://github.com/westes/flex
可以使用词法分析器产生词法分析的源码,也可以手动直接写生成某特定语言的生成token的源码。


版权声明:本文为freudlv原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。