【编译原理】概述总结(一)
2015-10-25 10:43
211 查看
编译原理看起来很抽象很难,其实理清楚之后也还好。编译的整体过程如下图:
![](https://img-blog.csdn.net/20151025103749970?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
通过把源程序转换成一种方便处理和分析的数据结构,这个过程就是词法分析和语法分析来完成的。
【词法分析】
它的主要任务是,按构词规则识别源程序的字符流、识别标识符、整体、界限符等单词,并报告发现的词法错误。这里引进了正则表达式和有穷自动机分别作为单词的描述工具和识别机制。
说白了,就是从左到右一个字符一个字符地扫描源程序。
【语法分析】
语法分析是在词法分析的基础上将单词串进一步分解,如语句、表达式等。根据特定的文法规则,检查单词串是否符合既定规则。
【语义分析】
语义分析的任务是审查源程序有无语义错误。就好像一句话的每个字都写对了,但是连起来意思对不对呢?
【中间代码生成】
有的编译程序将源程序变成一种内部表示形式,即中间代码。有些编译程序并不要中间代码,不存在中间代码生成阶段。有些编译程序也不进行优化。
【代码优化】
代码优化是在不改变代码的功能前提下对中间代码对代码做一些等价变换,通过删除无用代码、减少冗余等手段,使得最后生成的目标代码更为高效。
【目标代码生成】
编译的最后一个阶段就是目标代码生成了。任务是把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。这部分工作很复杂,涉及到硬件系统结构和机器指令等。
【符号表管理】
编译过程中源程序的名字和收集到的每个名字的各种属性信息,诸如类型、作用域、分配存储信息等各种信息被保留在种种不同的符号表中,编译各阶段的工作都涉及到构造、查找或更新有关的表格。
【出错处理】
若编译过程中发现源程序有错误,编译程序应报告错误的性质和错误发生的地点,并且将错误所造成的影响限制在尽可能小的范围内,使得源程序的其余部分能继续被编译下去。出错处理主要任务是检查错误、报告出错信息、排错、恢复编译工作。
【小结】
就像我们要翻译外国文档一样,首先读文章(词法分析),然后查单词(语法分析),单词连起来分析句子(语义分析),初步翻译(中间代码生成),对句子进行润色(代码优化),翻译出来形成文档(目标代码)。
通过把源程序转换成一种方便处理和分析的数据结构,这个过程就是词法分析和语法分析来完成的。
【词法分析】
它的主要任务是,按构词规则识别源程序的字符流、识别标识符、整体、界限符等单词,并报告发现的词法错误。这里引进了正则表达式和有穷自动机分别作为单词的描述工具和识别机制。
说白了,就是从左到右一个字符一个字符地扫描源程序。
【语法分析】
语法分析是在词法分析的基础上将单词串进一步分解,如语句、表达式等。根据特定的文法规则,检查单词串是否符合既定规则。
【语义分析】
语义分析的任务是审查源程序有无语义错误。就好像一句话的每个字都写对了,但是连起来意思对不对呢?
【中间代码生成】
有的编译程序将源程序变成一种内部表示形式,即中间代码。有些编译程序并不要中间代码,不存在中间代码生成阶段。有些编译程序也不进行优化。
【代码优化】
代码优化是在不改变代码的功能前提下对中间代码对代码做一些等价变换,通过删除无用代码、减少冗余等手段,使得最后生成的目标代码更为高效。
【目标代码生成】
编译的最后一个阶段就是目标代码生成了。任务是把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。这部分工作很复杂,涉及到硬件系统结构和机器指令等。
【符号表管理】
编译过程中源程序的名字和收集到的每个名字的各种属性信息,诸如类型、作用域、分配存储信息等各种信息被保留在种种不同的符号表中,编译各阶段的工作都涉及到构造、查找或更新有关的表格。
【出错处理】
若编译过程中发现源程序有错误,编译程序应报告错误的性质和错误发生的地点,并且将错误所造成的影响限制在尽可能小的范围内,使得源程序的其余部分能继续被编译下去。出错处理主要任务是检查错误、报告出错信息、排错、恢复编译工作。
【小结】
就像我们要翻译外国文档一样,首先读文章(词法分析),然后查单词(语法分析),单词连起来分析句子(语义分析),初步翻译(中间代码生成),对句子进行润色(代码优化),翻译出来形成文档(目标代码)。
相关文章推荐
- Codeforces 2015-2016 ACM-ICPC, NEERC, Southern Subregional Contest D题(计算几何+判断线段相交)
- 折半排序
- Gson解析原理概述
- web网站设计-frameset与iframe框架的使用
- Android之完成SQLite数据库版本更新的过程熟悉
- LightOj 1148 Basic Math
- QTableWidget的使用和美工总结
- 夺命雷公狗jquery---11属性操作
- bzoj3943: [Usaco2015 Feb]SuperBull
- 插入排序
- HttpClient使用详解
- 201510250817_《Javascript权威指南(第六版)——属性描述符、模块、命名空间对象、私有空间命名的函数》(P244-252)
- C#DataGridView中的常用技巧
- 如何做好接口测试?
- C语言的左移和右移探索
- 常用的Hql语句
- iOS开发日记36-iOS中的依赖注入
- 转载:15件事造就有理想的程序员
- 肝脏最怕什么
- Python验证企业工商注册码