编译原理笔记(一)引论
文章目录
- 1.什么是编译程序
- 2.编译过程和编译程序的结构
- 2.1.编译过程概述
- 2.2.编译程序的结构
- 2.3.编译阶段的组合
- 3.解释程序和一些软件工具
- 3.1.解释程序
- 3.2.处理源程序的软件工具
- 4.PL/0语言编译系统
学习总结:这一部分是编译原理的绪论部分内容,对编译程序的整体框架流程进行了介绍。内容均为概念,没有能够出大题的内容,个人认为考试前只需要对这些概念有一个基本的了解即可,而非将本章作为复习重点。
1.什么是编译程序
编译程序的地位:
- 编译程序是现代计算机系统的基本组成部分之一;
- 多数计算机都配有不止一种高级语言编译程序,对有些高级语言甚至配置了几个不同性能的编译程序。
编译程序的功能:从功能上看,一个编译程序就是一个语言翻译程序,把一种语言(源语言)书写的程序翻译成另一种语言(目标语言)的等价程序。但是其中的源语言是高级语言,目标语言是低级语言。
编译程序的重要性:编译程序使得多数计算机用户不必考虑与机器有关的繁琐细节,使得程序员独立于机器。
程序设计语言处理程序的典型流程:编译程序是程序设计语言处理程序的一部分。

- 预处理程序:一个源程序可能分成几个模块存放在不同的文件里,由预处理程序来将这些源程序汇集在一起。有些预处理程序也负责宏展开(如C语言的预处理程序)。
- 过程概述:编译程序生成的目标程序是汇编代码的形式,需要经过汇编程序翻译成可再装配(或可重定位)的机器代码,再经由装配/连接编辑程序与某些库程序连接成可以在机器上运行的代码。
2.编译过程和编译程序的结构
2.1.编译过程概述
编译过程的典型划分方法:

-
词法分析:
- 词法分析是编译过程的第一个阶段;
- 词法分析阶段的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词,例如标识符和保留字等。
-
语法分析:
- 语法分析是编译过程的第二个阶段;
- 语法分析阶段的任务是在词法分析的基础上将单词序列分解为各种语法短语,例如程序、语句和表达式等。通过语法分析确定整个输入串是否构成语法上正确的程序。
- 可以将语法分析的结果表示为语法树的形式。
-
语义分析:
- 语义分析是审查源程序有无语义错误,为代码生成阶段收集类型信息。
- 语义分析的具体任务包括类型审查、下标检查和运算对象的类型转换等。
-
中间代码生成:
- 在进行完语法分析和语义分析后,有的编译程序将源程序变为一种内部表示形式,这种内部表示形式被称为中间语言或中间代码。
- 中间代码是一种结构简单、含义明确的记号系统,需要满足两点设计原则:一是容易生成,二是容易将它翻译成目标代码。
- 很多编译程序采用一种类似于三地址指令的“四元式”中间代码,可以表示为
(运算符,运算对象1,运算对象2,结果)。
-
代码优化:代码优化阶段的任务是对前一个阶段产生的中间代码进行变换或改造,目的是使得生成的目标代码更加高效,也就是更加节约时间和空间。
-
目标代码生成:
- 目标代码生成阶段的任务是把中间代码变换为特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码。
- 这是编译的最后阶段,它的工作和硬件结构和指令含义等都有关,是一个非常复杂的过程。
备注:并非所有的编译程序都划分为这样几个阶段,有些编译程序并不需要生成中间代码,有些编译程序不进行优化。不过大多数编译程序都包含上述几个工作阶段。
2.2.编译程序的结构
编译程序的组成:
- 编译过程的六个阶段可以分别由词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序和目标代码生成程序六个模块完成。
- 此外,一个完整的编译程序还必须包括表格管理程序和出错处理程序。
- 表格管理程序:编译过程中源程序的各种信息被保留在不同的表格中,编译各阶段的工作都涉及构造、查找和更新有关的表格,因此需要有表格管理的工作。
- 出错处理程序:如果在编译过程中发现源程序有错误,编译程序应该报告错误的性质和错误发生的地点,并且将错误所造成的影响限制在尽可能小的范围内,使得源程序的其余部分能够继续被编译下去,有些编译器还能自动校正错误,这些工作由出错处理程序完成。
2.3.编译阶段的组合
编译过程前端和后端的划分:有时候把编译过程分为前端和后端。
- 编译前端:前端的工作主要依赖于源语言,而与目标语言无关。一般包括词法分析、语法分析、语义分析和中间代码生成这些阶段,以及某些优化工作。
- 编译后端:后端是指那些依赖于目标机而一般不依赖于源语言,只与中间代码有关的那些阶段的工作,包括目标代码生成,以及相关出错处理和符号表操作。
- 前端和后端的组合:某一个编译程序的前端加上相应的后端可以为不同的机器构成同一个源语言的编译程序;不同语言编译的前端生成同一种中间语言,再使用一个共同的后端,则可以为同一个机器生成几个语言的编译程序。
编译过程的遍数:
- 一个编译过程可以由一遍、两遍或多遍完成。
- 遍,是指对源程序或其等价的中间语言程序从头到尾扫描并完成规定任务的过程,每一遍扫描可以完成上述一个阶段或多个阶段的工作。
- 一个多遍的编译程序可以比一遍的编译程序少占内存,整个编译程序的逻辑结构也更加清晰;但是多遍也意味着增加读写中间文件的次数,消耗更多的时间。
3.解释程序和一些软件工具
3.1.解释程序
编译程序的问题:如果不把整个程序全部翻译完成之后,这个程序不能开始运行,也不会产生任何结果。
解释程序概述:解释程序接受某个语言的程序并立即运行这个程序。它的工作模式就是一个个的获取、分析并执行源程序语句,一旦一条语句分析阶数,源程序便开始运行并生成结果。解释程序允许执行时修改程序。
编译程序和解释程序的存储组织比较:
- 编译程序的存储组织:在源程序被编译的阶段,存储区中要为源文件和目标代码开辟空间,要存放编译用的各种表格。在目标代码运行阶段,存储区中主要是目标代码和数据,编译所用的信息就都不再需要了。
- 解释程序的存储组织:解释程序一般对源程序的每一个语句逐一进行语法分析,转换为一种内部表示形式,存放在源程序区。由于解释程序允许在执行用户程序时修改程序,这就要求在解释程序工作的整个过程中,源程序、符号表等内容始终存放在存储区中,并且要求存放格式要设计易于使用和修改。
解释程序的缺点:程序的解释是非常慢的,并且解释程序需要更大的空间开销。
3.2.处理源程序的软件工具
- 语言的结构化编辑器:用户可以使用这种编辑器在语言的语法制导下编制出所需的源程序。这一类编辑器不仅具有通常的编辑和修改功能,还会对源程序正文进行逐行分析并完成输入检查、自动提供关键字等任务。
- 语言程序的调试工具:该类工具允许用户一行一行来跟踪程序,查看变量和数据结构的变化。调试的功能越强,实现越复杂,涉及到源程序的语法分析和语义处理技术。
- 程序格式化工具:程序格式化工具分析源程序,并可以将程序以结构清晰可读的形式打印出来。
- 语言程序测试工具:可以分为静态分析器和动态测试器两种。
- 静态分析器:在不运行程序的情况下对源程序进行静态分析,以发现程序中潜在的错误或异常;
- 动态测试器:在源程序分析的基础上,将用于记录和现实程序执行轨迹的语句或函数插入到源程序的适当位置,并用测试用例来记录和显示程序运行时的路径,将运行结果与期望的结果进行比较分析,帮助编程人员找到问题。
- 程序理解工具:对程序进行分析,确定模块间的调用关系,记录程序数据的静态属性和结构属性,并画出控制流程图,帮助用户理解程序。
- 高级语言之间的转换工具:把一种高级语言转换为另一种高级语言的工具。这与实现一个完整的编译程序相比工作量小一些。
4.PL/0语言编译系统
PL/0语言编译系统概述:
- 产生背景和基本组成:PL/0语言编译系统是世界著名计算机科学家N.Wirth编写的,由编译程序和解释程序两部分构成。
- PL/0编译程序:源语言为PL/0,目标语言是一个类P-code的代码。
PL/0语言编译系统组成:PL/0语言编译程序由编译程序和解释程序两部分组成,分别称为PL/0编译程序和类P-code解释程序。当编译程序正常阶数时,PL/0语言编译系统会自动调用解释程序,解释执行生成的目标程序。
PL/0编译程序的书写:可以用C、Pascal或Java等语言书写。
PL/0语言概述:PL/0语言的程序结构很简单,是Pascal的一个子集。
程序语言的语法描述:程序语言的语法描述常常采用一种被称为扩展巴克斯范式(EBNF)的形式。
相关文章:
编译原理笔记(一)引论
文章目录 1.什么是编译程序2.编译过程和编译程序的结构2.1.编译过程概述2.2.编译程序的结构2.3.编译阶段的组合 3.解释程序和一些软件工具3.1.解释程序3.2.处理源程序的软件工具 4.PL/0语言编译系统 学习总结:这一部分是编译原理的绪论部分内容,对编译程…...
C++ 类和对象下 [补充]
文章目录 友元内部类内部类是外部类的天生友元 匿名对象匿名对象的特性 拷贝对象时的一些编译器优化函数返回值临时空间的存储位置返回值临时空间具有常性 标题相同和不同类型 需要 临时空间 友元 友元函数 重载operator<< 输出自定义类型 比如日期类的这个重载ÿ…...
[CTF/网络安全] 攻防世界 PHP2 解题详析
[CTF/网络安全] 攻防世界 PHP2 解题详析 index.php.phps扩展名姿势 翻译:你能给这个网站进行身份验证吗? index.php index.php是一个常见的文件名,通常用于Web服务器中的网站根目录下。它是默认的主页文件名,在访问一个网站时&am…...
图神经网络:(节点分类)在Cora数据集上动手实现图神经网络
文章说明: 1)参考资料:PYG官方文档。超链。 2)博主水平不高,如有错误还望批评指正。 3)我在百度网盘上传了这篇文章的jupyter notebook。超链。提取码8888。 文章目录 代码实操1:GCN的复杂实现代码实操2:GCN的简单实现…...
RabbitMQ应用问题——消息补偿机制以及代码示例
RabbitMQ应用问题——消息补偿机制以及代码示例 RabbitMQ应用问题 消息可靠性的保障 消息补偿机制 详细说明 这里使用了简单的代码进行演示,订单的消费者没有写,在订单的消费同时,发送一条增加积分消息到积分队列。 详细流程途中都有注明…...
量化特征贡献度函数:feature_importances_函数/LGBMClassifier/XGBClassifier
feature_importances_是scikit-learn机器学习库中许多模型对象的属性,在训练模型之后调用该属性可以输出各个特征在模型中的重要性。 示例代码: from sklearn.ensemble import RandomForestRegressor from sklearn.datasets import make_regression# 生…...
总结JVM重要知识点
一.类加载和创建对象的过程 1.类加载 1.编译 : 将源码文件(.java)编译成JVM可以解释的.class文件 . 语法分析>语义分析>注解处理 , 生成class文件 2.加载 : 装载 : 字节码本来存储在硬盘上 , 需要运行时 , 有类加载系统负责将类的信息加载到内存中(方法区) , 使用的是类…...
奇技淫巧第8期
学无止境。 下面是对去年11月至今年5月的零散知识点总结。 春节期间好好放松了一两个月,来校后又懒散的度过了一两个月,直到论文评审意见下来,才开启冲刺模式狂干了一两个月。总的来说,这半年来摸的时间比较多。好,不废…...
这个 归并排序详解过程 我能吹一辈子!!!
文章目录 归并排序概念归并排序算法思路归并排序递归实现归并排序非递归实现 归并排序概念 1945年,约翰冯诺依曼(John von Neumann)发明了归并排序,这是典型的分治算法的应用。 归并排序(Merge sort)是建立…...
docker版jxTMS使用指南:自动生成代码
本文讲解4.0版jxTMS的自动生成代码功能, 整个系列的文章请查看:docker版jxTMS使用指南:4.0版升级内容 docker版本的使用,请参考:docker版jxTMS使用指南 任何一个管理系统都需要对管理对象进行管理,包括最…...
聚观早报 | 小冰启动GPT克隆人计划;ofo创始人在美创业改做咖啡
今日要闻:小冰启动“GPT克隆人计划”;ofo创始人在美创业改做咖啡;OpenAI正准备新的开源AI模型;青年失业率首破20%创新高;微软收购动视暴雪获批 小冰启动“GPT克隆人计划” 5 月 16 日,小冰公司…...
面试造航母,入职拧螺丝,工资离了个大谱...
有粉丝跟我吐槽说:金三银四去面试软件测试岗,真的是面试造航母,入职拧螺丝,工资还低 这种现象很正常,因为找一个测试员,当然希望他能做的业务越多越好,最好像机器猫一样,啥事儿都能…...
Python+selenium自动化元素定位防踩坑
在自动化UI测试过程中常常会在元素定位阶段就踩坑,碰到困扰已久的问题。 以下是个人整理元素定位报错原因和解决方法。 踩坑一:StaleElementReferenceException selenium.common.exceptions.StaleElementReferenceException: Message: stale element re…...
【计算机组成原理】实验一
文章目录 实验一 数据传送实验1. 实验目的2. 实验仪器3. 原理概述4. 实验内容步骤4.1 手动实验环境的建立4.2 手控传送实验 5. 实验结论及问题讨论 实验一 数据传送实验 1. 实验目的 2. 实验仪器 3. 原理概述 4. 实验内容步骤 4.1 手动实验环境的建立 1)初始待令状态 上电或…...
前端022_广告模块_修改功能
广告模块_修改功能 1、需求分析2、Mock添加查询数据3、Mock修改数据4、Api调用回显数据5、提交修改后的数据6、效果1、需求分析 需求分析 当点击 编辑 按钮后,弹出编辑窗口,并查询出分类相关信息进行渲染。修改后点击 确定 提交修改后的数据。 2、Mock添加查询数据 请求URL…...
makefile 学习(3):C++的编译及库文件的生成与链接
1. 介绍 C语言的相关后缀 .a 文件是一个静态库文件.c,.c ,.cp,.cpp,.cc,.cxx 这几种后缀都可以表示c的源文件.h ,.hpp c语言的头文件.i 是c预处理文件.o 目标文件.s汇编语言的文件.so 动态库或者共享库或者称为运行时库 2. C编译 2.1 预处理 g -E helloworld.cpp # 虽…...
Ceph crush运行图
Crush map介绍 ceph集群中由monitor负责维护的运行图包括: Monitor map:监视器运行图osd map:osd运行图PG map:PG运行图Crush map:crush运行图Mds map:mds运行图 crush map是ceph集群物理拓扑的抽象&…...
【分布族谱】泊松分布和二项分布、正态分布的关系
文章目录 泊松分布和二项分布的关系和正态分布的关系 泊松分布 如果在有限时间 ( 0 , 1 ) (0,1) (0,1)内进行 n n n次伯努利实验,那么每次伯努利实验所占用的时间为 1 n \frac{1}{n} n1,按照自然规律,一件事情肯定是时间越长越容易发生&am…...
关于QTreeWidget的setData函数
当使用 Q T r e e W i d g e t I t e m QTreeWidgetItem QTreeWidgetItem 的 s e t D a t a setData setData 方法时,需要传递三个参数,分别是列索引、角色和数据。 列索引:表示要设置数据的列的索引。 Q T r e e W i d g e t I t e m QTre…...
Microsoft Office 2003的安装
哈喽,大家好。今天一起学习的是office2003的安装,这个老版本的office可是XP操作系统的老搭档了,有兴趣的小伙伴也可以来一起试试手。 一、测试演示参数 演示操作系统:Windows XP 不建议win7及以上操作系统使用 系统类型ÿ…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
