编译程序的任务

news2024/10/7 16:18:10

编译程序是一种翻译程序,编译程序是将一种语言形式翻译成另一种语言形式。它将高级语言所写的源程序翻译成等价的机器语言或汇编语言的目标程序。

整个编译过程一般可以划分为 5 个阶段:词法分析、语法分析、语义分析及中间代码生成、中间代码优化和目标代码生成。我们以一个简单的程序段为例,分别介绍这 5 个阶段所完成的任务。例如,计算圆柱体表面积的程序段如下:

float r,h,s;
s = 2 * 3.1416 * r * (h + r);

词法分析

词法分析阶段的任务是对构成源程序的字符串进行从左到右的扫描和分解,根据语言的词法规则,识别出一个一个具有独立意义的单词(也称单词符号,简称符号)。

语言的词法规则是单词符号的形成规则,它规定了哪些字符串构成一个单词符号。上述源程序通过词法分析,根据语言的词法规则识别出如下单词符号:

  • 基本字(关键字) float
  • 标识符 r,h,s
  • 常数 3.1416,2
  • 运算符 *,+
  • 界符 () ; ,

单词符号的类型有:关键字、标识符、常数、运算符、界符。

语法分析

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

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

语义分析及中间代码生成

定义一种语言除了要求定义语法外,还要求定义其语义,即对语言的各种语法单位赋予具体的意义。

语义分析的任务是首先对每种语法单位进行静态的语义审查,然后分析其含义,并用另一种语言形式(比源语言更接近于目标语言的一种中间代码或直接用目标语言)来描述这种语义。例如,上述源程序中,赋值语句的语义为:计算赋值号右边表达式的值,并把它送到赋值号左边的变量所确定的内存单元中。语义分析时,先检查赋值号右边表达式和左边变量的类型是否一致,然后再根据赋值语句的语义,对它进行翻译可得到如下形式的四元式中间代码:

1687188700756.jpg

其中,T1、T2、T3、T4 是编译程序引进的临时变量,存放每条指令的运算结果。上述每一个四元式所表示的语义为:

image-20230619233532857.png

这样,我们将源语言形式的赋值语句翻译为四元式表示的另一种语言形式,这两种语言在结构形式上是不同的,但在语义上是等价的。

中间代码优化

中间代码优化的任务是对前阶段产生的中间代码进行等价变换或改造,以期获得更为高效的,节省时间和空间的目标代码。优化主要包括局部优化和循环优化等,例如上述四元式经局部优化后得:

image-20230619233811382.png

其中,2 和 3.1416 两个运算对象都是编译时的已知量,在编译时就可计算出它的值 6.28,而不必等到程序运行时再计算,即不必生成(*,2,3.1416,T1)的运算指令。

目标代码生成

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

表格管理 & 错误处理

在编译程序的各个阶段中,都要涉及表格管理和错误处理。

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

如果编译程序只处理正确的程序,那么它的设计和实现将会大大简化。但是程序设计人员还期望编译程序能够帮助定位和跟踪错误。无论程序员如何努力,程序中难免总会有错误出现。虽然错误很常见,但很少有语言在设计的时候就考虑到错误处理问题。大部分程序设计语言的规范没有规定编译程序应该如何处理错误;错误处理方法由编译程序的设计者决定。 因此,从一开始就计划好如何进行错误处理,不仅可以简化编译程序的结构,还可以改进错误处理方法。一个好的编译程序在编译过程中, 应具有广泛的程序查错能力,并能准确地报告错误的种类及出错位置,以便用户查找和纠正,因此在编译程序中还必须有一个出错处理程序。

编译程序

编译过程的这 5 个阶段的任务分别由 5 个程序完成,这 5 个程序分别称为词法分析程序、语法分析程序、语义分析及中间
代码生成程序、中间代码优化程序和目标代码生成程序,另外再加上表格管理程序和出错处理程序。这些程序便是编译程
序的主要组成部分,一个典型编译程序的结构框图如图所示。

image-20230619225502471.png

需要注意的是,图中所给出的各个阶段之间的关系是指它们之间的逻辑关系,不一定是执行时间上的先后关系。实际
上,可按不同的执行流程来组织上述各阶段的工作,这在很大程度上依赖于编译过程中对源程序扫描的遍数以及如何划分各遍扫描所进行的工作。

此处所说的 “遍”,是指对源程序或其等价的中间语言程序从头到尾扫描一遍,并完成规定加工处理工作的过程。例如,可以将前述 5 个阶段的工作结合在一起,对源程序从头到尾扫描一遍来完成编译的各项工作,这种编译程序称为一遍扫描的编译程序。对于某些程序设计语言,用一遍扫描的编译程序去实现比较困难,可采用多遍扫描的编译程序结构,每遍可完成上述某个阶段的一部分、全部或多个阶段的工作,且每一遍的工作是从前一遍获得的工作结果开始的,最后一遍的工作结果是目标语言程序,第一遍的输入则是用户书写的源程序。

多遍扫描的编译程序较一遍扫描的编译程序少占存储空间,遍数多一些,可使各遍所要完成的功能独立而单纯,其编译程序逻辑结构清晰,但遍数多势必增加输入输出开销,这将降低编译效率。一个编译程序究竟应分成几遍和它所面临的源语言的特征、机器规模、设计的目标等因素有关,很难统一划定。一般在主存可能的前提下,还是遍数少一点为好。

参考资料

《编译原理(第4版)》1.2 编译过程和编译程序的基本结构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/665573.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UOS系统VMware安装教程

官网链接 https://home.uniontech.com/ 从这里下镜像文件 内存最好4以上 选择ISO文件地址 选择自定义安装 手动分区 4个g给交换分区&#xff0c;剩下的全挂在根目录下

长视频自动化摘要笔记完整工作流;腾讯云发布AIGC全链路内容安全解决方案

&#x1f989; AI新闻 &#x1f680; 腾讯云发布AIGC全链路内容安全解决方案&#xff0c;助力企业护航生成式人工智能健康发展 摘要&#xff1a;腾讯云公布MaaS能力全景图&#xff0c;提供AIGC全链路内容安全解决方案&#xff0c;覆盖从模型训练到内容生成再到事后运营全过程…

【工程应用八】终极的基于形状匹配方案解决(小模型+预生成模型+无效边缘去除+多尺度+各项异性+最小组件尺寸)

我估摸着这个应该是关于形状匹配或者模版匹配的最后一篇文章了&#xff0c;其实大概是2个多月前这些东西都已经弄完了&#xff0c;只是一直静不下来心整理文章&#xff0c;提醒一点&#xff0c;这篇文章后续可能会有多次修改&#xff08;但不会重新发文章&#xff0c;而是在后台…

搭建GPU环境的TensorFlow并将单块GPU划分逻辑为分区的实践

1、搭建环境 1.1、查看GPU版本 在安装tensorflow的GPU版本之前可以先看下自己的显卡情况 命令&#xff1a;nvidia-smi 或者桌面右下角&#xff0c;NVIDIA图标&#xff0c;进入到NVIDIA的控制面板&#xff1a; 点击左下角的系统信息&#xff0c;组件中查看NVCUDA64.dll的版本…

英特尔淡化混合 CPU-GPU 引擎,将 NNP 合并到 GPU 中

早在 2022 年 2 月&#xff0c;当英特尔宣布其“Falcon Shores”项目以构建混合 CPU-GPU 计算引擎时&#xff0c;该项目允许在单个插槽中独立扩展 CPU 和 GPU 容量&#xff0c;看起来这家芯片制造商正准备与竞争对手 Nvidia 较量AMD 开始使用混合计算电机&#xff0c;Intel 称之…

基于Flask框架和Vue框架搭建一个Web端的深度学习检测系统(从模型训练,界面设计到服务器部署实现一个完整项目实战)

从Pytorch框架下YOLOv5的模型训练&#xff0c;到Flask框架的模型加载&#xff0c;再到Vue框架的界面设计到最后的服务器部署。 实验环境 1.Windows10系统 2.编辑器pycharm 3.GPU 1080Ti 4.anaconda虚拟环境安装相应的安装包 5.pytorch版本1.7.1 6.Python3.7.15 实验数据集 …

C++初阶—stackqueue

目录 1. stack的介绍和使用 1.1 stack的介绍 1.2 stack使用及OJ 1.2.1 最小栈 1.2.2 栈的弹出压入顺序 1.2.3 逆波兰表达式求值 1.2.4 用两个栈实现一个队列 2. queue的介绍和使用 2.1 queue的介绍 2.2 queue的使用及OJ 2.2.1 用队列实现栈 2.3 queue的模拟实现 3…

用户测试:确保产品质量的关键一环

用户测试&#xff1a;确保产品质量的关键一环 在当今竞争激烈的市场中&#xff0c;产品的质量是企业脱颖而出的关键因素之一。为了确保产品的质量&#xff0c;用户测试成为了开发过程中不可或缺的一环。用户测试是通过让真实用户使用产品并提供反馈意见来验证产品的功能、易用性…

【系统开发】尚硅谷 - 谷粒商城项目笔记(四):JSR303数据校验

文章目录 JSR303数据校验引入依赖和简介配置验证规则开启验证BindResult校验的统一异常处理JSR303分组校验自定义校验注解 JSR303数据校验 引入依赖和简介 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-bo…

Python和c语言爬虫如何选择?

Python是最受欢迎的爬虫语言之一&#xff0c;因为它易于学习和使用&#xff0c;有大量的库和框架可供选择。JavaScript通常用于Web爬虫&#xff0c;因为它可以直接在浏览器中运行&#xff0c;可以轻松地从动态网站中提取数据。java是一种广泛使用的语言&#xff0c;它有很多强大…

提高电商平台精准营销效果的IP定位离线库应用场景

随着电子商务的快速发展&#xff0c;越来越多的人们选择在线购物。随之而来的是消费者数量的增加和商品竞争的激烈。如何精准地找到目标客户&#xff0c;并进行有效的营销&#xff0c;成为了电商平台需要攻克的难题。在这种情况下&#xff0c;IP定位离线库技术的应用成为了电商…

Python基础语法第一章、认识Python

一、计算机基础概念 1.1什么是计算机? 很多老一辈的人, 管下面这个叫做计算机. 然鹅, 它只是 "计算器", 和计算机是有很大区别的. 现在我们所说的计算机, 不光能进行算术运算, 还能进行逻辑判断, 数据存储, 网络通信等等功能, 以至于可以自动的完成非常复杂的工作…

SerDes的原理解析

01 SerDes简介 首先我们要了解什么是SerDes&#xff0c;SerDes的应用场景又是什么呢&#xff1f;SerDes又有哪些常见的种类&#xff1f;做过FPGA的小伙伴想必都知道串口&#xff0c;与并行传输技术相比&#xff0c;串行传输技术的引脚数量少、扩展能力强、采 用点对点的连接方式…

从uCOSii中抠出来的内存管理程序

从uCOSii中抠出来的内存管理程序 1、学习uCOSii的内存管理的原因 操作系统和内存管理是分不开的&#xff0c;每个操作系统都有自己的一套内存管理方法。在实际应用中&#xff0c;我们尽量使用其自带的内存管理。学习和使用uCOSii也有一段时间了&#xff0c;觉得它的内存管理方…

高效处理报表,掌握原生JS打印和导出报表为PDF的顺畅技巧!

摘要&#xff1a;本文由葡萄城技术团队于CSDN原创并首发。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言篇 在日常工作中&#xff0c;报表打印和导出为PDF是经常要处理的任务之一。除了方…

管理类联考——写作——素材篇——论说文——写作素材02——志篇:毅力·坚持

管理类专业学位联考 (写作能力) 论说文素材 02——志篇&#xff1a;毅力坚持 论文说材料: 骐骥一跃&#xff0c;不能十步&#xff1b;驽马十驾&#xff0c;功在不舍。 ——《荀子劝 学》 一&#xff1a;道理论据 咬住青山不放松&#xff0c;立根原在破岩中&#xff1b;千磨…

gitLens插件简单使用(默认上传github)

1.安装 在vscode中的插件管理输入如下后下载 GitLens — Git supercharged 2.配置 点击文件--首选项--设置 点击右上角设置小图标 3.github使用 首先仓库文件一定是要git init是git所管理的 1.在代码文件夹下使用git init创建仓库 2.打开vscode的git管理 3.点击添加暂存区…

如何使用ArcGIS加载天地图

天地图是自然资源部主管&#xff0c;国家基础地理信息中心负责建设的国家地理信息公共服务平台&#xff0c;于2011年1月18日上线。 有的时候可能需要将在线的天地图加载到ArcGIS内&#xff0c;但是加载方式越来越复杂&#xff0c;很多方法都需要申请key&#xff0c;这里为大家…

C++基础(3)——类和对象(2)

前言 本文主要介绍了C中类和对象的基本知识。 4.2.5&#xff1a;深拷贝和浅拷贝 浅拷贝&#xff1a;编译器给我们提供的拷贝函数就是等号复制操作 深拷贝&#xff1a;自己手动重写一个拷贝构造函数&#xff0c;重新new 浅拷贝会出现的问题&#xff1a;如果使用编译器提供的…

AI是什么?AI工具集网站大全

AI是什么&#xff1f; AI 是人工智能的缩写&#xff0c;指的是通过计算机技术和算法来实现智能的能力。我们人类的智能是基于我们的大脑所实现的&#xff0c;而 AI 因此也常被称为机器智能。AI技术需要机器能够感知、推理和行动&#xff0c;这些都需要底层算法的支持&#xff…