编译程序的结构
前端和后端的概念
源程序–>前端–>中间代码–>后端–>目标代码 (目的:便于移植)
前端:完成分析工作(词法分析、语法分析、语义分析)
后端:完成综合工作(优化改善目标代码质量、目标代码生成)
“遍”的概念
所谓”遍”,也称作”趟”,是对源程序或其等价的中间语言程序从头到尾扫描并完成规定任务的过程。一个编译过程可由一遍、两遍后多遍完成。
一遍可以只完成词法分析工作,一遍也可以完成词法分析和语法分析工作,甚至一遍可以完成整个编译工作;对于多遍的编译程序,第一遍的输入是用户书写的源程序,最后一遍的输出是目标程序,其余是上一边的输出为下一遍的输入。
编译程序究竟分为几遍,参考的因素主要是源语言和机器(目标机)的特征
一个多遍的编译程序可以比一遍的编译程序少占内存,多遍的编译程序的逻辑结构可能更清晰,但由于遍数多就意味着正价读写中间文件的次数,势必消耗较多的时间,显然会比一遍的编译程序要慢
编译程序在其他软件的应用
- 语言的结构化编辑器(提示输入关键字、完成括号匹配等)
- 语言程序的调试工具、程序格式化工具(以清晰可读方式打印程序)
- 软件测试工具:如FORTRAN,C的静态和动态测试工具(可测试程序语句的覆盖率、路径覆盖率等,都需要编译技术)
- 高级程序设计语言的转换工具、程序理解工具(Olink CC++数据流分析 、Eclipse Tptp 性能分析工具)
- 网络中的协议
- 数据库系统中各种命令语言的翻译。
文法和语言
语言的定义:是由句子组成的集合,是由一组记号所构成的集合。
语法(Syntax):表示构成语言句子的各个记号之间的组合规律
语义(Semantic):表示按照各种表示方法所表示的各个记号的特定含义(各个记号和记号所表示的对象之间的关系)
语用(Pragmatics):表示在各个记号所出现的行为中,他们的来源、使用和影响
一个程序设计语言是一个记号系统,它的完整定义包括语法和语义两个方面
所谓一个语言的语法是指一组规律,用它可以形成和产生一个合适的程序;
程序设计语言的语义常常分为两类:静态语义和动态语义。
静态语义是一系列限定规则,并确定哪些合乎语法的程序是合适的;
动态语义也称作运行语义或执行语义,表明程序要做什么,要计算什么。
常用的语法描述方法有:正规文法(词法规则)、上下文无关文法(语法规则)。
使用文法作为工具,不仅是为了严格的定义句子的结构,也是为了用适当的条数的规则把语言的全部句子描述出来,可以说_文法是以有穷集合刻画无穷集合的一个工具。_