第一章 绪论
以下上课后个人总结,希望有问题能够共同探讨!
什么是编译原理?
我们写代码是通过通过高级程序语言,因为它易于理解,但计算机能够执行处理的只能是机器代码。编译就是将高级程序语言转为机器代码的流程。我们要学的就是知道怎么转化它,并且能够完成编译过程的每一个步骤。这样才能做出像 浏览器,百度地图等等的应用软件。
这里的“译”就是代表翻译,是高级语言到机器语言的翻译过程,这个过程中也包含了优化。
这里的“编”,代表我们要让“译”执行的这个动作,因为语言的转换不可能靠人工来完成,所以我们必须要用程序来完成这个翻译的。
编译过程?
下面是核心图,慢慢的依照这个图来理解
我们首先拿到手的是一个写好代码的java文件,它肯定必须要经过编译后变成机器代码后才能执行。****
第一步,词法分析器
java文件里面是一个个的字符,“h”,“e”,“l”,“l”,"o"之类的。首先要经过词法解析器,把它变成,一个个单词,hello,print,class等等。组成后的单词称为词素(lexeme),相当于word。它有两类,预定义符(系统的变量以及关键字比如,class,public等)和自定义符(自己定义的变量)
词法解析也就是将字符解释成一个个的单词。
第二步,语法分析器
有了一个个的单词,当然要构成句子。
根据语言的语法规则,单词有它自己的含义,根据单词的含义来构成句子的含义。词法解析是线性的解析,语法解析是树型的解析。
例如: id1 = id2 + id3 * 60
解析的话,必须先挑出 = 号,然后两边再进行进一步的解析,右边话,再挑出 + 号,等等,形成下面的解析结果。
第三步,语义解析器
一个句子里面,或者句子之间,有时会有冲突。它就是检查句子是否满足语言定义的语义约束。例如,数组下标必须为整数,0不能作为被除数等等
第四步,中间代码生成器
我们有了句子,int b=(a*3)-3+19
它肯定不能在机器里面一次性执行,机器都是执行一条一条的指令,所以我们必须把这个句子拆开。变成
a=a*3
a=a-3
a=a+19
b=a
这样才能生成一条条的对应的机器代码供计算机执行
中间代码生成器就是拆开代码
第五步,机器无关代码优化器
为了减少数据在存储器里面的容量,减少cpu的计算量,减少两者之间数据传输量。代码优化也是我们要做事情。
比如说,中间代码含有,a=a+1,a=a+0
那a=a+0完全不用转为机器指令进行执行。把a=a+0去除,这就是无关代码优化器要做的事情。
第六步,机器代码生成器
就是将高级语言的这些代码,转为机器语言指令。中间肯定是经过汇编语言。
第七步,机器代码优化器
和第五步类似,是进行机器代码的优化
其实还有第零步
文件本身其实是010101011,bit构成的,bit要转为字节,字节再转为字符才能进行第一步的词法解析
因此,学完编译原理,就是能让我们自己能用程序完成上述的编译过程,用程序来生成程序。
如何构造编译器?
这块涉及编译器构造方法学,这就是我们要做的事情,怎么来实现编译器
用非常抽象、高级的表达式来表达语法规则;其特点是简洁,人能把控,一目了然。交给编译器构造工具,也叫生成器,由它来生成编译器的源代码。
这种设计方式是高水平,高境界的,用程序来生成程序,就事论事的来构造编译器是不可取的。
举例:
词法构造器,就用正则表达式作为工具,把合适的语法做为输入,生成词法构造器的源代码,也就是编译器最开始的部分。
语法构造器,就用上下文无关文法作为工具,同样的把合适的语法作为输入,生成词法构造器的源代码