【编译原理】第一章,什么是编译原理?

简介: 【编译原理】第一章,什么是编译原理?

第一章 绪论

以下上课后个人总结,希望有问题能够共同探讨!


什么是编译原理?

我们写代码是通过通过高级程序语言,因为它易于理解,但计算机能够执行处理的只能是机器代码。编译就是将高级程序语言转为机器代码的流程。我们要学的就是知道怎么转化它,并且能够完成编译过程的每一个步骤。这样才能做出像 浏览器,百度地图等等的应用软件。


这里的“译”就是代表翻译,是高级语言到机器语言的翻译过程,这个过程中也包含了优化。


这里的“编”,代表我们要让“译”执行的这个动作,因为语言的转换不可能靠人工来完成,所以我们必须要用程序来完成这个翻译的。

编译过程?

下面是核心图,慢慢的依照这个图来理解



我们首先拿到手的是一个写好代码的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要转为字节,字节再转为字符才能进行第一步的词法解析


因此,学完编译原理,就是能让我们自己能用程序完成上述的编译过程,用程序来生成程序。


如何构造编译器?

这块涉及编译器构造方法学,这就是我们要做的事情,怎么来实现编译器


用非常抽象、高级的表达式来表达语法规则;其特点是简洁,人能把控,一目了然。交给编译器构造工具,也叫生成器,由它来生成编译器的源代码。


这种设计方式是高水平,高境界的,用程序来生成程序,就事论事的来构造编译器是不可取的。


举例:


词法构造器,就用正则表达式作为工具,把合适的语法做为输入,生成词法构造器的源代码,也就是编译器最开始的部分。


语法构造器,就用上下文无关文法作为工具,同样的把合适的语法作为输入,生成词法构造器的源代码



相关文章
|
4月前
|
Java C语言
c语言基础知识整理与帮助理解(第一篇)
c语言基础知识整理与帮助理解(第一篇)
61 0
|
1月前
|
算法 安全 编译器
编译原理 - 中间表示
编译原理 - 中间表示
23 0
|
7月前
|
自然语言处理
【编译原理】第二章,词法分析
【编译原理】第二章,词法分析
|
8月前
|
C++
C++ Primer Plus 第二章编程练习
C++ Primer Plus 第二章编程练习
|
7月前
|
自然语言处理 IDE 开发工具
【编译原理】第三章语法分析
【编译原理】第三章语法分析
|
8月前
|
小程序 C++
C++ Primer Plus 第三章编程练习
C++ Primer Plus 第三章编程练习
|
10月前
C Primer Plus 第二章编程练习
C Primer Plus 第二章编程练习
49 0
|
10月前
C Primer Plus 第一章编程练习
C Primer Plus 第一章编程练习
58 0
|
10月前
C Primer Plus 第三章编程练习
C Primer Plus 第三章编程练习
43 0
|
SQL 自然语言处理 JavaScript