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

编译原理 —— 编译器

文章目录

    • 编译原理阶段
      • 词法分析器
      • 语法分析器
      • 语义分析器
      • 中间代码生成器
      • 代码优化器
      • 代码生成器

编译原理阶段

编译器分为9个阶段来将我们所编写的高级代码编译为计算机可执行的机器码

  1. 源程序
  2. 词法分析器
  3. 语法分析器
  4. 语义分析器
  5. 中间代码生成器
  6. 独立于机器的代码优化器
  7. 代码生成器
  8. 依赖于机器的代码优化器
  9. 目标机器代码

每一个阶段都对应着他相关的功能,最终将高级代码编译为计算机可识别的机器码
编译器与解释器有着一些量的区别,而引起质的变化:
解释器是不会生成目标代码,而是直接执行源程序所指定的运算、也就是说,它会直接执行三地址中间代码(后续会说的)

在92年之前的BASIC年代的解释器就是将高级语言程序翻译为一种中间语言程序、然后对中间语言程序进行解释执行,那时编译和解释在一个程序中、该程序被称为解释器

而在 92 年之后的Java年代中,编译器与解释的功能被分在两个程序中:
前一个被称为编译器,他会把源程序翻译为一种叫做字节码的中间语言程序
后一个被称为解释器,他对字节码程序进行解释执行

词法分析器

首先我们看一下这样一行代码

position = initial + rate * 60

这是一段将后面的表达式的值给到左边变量的赋值操作,这些变量都会在符号表中有对应的标记,比如 position 对应的是 1, initial 对应的是 2,rate 对应的是3

那么词法分析器就会将其转译为记号流

<id,1> <=> <id,2> <+> <id,3> <*> <60>

现在我们获得到了一个记号流,我们将继续会对记号流进行下一步的操作

语法分析器

接着我们使用语法分析器对刚才得到的记号流转译为语法树

在这里插入图片描述

现在我们获得到了一个语法树,我们将继续会对语法树进行下一步的操作

语义分析器

语义分析器将会对刚才得到的语法树进行一个类型检验转换

在这里插入图片描述

中间代码生成器

接下来我们会使用中间代码生成器将语法树进行一个改造,改造为三地址中间代码

三地址中间代码指的是最多三组表达式的代码块

t1 = inttofloat(60)
t2 = id3 * t1
t3 = id2 + t2
id1 = t3

代码优化器

接下来我们将会使用代码优化器对三地址中间代码进行代码优化
因为上面的 t3 没有进行运算,在最后一步直接赋值给 id1 ,所以我们省略此步即达到了优化的目的

t1 = id3 * 60
id1 = id2 + t1

代码生成器

我们接着将优化完成的三地址中间代码使用代码生成器转换为汇编代码
😪写汇编语言。。。我感觉我像在写SQL语句🥲

MOVF id3,R2    //将id3的值转移到R2计算器中
MULF #60.0,R2    // 将计算器与60进行相乘
MOVF id2,R1     // 将id2的值转移到R1计算器中
ADDF R2,R1     // 将计算器R1与R2进行相加
MOVF R1,id1    // 将 R1 的值移动到了id1中

相关文章:

编译原理 —— 编译器

文章目录 编译原理阶段词法分析器语法分析器语义分析器中间代码生成器代码优化器代码生成器 编译原理阶段 编译器分为9个阶段来将我们所编写的高级代码编译为计算机可执行的机器码 源程序词法分析器语法分析器语义分析器中间代码生成器独立于机器的代码优化器代码生成器依赖于…...

Python灰帽编程——错误异常处理与面向对象

文章目录 错误异常处理与面向对象1. 错误和异常1.1 基本概念1.1.1 Python 异常 1.2 检测&#xff08;捕获&#xff09;异常1.2.1 try except 语句1.2.2 捕获多种异常1.2.3 捕获所有异常 1.3 处理异常1.4 特殊场景1.4.1 with 语句 1.5 脚本完善 2. 内网主机存活检测程序2.1 scap…...

【每日一题】154. 寻找旋转排序数组中的最小值 II

154. 寻找旋转排序数组中的最小值 II - 力扣&#xff08;LeetCode&#xff09; 已知一个长度为 n 的数组&#xff0c;预先按照升序排列&#xff0c;经由 1 到 n 次 旋转 后&#xff0c;得到输入数组。例如&#xff0c;原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到&#xff1…...

Linux中如何获取输入设备(如触摸屏、按键等)的事件信息

Linux中如何获取输入设备&#xff08;如触摸屏、按键等&#xff09;的事件信息 在Linux中&#xff0c;可以使用getevent命令来获取输入设备&#xff08;如触摸屏、按键等&#xff09;的事件信息。如果你想在C程序中获取输入设备事件&#xff0c;可以使用以下步骤&#xff1a; …...

Java学习day05:排序,选择、冒泡、快速、二分、杨辉三角

声明&#xff1a;该专栏本人重新过一遍java知识点时候的笔记汇总&#xff0c;主要是每天的知识点题解&#xff0c;算是让自己巩固复习&#xff0c;也希望能给初学的朋友们一点帮助&#xff0c;大佬们不喜勿喷(抱拳了老铁&#xff01;) Java学习day05&#xff1a;排序&#xff0…...

Mybatis的mapper.xml批量插入、修改sql

今天要有个功能&#xff0c;要进行一批数据的插入和修改&#xff0c;为了不频繁调用数据库&#xff0c;所以想到了批量插入和修改&#xff0c;因为从毕业后&#xff0c;就没写过批量插入和批量修改&#xff0c;所以在这里记录一下&#xff0c;避免后续再遇到忘记怎么写了 批量…...

Centos7部署单机版MongoDB

目录 Centos7部署单机版MongoDBMongoDB介绍数据模型索引分布式高可用性查询语言驱动和社区用途缺点 下载并解压安装包创建相关文件夹和文件编辑mongod.conf文件启动mongodb创建管理员用户终止MongoDB服务配置自启动服务关闭SELinux编辑自启动服务文件mongodb服务命令 Centos7部…...

Docker实战-第一章欢迎来到Docker世界

Docker基础 什么是Docker docker是包括一个命令行程序、后台守护进程和一组远程服务&#xff0c;它简化了安装、运行、发布和删除软件的工作。docker实现的基础是UNIX的容器技术。所以在docker出世之前已经有容器的概念&#xff0c;而且像谷歌一类公司也在探索自己的容器&…...

初识C语言——详细入门一(系统性学习day4)

目录 前言 一、C语言简单介绍、特点、基本构成 简单介绍&#xff1a; 特点&#xff1a; 基本构成&#xff1a; 二、认识C语言程序 标准格式&#xff1a; 简单C程序&#xff1a; 三、基本构成分类详细介绍 &#xff08;1&#xff09;关键字 &#xff08;2&#xf…...

python 学习笔记(6)—— Flask 、MySql

目录 Flask 1、起步 2、渲染项目的首页 3、处理无参数的 GET 请求 4、处理有 query 参数的 GET 请求 6、处理 params 参数的 get 请求 6、处理 application/json 类型请求体的 POST 请求 7、根据参数渲染模板页面 8、上传文件 数据库操作&#xff08;mysql&#xff0…...

Deepin下vsftp服务安装配置虚拟用户

1. 系统环境 Deepin20.9 2. 在线安装 # apt install -y vsftp //安装ftp服务软件 # apt install -y db-util //安装虚拟用户密码库处理软件 3. 离线安装 3.1 下载依赖包 # apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --n…...

OpenpyxlWriter‘ object has no attribute ‘save‘

问题 将实验结果保存为EXCEL&#xff0c;报错“OpenpyxlWriter‘ object has no attribute ‘save‘” data_df pd.DataFrame(Experiment_result) #关键1&#xff0c;将ndarray格式转换为DataFrame writer pd.ExcelWriter(./results/ args.model_num _args.data_name …...

ES6(三)

文章目录 Promise概念作用回调地狱Promise使用对象的状态Promise.allPromise.race Generator 函数概念基本语法异步流程 Class语法类的写法getter与setter静态属性和静态方法继承模块化 Promise 概念 Promise 是异步编程的一种解决方案&#xff0c;比传统的解决方案回调函数,…...

Android 数据库封装(SQLite)

Android 数据库操作&#xff08;SQLite&#xff09; Android 数据库操作&#xff08;SQLite&#xff09;动态预览使用初始化生成表实体类插入数据批量插入删除数据删除全部修改数据查找&#xff08;列表&#xff09;查找&#xff08;单条&#xff09;条件查找&#xff08;列表&…...

Git从入门到起飞(详细)

Git从入门到起飞 Git从入门到起飞什么是Git&#xff1f;使用git前提(注册git)下载Git在Windows上安装Git在macOS上安装Git在Linux上安装Git 配置Git配置全局用户信息配置文本编辑器 创建第一个Git仓库初始化仓库拉取代码添加文件到仓库提交更改推送 Git基本操作查看提交历史比较…...

R读写parquet文件

什么是parquet文件 Apache Parquet是一个开源的&#xff0c;列存储的数据文件格式。 https://parquet.apache.org/ 在R里面&#xff0c;我们可以通过arrow包来读写它。 我们先安装一下arrow包&#xff0c;并加载它。 install.packages("arrow") library(arrow)读写…...

Java21 LTS版本

一、前言 除了众所周知的 JEP 之外&#xff0c;Java 21 还有更多内容。首先请确认 java 版本&#xff1a; $ java -version openjdk version "21" 2023-09-19 OpenJDK Runtime Environment (build 2135-2513) OpenJDK 64-Bit Server VM (build 2135-2513, mixed mo…...

【性能优化】虚拟懒加载(下拉滚动加载长列表)element-puls+el-table

目录 前言一、卡顿的原因&#xff1f;二、解决1、滚动懒加载2.官方 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 在element-plus中&#xff0c;如果数据超过1k&#xff0c;就会感觉到明显的卡顿&#xff0c;应该是渲染的卡顿吧。反正我在请求回…...

一对多映射处理

8.3.1 、collection /** * 根据部门id查新部门以及部门中的员工信息 * param did * return */ Dept getDeptEmpByDid(Param("did") int did);<resultMap id"deptEmpMap" type"Dept"> <id property"did" column"did&quo…...

关于IDEA没有显示日志输出?IDEA控制台没有显示Tomcat Localhost Log和Catalina Log 怎么办?

问题描述&#xff1a; 原因是;CATALINA_BASE里面没有相关的文件配置。而之前学习IDEA的时候&#xff0c;把这个文件的位置改变了。导致&#xff0c;最后输出IDEA的时候&#xff0c;不会把日志也打印出来。 检查IDEA配置; D:\work_soft\tomcat_user\Tomcat10.0\bin 在此目录下&…...

蛇形填数 rust解法

蛇形填数。 在nn方阵里填入1&#xff0c;2&#xff0c;…&#xff0c;nn&#xff0c;要求填成蛇形。例如&#xff0c;n&#xff1d;4时方阵为&#xff1a; 10 11 12 1 9 16 13 2 8 15 14 3 7 6 5 4 解法如下&#xff1a; use std::io;fn main() {let mut buf String::new();…...

一文探索SD-WAN技术进阶后与MPLS的区别

在网络通信领域&#xff0c;随着云计算和大数据等新兴技术的快速发展&#xff0c;企业对于网络的可靠性、安全性以及带宽的需求越来越高。 SD-WAN&#xff08;软件定义广域网&#xff09;和MPLS&#xff08;多协议标签交换&#xff09;是两种不同的网络连接技术&#xff0c;它们…...

RocketMq(四)消息分类

一、普通消息 1、同步发送消息&#xff1a;指的是Producer发出⼀条消息后&#xff0c;会在收到MQ返回的ACK之后才发下⼀条消息。该方式的消息可靠性最高&#xff0c;但消息发送效率低。 二、顺序消息 三、延时消息...

ip地址怎么改网速快

在当今高度依赖互联网的时代&#xff0c;快速稳定的网络连接对于人们的生活和工作至关重要。然而&#xff0c;有时我们可能会遇到网络速度缓慢的问题。虽然更改IP地址并不能直接影响网络速度&#xff0c;但它可以成为改善网络连接的一种策略之一。虎观代理小二二将探讨如何通过…...

植物大战僵尸各种僵尸攻略(四)

前言 此文章为“植物大战僵尸”专栏中的011刊&#xff08;2023年9月第十刊&#xff09;&#xff0c;欢迎订阅。版权所有。 注意&#xff1a; 1.本博客适用于pvz无名版&#xff1b; 2.pvz指植物大战僵尸&#xff08;Plants VS Zonbies)&#xff1b; 3.本文以耗费低做标准&am…...

main函数中两个参数的作用

一般我们在使用C语言时不太用到main函数自带的参数&#xff0c;因此最常见的main函数就像下面这样。 int main() {...... }上面这种main函数是省略了其形参的&#xff0c;C语言中规定main函数的参数只能有两个&#xff0c;习惯上这两个参数写为argc和argv&#xff0c;其中&…...

华为OD机试 - 连续字母长度 - 字符串(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明4、再输入5、输出6、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08…...

想要精通算法和SQL的成长之路 - 填充书架

想要精通算法和SQL的成长之路 - 填充书架 前言一. 填充书架1.1 优化 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 填充书架 原题链接 题目中有一个值得注意的点就是&#xff1a; 需要按照书本顺序摆放。每一层当中&#xff0c;只要厚度不够了&#xff0c;当前层最高…...

【ROS入门】ROS的核心概念

文章结构 通信机制节点(Node)——执行单元节点管理器(ROS Master)——控制中心话题通信——异步通信机制话题(Topic)消息(Message)——话题数据 服务通信——同步通信机制服务(Service) 话题和服务的区别参数(Parameter)——全局共享字典 文件系统功能包&#xff08;Package&am…...

Python爬虫从端到端抓取网页

网页抓取和 REST API 简介 网页抓取是使用计算机程序以自动方式从网站提取和解析数据的过程。这是创建用于研究和学习的数据集的有用技术。虽然网页抓取通常涉及解析和处理 HTML 文档&#xff0c;但某些平台还提供 REST API 来以机器可读格式&#xff08;如 JSON&#xff09;检…...

建设小游戏网站空间类型选择/关键词搜索排名公司

写在最前 文章标题谈到了面向协议编程(下文简称 POP)&#xff0c;是因为前几天阅读了一篇讲 Swift 中 POP 的文章。本文会以此为出发点&#xff0c;聊聊相关的概念&#xff0c;比如接口、mixin、组合模式、多继承等&#xff0c;同时也会借助各种语言中的例子来阐述我的思想。 那…...

自己做的网站可以挂在哪里/搜索引擎技术包括哪些

以前买英语书&#xff0c;最喜欢的就是《xx英语高频词汇手册》之类&#xff0c;仿佛只需要背过这些词&#xff0c;考试就没问题了。 基于相同的理念&#xff0c;我也写一个机器学习领域的"高频功能手册"吧。 作为一枚机器学习的新手&#xff0c;我在这两年中看了不少…...

个人做短视频网站/深圳全网推广托管

yum服务器lvm扩容&#xff0c;data目录是yum存放rpm包的目录&#xff0c;只有20G&#xff0c;需要添加磁盘扩容到80G# df -lhFilesystem Size Used Avail Use% Mounted on/dev/mapper/vg_node5-root 20G 479M 18G 3% /tmpfs 935M…...

重庆做公司网站/有哪些网络营销公司

嗜欲深者天机浅&#xff0c;嗜欲浅者天机深 易经基础知识 一、易经的创作过程 三个阶段&#xff1a;阴阳概率的产生、八卦创立、重卦并撰成卦爻辞。&#xff08;一&#xff09;一阴一阳之谓道&#xff08;阴阳&#xff09; 太极生两仪&#xff0c;两仪就是阴阳。人世间的一切事…...

做一个信息发布网站要多少钱/今日新闻头条内容

为什么80%的码农都做不了架构师&#xff1f;>>> 解决办法&#xff1a;在IntelliJ的偏好&#xff0c;plugins里搜到IntelliJ Vim并取消勾选&#xff0c;保存后重启即可 转载于:https://my.oschina.net/dccjll/blog/1543612...

重庆 新闻发布会/网站推广seo方法

Keras是一个高级神经网络的API&#xff0c;用python编写&#xff0c;能够在TensorFlow、CNTK或Theano上运行。Keras is a high-level neural networks API, written in Python and capable of running on top of TensorFlow, CNTK, or Theano. 它的开发重点是实现快速实验。It …...