资讯专栏INFORMATION COLUMN

编译原理

crossea / 2090人阅读

摘要:编译器概述编辑器从逻辑上可以分为若干个阶段,每个阶段将源程序从一种表示变换成另一种表示。翻译器编译器解释器翻译器能够将一种语言源语言变换成另一种语言目标语言的软件。

1、编译器概述

编辑器从逻辑上可以分为若干个阶段,每个阶段将源程序从一种表示变换成另一种表示。

以Pascal语言的 position := initial + rate * 60 为例子介绍编译的各个阶段

1.1 词法分析

词法分析 又叫线性分析 或者 线性扫描

逐个读取源程序的字符,把他们组成词法记号(token)流,并且把词法单元填入符号表。

在这个阶段会删除掉分隔记号的空格

1.2 语法分析

语法分析又叫 层次分析

将词法记号流按照语法结构进行层次分组,形成语法短语,语法短语常用分析树表示

1.2.1 层次结构遵循的规则

任何一个标识符都是表达式

任何一个数都是表达式

如果e**1和e2都是表达式,那么
e1 + e2

e1 * e2

(e1)

也都是表达式

1.3 语义分析

进行语义分析,生成语法树

作用:

(1)进行语义检查(其中包括类型检查)、保证各部分能有意义的集合在一起

(2)搜集类型信息

1.4 中间代码生成

经过语法分析和语义分析之后,某些编译器生成源程序的显式中间表示。

具备两个性质: 易于产生、易于翻译成目标程序

功能:

(1)需决定运算完成的次序。(疑问每个语句之多一个算符)

(2)必须产生临时变量名。(保留每个语句的计算结果)

(3)必须处理控制流结构和过程调用

中间表示的常用形式: 三地址代码。

1.4.1 三地址代码

三地址代码 由 三地址语句序列组成,最多三个操作数

1.5 代码优化

试图改进代码,产生执行较快的机器代码

1.6 代码生成

生成可重定位的机器代码或者汇编码

功能:
(1)为源程序所用的每个变量选择存储单元 (寄存器分配)

(2) 将中间代码生成等价的机器指令序列

1.7符号表管理

符号表 :为每一个标识符保存一个记录的数据结构,记录的域是标识符的属性(标识符的存储分配、类型和作用域信息)

1.8 错误诊断与报告

每个阶段都有可能发现源程序的错误,在发现错误之后,该阶段必须处理此错误,使得编译可以继续进行,以便进一步发现源程序的其他错误。

词法分析阶段 :诊断当前被扫描的字符串不能形成语言的词法记号。

语法分析阶段:诊断记号流违反的语法规则。

语义分析阶段:找到对所含操作无意义的结构。

1.9、编译的总过程

2、阶段分组(前端和后端)

在实际编译器中,若干阶段可以组合在一起,各阶段之间的中间表示也无需显示构成

通常将所有阶段分为前端和后端:

前端:只依赖于源程序,由几乎独立于目标机器的阶段或者阶段的一部分组成。

   包括:词法分析、语法分析、符号表建立、语义分析、中间代码生成、部分代码优化、与这些阶段同时完成的错误处理。

后端:依赖于目标机器,一般独立于源程序,而与中间代码有关。

   包括:代码优化、代码生成、伴随这些阶段的符号表操作和错误处理
3、遍

编译的几个阶段常用 一遍扫描来实现,一遍扫描包括读一个输入文件和写一个输出文件

把几个阶段组成一遍,并且这些阶段的活动可以在该遍中交错进行。例如:可以把语法分析看成主导,当它需要记号时,调用词法分析器去下一个记号。如果已经看出一个语法结构,语法分析器则激活中间代码生成器,以完成语义分析和生成中间代码。

4、翻译器、编译器、解释器

翻译器:能够将 一种语言(源语言)变换成另一种语言(目标语言)的软件。

编译器:编译器是一种翻译器,将高级语言变换成一种低级语言的软件。特点在于 目标语言比源语言低级

解释器:也需要对源程序进行词法、语法和语义分析,中间代码生成。但是不生成目标代码,而是直接执行源程序所指定的运算

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/97869.html

相关文章

  • 编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(四)结语

    摘要:四则运算编译器,虽然说功能很简单,只能编译四则运算表达式。再复杂的编译器再简单的编译器,功能上是差不多的,只是复杂的编译器实现上会更困难。每一章都是理论与实践结合的经典,从计算机硬件知识到软件体系,再到编译原理和操作系统。 四则运算编译器,虽然说功能很简单,只能编译四则运算表达式。但是编译原理前端部分几乎都有涉及,词法分析,语法分析,还有代码生成。 再复杂的编译器、再简单的编译器,功能...

    chemzqm 评论0 收藏0
  • 编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(一)词法分析

    摘要:一般的程序,是无法直接执行的,因为只能识别机器指令。所以要想执行一个程序,首先要将高级语言编写的程序翻译为汇编代码,再将汇编代码翻译为机器指令,这样才能识别并执行。 编译器 编译器是一个程序,作用是将一门语言翻译成另一门语言。 一般的程序,CPU 是无法直接执行的,因为 CPU 只能识别机器指令。所以要想执行一个程序,首先要将高级语言编写的程序翻译为汇编代码,再将汇编代码翻译为机器指令...

    wangdai 评论0 收藏0
  • 如何学习编译原理

    摘要:对于没有计算机科学基础知识的程序员或初学者来说一上来就看龙书虎书是行不通的全是理论知识看得想睡觉我还试过看网易云大学计算机专业的编译原理课程也是看得一头雾水看到多讲就看不下去了另外计算机程序的构造和解释这本很多人推荐的书其实并不适合初学者前 对于没有计算机科学基础知识的程序员或初学者来说 一上来就看龙书 虎书是行不通的 全是理论知识 看得想睡觉 我还试过看网易云大学计算机专业的编译原理...

    melody_lql 评论0 收藏0
  • 编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(三)模拟执行

    摘要:栈在内存中,栈的特点是只能在同一端进行插入和删除的操作,即只有和两种操作。指令的作用是将一个操作数推入栈中。指令的作用是执行两次操作,弹出两个操作数和,然后执行,再将结果到栈中。 现在来模拟一下 CPU 执行机器指令的情况,由于汇编代码和机器指令一一对应,所以我们可以创建一个直接执行汇编代码的模拟器。在创建模拟器前,先来讲解一下相关指令的操作。 栈 在内存中,栈的特点是只能在同一端进行...

    Ku_Andrew 评论0 收藏0
  • 编译原理实战入门:用 JavaScript 写一个简单的四则运算编译器(二)语法分析

    摘要:语法分析对输入的文本按照语法规则进行分析并确定其语法结构的一种过程,称为语法分析。递归下降分析法递归下降分析法,也称为自顶向下分析法。表达式代码生成我们通常用的四则运算表达式是中缀表达式,但是对于计算机来说中缀表达式不便于计算。 四则运算的语法规则(语法规则是分层的) x* 表示 x 出现零次或多次 x | y 表示 x 或 y 将出现 ( ) 圆括号,用于语言构词的分组 以下规则...

    hankkin 评论0 收藏0
  • javascript引擎工作原理的初步了解

    摘要:引擎是能运行代码的程序或解释器。代码的运行明显的分成两个阶段,也就是编译阶段和运行字节码阶段。它首先由编译器编译成字节码文件,然后再通过虚拟机从文件中读一行解释执行一行。 Javascript引擎是能运行javascript代码的程序或解释器。做为前端开发人员,了解javascript底层的工作原理,可以用助于写出高效的javascript代码。那我们就来看一下,我们写的代码是如何在j...

    DevTTL 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<