热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

1.2编译过程和编译程序的基本结构

1.2编译过程和编译程序的基本结构编译程序的功能是把用高级语言编写的源程序翻译成等价的机器语言或汇编语言表示的目标程序。编译程序是将一种语言形式翻译成另一种语言形式,因此其工作

1.2 编 译 过 程 和 编 译 程 序 的 基 本 结 构

编译程序的功能是把用高级语言编写的源程序翻译成等价的机器语言或汇编语言表示的目标程序

编译程序是将一种语言形式翻译成另一种语言形式,因此其工作过程一般可划分为下列 5 个阶段:词法分析、语法分析、语义分析及中间代码生成、代码优化和目标代码生成

下面,我们以一个简单的程序段为例,分别介绍这 5 个阶段所完成的任务。
例如,计算圆柱体表面积的程序段如下:
float r , h , s ;
s=23.1416r* ( h+r )

第 1 阶段 词法分析
词法分析阶段的任务是对构成源程序的字符串从左到右进行扫描和分解,根据语言的词法规则,识别出一个一个具有独立意义的单词(也称单词符号,简称符号)
词法规则是单词符号的形成规则,它规定了哪些字符串构成一个单词符号。上述源程序
通过词法分析识别出如下单词符号:
基本字 float
标识符 r , h ,s
常数 3.1416 ,2
运算符 * , +
界符 ( ) ; , =

第 2 阶段 语法分析
语法分析的任务是在词法分析的基础上,根据语言的语法规则从单词符号串中识别出各种语法单位(如表达式、说明、语句等)并进行语法检查,即检查各种语法单位在语法结构上的正确性

语言的语法规则规定了如何从单词符号形成语法单位,换言之,语法规则是语法单位的形成规则。
上述源程序,通过语法分解,根据语言的语法规则识别单词符号串 s=23.1416r* ( h+r ),其中“ s ”是<变量>,单词符号串“ 23.1416r* ( h+r )”组合成<表达式>这样的语法单位,则由<变量> = <表达式>构成<赋值语句>这样的语法单位。在识别各类语法单位的同时进行语法检查,可以看到,上述源程序是一个语法上正确的程序。

第 3 阶段 语义分析及中间代码生成
定义一种语言除要求定义语法外,还要求定义其语义,即对语言的各种语法单位赋予具体的意义。语义分析的任务是首先对每种语法单位进行静态的语义审查,然后分析其含义,并用另一种语言形式(比源语言更接近于目标语言的一种中间代码或直接用目标语言)来描述这种语义

例如,上述源程序中,赋值语句的语义为:计算赋值号右边表达式的值,并把它送到赋值号左边的变量所确定的内存单元中。语义分析时,先检查赋值号右边表达式和左边变量的类型是否一致,然后再根据赋值语句的语义,对它进行翻译可得到如下形
式的四元式中间代码:
( 1 ) ( * , 2 , 3.1416 , T 1 )
(2 ) ( * , T 1 , r , T 2 )
(3 ) ( + , h , r , T 3 )
(4 ) ( * , T 2 , T 3 , T 4 )
(5 ) ( = , T 4 , —, s )
其中,
T 1 , T 2 , T 3 , T 4 是编译程序引进的临时变量,存放每条指令的运算结果。上述每一个四元式所表示的语义为:
2 * 3.1416 ⇒ T 1
T 1 * r ⇒ T 2
h + r ⇒ T 3
T 2 * T 3 ⇒ T 4
T 4 ⇒ s
这样,我们将源语言形式的赋值语句翻译为四元式表示的另一种语言形式,这两种语言在结构形式上是不同的,但在语义上是等价的。

第 4 阶段 代码优化
代码优化的任务是对前阶段产生的中间代码进行等价变换或改造,以期获得更为高效的,即省时间和空间的目标代码。优化主要包括局部优化和循环优化等,例如上述四元式经局部
优化后得:
( 1 ) ( * , 6.28 , r , T 2 )
(2 ) ( + , h , r , T 3 )
(3 ) ( * , T 2 , T 3 , T 4 )
(4 ) ( = , T 4 ,—, s )
其中,2 和 3.1416 两个运算对象都是编译时的已知量,在编译时就可计算出它的值 6.28 ,而不必等到程序运行时再计算,即不必生成( * ,2 , 3.1416 , T 1 )的运算指令。

第 5 阶段 目标代码生成
目标代码生成的任务是将中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码

在编译程序的各个阶段中,都要涉及表格管理和错误处理。
编译程序的重要功能之一,是记录源程序中所使用的变量的名字,并且收集与名字属性相关的各种信息。名字属性包括一个名字的存储分配、类型、作用域等信息。如果名字是一个函数名,还会包括其参数数量、类型、参数的传递方式以及返回类型等信息。符号表数据结构可以为变量名字创建记录条目,来登记源程序中所提供的或在编译过程中所产生的这些信息,编译程序在工作过程的各个阶段需要构造、查找、修改或存取有关表格中的信息,因此在编译程序中必须有一组管理各种表格的程序。

如有侵权请联系删除。欢迎大家的关注。


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Final关键字的含义及用法详解
    本文详细介绍了Java中final关键字的含义和用法。final关键字可以修饰非抽象类、非抽象类成员方法和变量。final类不能被继承,final类中的方法默认是final的。final方法不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。文章还讨论了final类和final方法的应用场景,以及使用final方法的两个原因:锁定方法防止修改和提高执行效率。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • switch语句的一些用法及注意事项
    本文介绍了使用switch语句时的一些用法和注意事项,包括如何实现"fall through"、default语句的作用、在case语句中定义变量时可能出现的问题以及解决方法。同时也提到了C#严格控制switch分支不允许贯穿的规定。通过本文的介绍,读者可以更好地理解和使用switch语句。 ... [详细]
  • 加密世界下一个主流叙事领域:L2、跨链桥、GameFi等
    本文介绍了加密世界下一个主流叙事的七个潜力领域,包括L2、跨链桥、GameFi等。L2作为以太坊的二层解决方案,在过去一年取得了巨大成功,跨链桥和互操作性是多链Web3中最重要的因素。去中心化的数据存储领域也具有巨大潜力,未来云存储市场有望达到1500亿美元。DAO和社交代币将成为购买和控制现实世界资产的重要方式,而GameFi作为数字资产在高收入游戏中的应用有望推动数字资产走向主流。衍生品市场也在不断发展壮大。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
author-avatar
HJL--希
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有