CICC科普栏目|想初步了解编译原理?看这篇文章就够了
为什么要学习编译原理
作为程序员,不管是前端开发工程师还是后端开发工程师,编译技术都与我们的工作息息相关汕头道教灵符网请符。在实际工作中也经常会碰到需要编译技术的场景。比如,前端开发工程师想要了解Type是如何把一门语言翻译成另一门语言的,以及babel是如何编译Java的等等。 学习编译技术有助于提升我们的职场竞争力,更有助于程序员在技术的道路上走的更远。那么学习完本篇文章你会对编译原理有个初步的认识,比如:
知道为什么要学习编译
了解编译原理和汕头道教灵符网请符我们日常开发中使用的开发语言的关系
汕头道教灵符网请符了解编译在语言系统中所处的位置及 编译系统的结构
了解 词法分析、语法分析、语义分析 这些汕头道教灵符网请符我们工作中经常听到的概念等等
什么是编译原理 编译与计算机程序设计语言的关系
注意:每种机器都对应一种汇编语言
程序设计语言的转换方式
翻译:指把某种语言的源程序汕头道教灵符网请符, 在不改变语义的条件下,转换成另一种语言程序即目标语言程序
真正的实现有两种方式汕头道教灵符网请符,编译及解释
编译 :专指由高级语言转换为低级语言, 整个程序翻译 汕头道教灵符网请符。常用的例如:c、c++,delphi,Fortran、Pascal、Ada
解释 :接受某种高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这个句子的执行结果,然后再接受下一个语句汕头道教灵符网请符。类似口译, 一句一句进行解释 。常用的例如:python 解释以源程序作为输入, 不产生目标程序 ,一边解释一边执行。 优点 :直观易懂,结构简单,易于实现人机对话。 缺点 :效率低(不产生目标程序,每次都需要重新执行,速度慢)
编译的转换过程
编译-运行
编译-汇编-运行
编译器在语言处理系统中的位置
了解了编译与程序设计语言的关系汕头道教灵符网请符,那么我们接下来再来看下编译器在语言处理系统中所处位置,如下图
编译系统的结构
那么机器是如何把高级语言翻译为汇编语言程序或机器语言程序的呢汕头道教灵符网请符?
我们先来看下人工进行英文翻译的例子汕头道教灵符网请符,这里引用的哈工大编译原理中的图示
图中的 中间表示很重要主要起到了一个桥梁的作用,比如图中的中间表示可以使用各种语言表示汕头道教灵符网请符。
根据上图可以看出要进行语义分析首先需要划分句子成分汕头道教灵符网请符,那么我们是如何划分句子成分的呢?
首先通过 词法分析分析出句子中各个单词的词性或者词类
然后进行 语义分析根据句子结构分析出句子中各个短语在句子中充当什么成分 汕头道教灵符网请符,从而确定各个名词性成分同各个核心谓语动词间的关系语意关系
最后给出中间表示形式 实际上编译器在工作的时候也是经过了以上几个步骤,我们成为 阶段(计算机的逻辑组织方式,在实现过程中多个阶段可能会被组合在一起实现) ,可以分为两大部分: 分析源语言、生成目标代码 ,在编译器中他们分别对应编译器的前端和后端两个部分汕头道教灵符网请符。编译器的结构如下图 了解了编译器的结构,让我们从编译器的前端开始讲起,看看词法分析、语法分析、语义分析等各个阶段都做了什么。
词法分析(扫描)
t o k e n : 种别码汕头道教灵符网请符,属性值 token:种别码,属性值
名字解释
一词一码 :例如汕头道教灵符网请符,关键字是唯一的且事先可以确定,为每个关键字分配一个种别码
多词一码 :例如汕头道教灵符网请符,所有的标示符统一作为一类单词分配同一个种别码,为了区分不同的标示符,用token的第二个分量“属性值”存放不同标示符具体的字面值
一型一码 :不同类型的常量他们的构成方式是不同的,例如,我们为每种类型的常量分配一个种别码,为了区分同一类型下的不同常量,也用token的第二个分量“属性值”存放每个常量具体的值 下面图中是一个词法分析后得到的token序列的例子 描述词法规则的有效工具是 正规式 和 有限自动机 汕头道教灵符网请符。 正规式 :用来确定单词是否和程序语言规范。 有限自动机 :通过有限自动机进行单词和正规式比较
语法分析(parsing) 语法分析的定义
语法分析的规则
即 语法规则又称 文法,规定了单词如何构成短语、句子、过程和程序汕头道教灵符网请符。
语法规则的标示如下汕头道教灵符网请符,含义是A定义为B或者C
B N F : A : : = B ∣ C BNF: A::= B∣
句子 : : = 主 谓 宾 句子::=主谓宾
主 : : = 定 名 主::=定名
来看下赋值语句的语法规则:
A::=V=E
E::=T|E+T
T::=F|T*F
F::=V|(E)|C
V::=标示符
C::=常数 即由标示符或者常数的表达式进行加减乘除运算
语法分析的方法
推导(derive)和归约(reduce)
推导 :最左推导、最右推导
归约 :最右归约、最左归约,推导的逆过程就是归约
最右推导、最左归约: 最左推导、最右归约:
语法树
计算机通过 语法树来进行分析,即语法分析过程也可以用一颗倒着的树来标示,这颗树叫 语法树汕头道教灵符网请符。正确的语法树叶子节点数必须是表达式的符号,例如
赋值语句的分析树:
变量声明语句的分析树:
首先看下变量声明语句的文法( 文法是由一系列规则构成的):
D- TIDS;
T- int | real | char | bool
IDS- id | IDS, id
复制代码
语义分析
语义的任务主要有两个
一. 收集标识符的属性信息
种属(Kind) :简单变量、复合变量(数组、记录、...)、过程、...
类型 (Type) :整型、实型、字符型、布尔型、指针型、...
存储位置、长度
值
作用域
参数和返回值信息 汕头道教灵符网请符,参数个数、参数类型、参数传递方式、返回值类型、... 语义分析阶段收集的标识符的信息都会存储在一个 符号表 里,每个标识符都对应符号表中的 一条记录 ,记录的每个字段记录标识符的每个属性,符号表通常带有一个 字符串表 用来存放程序中用到的标识符和字符常数, Name 就会被分为两个部分,一部分存放标识符在字符串表中的起始位置,另一部分用来存储标识符的长度 ,符号表如下图: 除了符号表还有 常量表 (登记各类常量表); 标号表 (登记标号的定义和应用,不常用目标); 入口名表 (登记过程的层号、程序符号表入口等),各种表的生成大部分在词法分析阶段但是在后面各个阶段都有维护; 中间代码表
二. 语义检查
变量或过程 未经声明就使用
变量或过程名 重复声明
运算分量 类型不匹配
操作符与操作数之间的类型不匹配
数组下标 不是整数
对 非数组变量 使用数组访问操作符
对 非过程名 使用过程调用操作符
过程调用的**参数类型或数目不匹配 **
函数 返回类型 有误
中间代码生成
常用的中间代码表示形式
三地址码 (Three-address Code):三地址码由类似于汇编语言的指令序列组成汕头道教灵符网请符,每个指令最多有三个操作数(operand)
语法结构树/语法树 (Syntax Trees)
逆波兰式
三地址指令的表示:
四元式 (Quadruples)汕头道教灵符网请符,(op, y, z, x)
三元式 (Triples)
间接三元式 (Indirect triples)
下面图中展示汕头道教灵符网请符了一个中间代码生成的例子
代码优化
对前面生成的中间代码进行加工变换,以便在最后极端产生更为高效的目标代码 , 需要遵循等价变换的原则,优化的方面包括:公共子表达式的提取、合并已知量、删除无用语句、循环优化汕头道教灵符网请符。
目标代码生成
把经过优化的中间代码转化成特定机器上的低级语言
目标代码的形式:
绝对指令代码:可立即执行的目标代码
汇编指令代码:汇编语言程序汕头道教灵符网请符,需要经过汇编陈旭汇编后才能运行
可重定位指令代码:先将各目标模块连接起来汕头道教灵符网请符,确定变量、常数在主存中的位置,装入主存后才能成为可以运行的绝对指令代码
其汕头道教灵符网请符他
出错处理
如果源程序有错误,编译程序应设法发现错误并报告给用户汕头道教灵符网请符。由专门的出错处理程序来完成。错误类型:
语法错误:在词法分析和语法分析阶段检测出来
语义错误:一般在语义分析阶段检测
逻辑错误:不可检测汕头道教灵符网请符,比如死循环,一般不处理因为没办法在编译阶段检测出来
遍
指对源程序或源程序的中间结果从头到尾扫描一次,并做有关的加工处理,生成新的中间结果或目标代码汕头道教灵符网请符。 遍与阶段的含义毫无关系
多遍扫描: 优点:节省内存空间,提高目标代码的质量,使编译的逻辑结构清晰汕头道教灵符网请符。 缺点:编译时间长。在内存许可的情况下还是遍数尽可能少较好
编译程序生成
直接用机器语言编写编译程序
用汇编语言编写编译程序 汕头道教灵符网请符,编译程序核心部分常用汇编语言编写
用高级语言编写编译程序 汕头道教灵符网请符,这也是普遍采用的方法
自编译
编译工具 LEX(语法分析)与YACC(用于自动生成LALR分析表)
移植 (同种语言的编译程序在不同类型的机器之 间移植) 在某机器上为某种语言构造编译程序要掌握以下三方面:
源语言
目标语言
编译方法 编译的基础知识就是这些啦汕头道教灵符网请符,后续会继续深入的学习并记录,喜欢麻烦点赞哈
—版权声明—
来源:前端小小min汕头道教灵符网请符,编辑:nhyilin
仅用于学术分享,版权属于原作者汕头道教灵符网请符。
若有侵权汕头道教灵符网请符,请联系微信号:Eternalhui或nhyilin删除或修改!
关注公众号汕头道教灵符网请符了解更多
会员申请 请在公众号内回复“个人会员”或“单位会员
欢迎关注中国指挥与控制学会媒体矩阵
CICC官方网站
CICC官方微信公众号
《指挥与控制学报》官网
国际无人系统大会官网
中国指挥控制大会官网
全国兵棋推演大赛
全国空中智能博弈大赛
搜狐号
一点号
本文链接:https://fuzhouwang.org/index.php/post/11308.html
转载声明:本站文章中有转载或采集其他网站内容, 如有转载的文章涉及到您的权益及版权,还麻烦及时联系我们,我们将及时删除,谢谢配合。