当前位置: 首页 > news >正文

编译原理笔记(一)引论

文章目录

    • 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<< 输出自定义类型 比如日期类的这个重载&#xff…...

[CTF/网络安全] 攻防世界 PHP2 解题详析

[CTF/网络安全] 攻防世界 PHP2 解题详析 index.php.phps扩展名姿势 翻译&#xff1a;你能给这个网站进行身份验证吗&#xff1f; index.php index.php是一个常见的文件名&#xff0c;通常用于Web服务器中的网站根目录下。它是默认的主页文件名&#xff0c;在访问一个网站时&am…...

图神经网络:(节点分类)在Cora数据集上动手实现图神经网络

文章说明&#xff1a; 1)参考资料&#xff1a;PYG官方文档。超链。 2)博主水平不高&#xff0c;如有错误还望批评指正。 3)我在百度网盘上传了这篇文章的jupyter notebook。超链。提取码8888。 文章目录 代码实操1&#xff1a;GCN的复杂实现代码实操2&#xff1a;GCN的简单实现…...

RabbitMQ应用问题——消息补偿机制以及代码示例

RabbitMQ应用问题——消息补偿机制以及代码示例 RabbitMQ应用问题 消息可靠性的保障 消息补偿机制 详细说明 这里使用了简单的代码进行演示&#xff0c;订单的消费者没有写&#xff0c;在订单的消费同时&#xff0c;发送一条增加积分消息到积分队列。 详细流程途中都有注明…...

量化特征贡献度函数:feature_importances_函数/LGBMClassifier/XGBClassifier

feature_importances_是scikit-learn机器学习库中许多模型对象的属性&#xff0c;在训练模型之后调用该属性可以输出各个特征在模型中的重要性。 示例代码&#xff1a; from sklearn.ensemble import RandomForestRegressor from sklearn.datasets import make_regression# 生…...

总结JVM重要知识点

一.类加载和创建对象的过程 1.类加载 1.编译 : 将源码文件(.java)编译成JVM可以解释的.class文件 . 语法分析>语义分析>注解处理 , 生成class文件 2.加载 : 装载 : 字节码本来存储在硬盘上 , 需要运行时 , 有类加载系统负责将类的信息加载到内存中(方法区) , 使用的是类…...

奇技淫巧第8期

学无止境。 下面是对去年11月至今年5月的零散知识点总结。 春节期间好好放松了一两个月&#xff0c;来校后又懒散的度过了一两个月&#xff0c;直到论文评审意见下来&#xff0c;才开启冲刺模式狂干了一两个月。总的来说&#xff0c;这半年来摸的时间比较多。好&#xff0c;不废…...

这个 归并排序详解过程 我能吹一辈子!!!

文章目录 归并排序概念归并排序算法思路归并排序递归实现归并排序非递归实现 归并排序概念 1945年&#xff0c;约翰冯诺依曼&#xff08;John von Neumann&#xff09;发明了归并排序&#xff0c;这是典型的分治算法的应用。 归并排序&#xff08;Merge sort&#xff09;是建立…...

docker版jxTMS使用指南:自动生成代码

本文讲解4.0版jxTMS的自动生成代码功能&#xff0c; 整个系列的文章请查看&#xff1a;docker版jxTMS使用指南&#xff1a;4.0版升级内容 docker版本的使用&#xff0c;请参考&#xff1a;docker版jxTMS使用指南 任何一个管理系统都需要对管理对象进行管理&#xff0c;包括最…...

聚观早报 | 小冰启动GPT克隆人计划;ofo创始人在美创业改做咖啡

今日要闻&#xff1a;小冰启动“GPT克隆人计划”&#xff1b;ofo创始人在美创业改做咖啡&#xff1b;OpenAI正准备新的开源AI模型&#xff1b;青年失业率首破20&#xff05;创新高&#xff1b;微软收购动视暴雪获批 小冰启动“GPT克隆人计划” 5 月 16 日&#xff0c;小冰公司…...

面试造航母,入职拧螺丝,工资离了个大谱...

有粉丝跟我吐槽说&#xff1a;金三银四去面试软件测试岗&#xff0c;真的是面试造航母&#xff0c;入职拧螺丝&#xff0c;工资还低 这种现象很正常&#xff0c;因为找一个测试员&#xff0c;当然希望他能做的业务越多越好&#xff0c;最好像机器猫一样&#xff0c;啥事儿都能…...

Python+selenium自动化元素定位防踩坑

在自动化UI测试过程中常常会在元素定位阶段就踩坑&#xff0c;碰到困扰已久的问题。 以下是个人整理元素定位报错原因和解决方法。 踩坑一&#xff1a;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负责维护的运行图包括&#xff1a; Monitor map&#xff1a;监视器运行图osd map&#xff1a;osd运行图PG map&#xff1a;PG运行图Crush map&#xff1a;crush运行图Mds map&#xff1a;mds运行图 crush map是ceph集群物理拓扑的抽象&…...

【分布族谱】泊松分布和二项分布、正态分布的关系

文章目录 泊松分布和二项分布的关系和正态分布的关系 泊松分布 如果在有限时间 ( 0 , 1 ) (0,1) (0,1)内进行 n n n次伯努利实验&#xff0c;那么每次伯努利实验所占用的时间为 1 n \frac{1}{n} n1​&#xff0c;按照自然规律&#xff0c;一件事情肯定是时间越长越容易发生&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 方法时&#xff0c;需要传递三个参数&#xff0c;分别是列索引、角色和数据。 列索引&#xff1a;表示要设置数据的列的索引。 Q T r e e W i d g e t I t e m QTre…...

Microsoft Office 2003的安装

哈喽&#xff0c;大家好。今天一起学习的是office2003的安装&#xff0c;这个老版本的office可是XP操作系统的老搭档了&#xff0c;有兴趣的小伙伴也可以来一起试试手。 一、测试演示参数 演示操作系统&#xff1a;Windows XP 不建议win7及以上操作系统使用 系统类型&#xff…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...

如何配置一个sql server使得其它用户可以通过excel odbc获取数据

要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据&#xff0c;你需要完成以下配置步骤&#xff1a; ✅ 一、在 SQL Server 端配置&#xff08;服务器设置&#xff09; 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到&#xff1a;SQL Server 网络配…...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...

[USACO23FEB] Bakery S

题目描述 Bessie 开了一家面包店! 在她的面包店里&#xff0c;Bessie 有一个烤箱&#xff0c;可以在 t C t_C tC​ 的时间内生产一块饼干或在 t M t_M tM​ 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC​,tM​≤109)。由于空间…...