编译原理是将一门语言翻译为另一门语言的学科。如果您只是想当个简单的程序员是可以不用学习的,或者有个了解就可以。但是如果您想更好的发展,就要很好的掌握了。
这门课程最大的特色就是,要自己写代码学习,不能光看书。
推荐如下图书:
推荐如下资料(本人的):
编译原理学习基本步骤:
编译原理解析
如果把我上面的内容学好,可以说编译原理掌握的不错了。特别是我的内容是参考上面的清华大学孙悦红老师的课本做的,还得到了其支持。
编译原理基本步骤
将一种语言翻译为另一种语言。
语言:基本字符、词法规则、语法规则、语义。
编译器运行基本步骤:
词法分析
语法分析
语义分析
中间代码生成
优化代码
代码生成
结合符号表处理和错误处理进行处理。
1 词法分析
处理字符。
正则表达式
正则表达式是没有变量的
正规文法
正则表达式和正规文法等价证明
自动机(确定和不确定自动机)
自动机只能描述单词。
开始-》结束状态
图灵机
确定自动机:状态加输入确定下一个状态。
五元表:
不确定自动机:状态加输入出现多个下一个状态选择。
五元表:
初始状态集合
正规式转换为不确定自动机,不确定自动机转换为计算机可处理的确定自动机,然后确定的自动机进行最小化。
这个的讲解感觉廖力讲的不错,讲正则和自动机之间的相互转换讲的比较透彻。足够词法分析使用。康辉的讲解和实践更近一点,但是和实际还是差很远。
程序的实现是DFA的算法实现。自动机是离散数学上的概念,不过学了这个也可以了解离散的自动机应用。
2 语法分析(文法分析)
用来定义程序的格式
BNF范式
最左推导,最右规约
最右推导,最左规约
上下文无关文法
下推自动机
自顶向下:推出为所有终结符
推导
消除左递归
预测分析 first/follow
递归下降分析过程
自底向上:从总结符出发归纳出文法开始
归约
简单优先分析法
算法优先分析法
LR分析法:
3 语义分析
类型识别等
语义子程序
4 中间代码生成
Id1 = id2 + id3
Id4 = 30
语法制导翻译
常用:三元式、四元式、语法树
5 代码优化
提高执行效率:实质是代码等价变换。
比如我们经常使用的Java String 连接 String a = “a ” + “b”;优化为String a = “ab”;
6 目标代码生成
Load reg1, 30
Add reg1,reg2
连接程序
连接程序将几个目标模块和库文件连接在一起成为一个单独的完整程序。目标模块是汇编程序或编译程序的机器码输出,它包括机器码、数据和供连接程序使用的连接信息。比如:一个目标模块可能包括程序的所有数据库功能,而另一个目标模块则包括处理命令行参数的函数。连接程序确定目标模块之间的引用关系,即确定一个模块所引用的例程和数据在另一个模块中的实际位置。Linux核心是由多个目标模块连接而成的独立的大程序。
总结
编译原理是区别专业和非专业程序员的标志之一。
致敬:Richard Stallman (理查德·马修·斯托曼)
理查德·马修·斯托曼(Richard Matthew Stallman, RMS,生于1953年),自由软件运动的精神领袖、GNU(GNU IS NOT UNIX)计划以及自由软件基金会(Free Software Foundation)的创立者、著名黑客。他的主要成就包括Emacs及后来的GNU Emacs,GNU C 编译器及GNU 调试器。 他所写作的GNU通用公共许可证(GNU GPL)是世上最广为采用的自由软件许可证,为copyleft观念开拓出一条崭新的道路。
欢迎加入程序员的世界,添物科技为您服务。
免费加入QQ群:557373922(内有干货)