为什么要学习编译原理作为程序员,不管是前端开发工程师还是后端开发工程师,编译技术都与我们的工作息息相关。在实际工作中也经常会碰到需要编译技术的场景。比如,前端开发工程师想要了解TypeScript是如何把一门语言翻译成另一门语言的,以及babel是如何编译JavaScript的等等。学习编译技术有助于提升我们的职场竞争力,更有助于程序员在技术的道路上走的更远。那么学习完本篇文章你会对编译原理有个初步的认识,比如:
什么是编译原理编译原理是介绍如何将高级程序设计语言转换成计算机硬件能识别的机器语言,以便计算机进行处理 编译与计算机程序设计语言的关系日常开发过程中我们使用的语言一般都是高级语法比如 JAVA、Python、PHP、JavaScript等等,但是计算机只能识别0、1这样的机器码。那么这些高级语言是如何翻译成机器能识别的0、1等呢?这就用的了编译,首先我们通过下面这幅图看下编译与计算机程序语言的关系,有助于我们直观的了解编译的作用。
程序设计语言的转换方式翻译:指把某种语言的源程序,在不改变语义的条件下,转换成另一种语言程序即目标语言程序 真正的实现有两种方式,编译及解释
编译的转换过程
编译器在语言处理系统中的位置了解了编译与程序设计语言的关系,那么我们接下来再来看下编译器在语言处理系统中所处位置,如下图 编译系统的结构那么机器是如何把高级语言翻译为汇编语言程序或机器语言程序的呢? 我们先来看下人工进行英文翻译的例子,这里引用的哈工大编译原理中的图示
根据上图可以看出要进行语义分析首先需要划分句子成分,那么我们是如何划分句子成分的呢?
词法分析(扫描)编译的第一个阶段,从左到右逐行扫描源程序的字符,识别出各个单词(是高级语言中有是在意义的最小语法单元,由字符构成),确定单词的类型。将识别的单词转换成统一的机内表示即词法单元 简称Token
语法分析(parsing)语法分析的定义语法分析器从词法分析器输出的token序列中识别出各类短语,并构造语法分析树(parse tree),语法分析树描述了句子的语法结构 语法分析的规则即语法规则又称文法,规定了单词如何构成短语、句子、过程和程序。 语法规则的标示如下,含义是A定义为B或者C 来看下赋值语句的语法规则:
语法分析的方法推导(derive)和归约(reduce)
最右推导、最左归约: 语法树计算机通过语法树来进行分析,即语法分析过程也可以用一颗倒着的树来标示,这颗树叫语法树。正确的语法树叶子节点数必须是表达式的符号,例如 赋值语句的分析树: 变量声明语句的分析树: 首先看下变量声明语句的文法(文法是由一系列规则构成的): <D> -> <T> <IDS>; 语义分析语义的任务主要有两个 一. 收集标识符的属性信息
二. 语义检查
中间代码生成通常和语义分析一起实现。对语法分析识别出的各类语法范畴,分析他的含义,进行初步翻译,产生介于源代码和目标代码质检的一种代码 常用的中间代码表示形式
三地址指令的表示:
下面图中展示了一个中间代码生成的例子 代码优化对前面生成的中间代码进行加工变换,以便在最后极端产生更为高效的目标代码 ,需要遵循等价变换的原则,优化的方面包括:公共子表达式的提取、合并已知量、删除无用语句、循环优化。 目标代码生成把经过优化的中间代码转化成特定机器上的低级语言 目标代码的形式:
其他出错处理如果源程序有错误,编译程序应设法发现错误并报告给用户。由专门的出错处理程序来完成。错误类型:
遍指对源程序或源程序的中间结果从头到尾扫描一次,并做有关的加工处理,生成新的中间结果或目标代码。遍与阶段的含义毫无关系 多遍扫描: 优点:节省内存空间,提高目标代码的质量,使编译的逻辑结构清晰。缺点:编译时间长。在内存许可的情况下还是遍数尽可能少较好 编译程序生成
|
|
来自: taotao_2016 > 《计算机》