编译原理 —— 编译器
文章目录
- 编译原理阶段
- 词法分析器
- 语法分析器
- 语义分析器
- 中间代码生成器
- 代码优化器
- 代码生成器
编译原理阶段
编译器分为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 检测(捕获)异常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 - 力扣(LeetCode) 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums [0,1,4,4,5,6,7] 在变化后可能得到࿱…...
Linux中如何获取输入设备(如触摸屏、按键等)的事件信息
Linux中如何获取输入设备(如触摸屏、按键等)的事件信息 在Linux中,可以使用getevent命令来获取输入设备(如触摸屏、按键等)的事件信息。如果你想在C程序中获取输入设备事件,可以使用以下步骤: …...
Java学习day05:排序,选择、冒泡、快速、二分、杨辉三角
声明:该专栏本人重新过一遍java知识点时候的笔记汇总,主要是每天的知识点题解,算是让自己巩固复习,也希望能给初学的朋友们一点帮助,大佬们不喜勿喷(抱拳了老铁!) Java学习day05:排序࿰…...
Mybatis的mapper.xml批量插入、修改sql
今天要有个功能,要进行一批数据的插入和修改,为了不频繁调用数据库,所以想到了批量插入和修改,因为从毕业后,就没写过批量插入和批量修改,所以在这里记录一下,避免后续再遇到忘记怎么写了 批量…...
Centos7部署单机版MongoDB
目录 Centos7部署单机版MongoDBMongoDB介绍数据模型索引分布式高可用性查询语言驱动和社区用途缺点 下载并解压安装包创建相关文件夹和文件编辑mongod.conf文件启动mongodb创建管理员用户终止MongoDB服务配置自启动服务关闭SELinux编辑自启动服务文件mongodb服务命令 Centos7部…...
Docker实战-第一章欢迎来到Docker世界
Docker基础 什么是Docker docker是包括一个命令行程序、后台守护进程和一组远程服务,它简化了安装、运行、发布和删除软件的工作。docker实现的基础是UNIX的容器技术。所以在docker出世之前已经有容器的概念,而且像谷歌一类公司也在探索自己的容器&…...
初识C语言——详细入门一(系统性学习day4)
目录 前言 一、C语言简单介绍、特点、基本构成 简单介绍: 特点: 基本构成: 二、认识C语言程序 标准格式: 简单C程序: 三、基本构成分类详细介绍 (1)关键字 (2…...
python 学习笔记(6)—— Flask 、MySql
目录 Flask 1、起步 2、渲染项目的首页 3、处理无参数的 GET 请求 4、处理有 query 参数的 GET 请求 6、处理 params 参数的 get 请求 6、处理 application/json 类型请求体的 POST 请求 7、根据参数渲染模板页面 8、上传文件 数据库操作(mysql࿰…...
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,报错“OpenpyxlWriter‘ object has no attribute ‘save‘” data_df pd.DataFrame(Experiment_result) #关键1,将ndarray格式转换为DataFrame writer pd.ExcelWriter(./results/ args.model_num _args.data_name …...
ES6(三)
文章目录 Promise概念作用回调地狱Promise使用对象的状态Promise.allPromise.race Generator 函数概念基本语法异步流程 Class语法类的写法getter与setter静态属性和静态方法继承模块化 Promise 概念 Promise 是异步编程的一种解决方案,比传统的解决方案回调函数,…...
Android 数据库封装(SQLite)
Android 数据库操作(SQLite) Android 数据库操作(SQLite)动态预览使用初始化生成表实体类插入数据批量插入删除数据删除全部修改数据查找(列表)查找(单条)条件查找(列表&…...
Git从入门到起飞(详细)
Git从入门到起飞 Git从入门到起飞什么是Git?使用git前提(注册git)下载Git在Windows上安装Git在macOS上安装Git在Linux上安装Git 配置Git配置全局用户信息配置文本编辑器 创建第一个Git仓库初始化仓库拉取代码添加文件到仓库提交更改推送 Git基本操作查看提交历史比较…...
R读写parquet文件
什么是parquet文件 Apache Parquet是一个开源的,列存储的数据文件格式。 https://parquet.apache.org/ 在R里面,我们可以通过arrow包来读写它。 我们先安装一下arrow包,并加载它。 install.packages("arrow") library(arrow)读写…...
Java21 LTS版本
一、前言 除了众所周知的 JEP 之外,Java 21 还有更多内容。首先请确认 java 版本: $ 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
目录 前言一、卡顿的原因?二、解决1、滚动懒加载2.官方 总结 前言 提示:这里可以添加本文要记录的大概内容: 在element-plus中,如果数据超过1k,就会感觉到明显的卡顿,应该是渲染的卡顿吧。反正我在请求回…...
一对多映射处理
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 怎么办?
问题描述: 原因是;CATALINA_BASE里面没有相关的文件配置。而之前学习IDEA的时候,把这个文件的位置改变了。导致,最后输出IDEA的时候,不会把日志也打印出来。 检查IDEA配置; D:\work_soft\tomcat_user\Tomcat10.0\bin 在此目录下&…...
一人一书一时代:《凰标》是海棠山铁哥的东方文明宣言@凤凰标志
一人执笔,一书立世,一作定时代。 ——《凰标》题记一、破题:当网文只剩“爽点”,谁来承载文明?行业通病《凰标》回应娱乐至死以笔墨思考时代碎片叙事构建完整文明体系功利写作以文载道,以书传文明 二、个人…...
告别STM32cubeIDE的路径红波浪线:VSCode配置C/C++插件的保姆级指南
告别STM32cubeIDE的路径红波浪线:VSCode配置C/C插件的保姆级指南 对于习惯了STM32cubeIDE的嵌入式开发者来说,第一次用VSCode打开工程时,满屏的红色波浪线可能会让人瞬间崩溃。别担心,这不是你的代码有问题,而是VSCode…...
OpenClaw:让 AI 从 “对话” 走向 “实干” 的开源智能体
在人工智能技术快速发展的今天,大语言模型的对话能力已日趋成熟,但 “能说不能做” 的痛点始终制约着 AI 的实际应用价值。2026 年,一款名为 OpenClaw(社区昵称 “小龙虾 AI”)的开源项目迅速走红,它以 “真…...
在vSphere ESXi 7.0上跑MacOS Big Sur?这份保姆级避坑指南帮你一次搞定
在vSphere ESXi 7.0上部署macOS Big Sur的深度避坑指南 虚拟化环境中运行macOS一直是技术爱好者和企业开发者的热门需求。本文将深入探讨在vSphere ESXi 7.0平台上安装macOS Big Sur时可能遇到的各种技术难题及其解决方案,帮助您避开那些让大多数用户头疼的"坑…...
大模型API响应延迟飙升470%,却查不到根因?SITS2026可观测性四象限诊断法,今天就落地
更多请点击: https://intelliparadigm.com 第一章:SITS2026可观测性框架的起源与核心范式 SITS2026(System Intelligence Telemetry Standard 2026)并非凭空诞生,而是源于云原生系统在超大规模微服务编排、边缘-中心协…...
41_《智能体微服务架构企业级实战教程》智能助手主应用服务之创建FastMCP客户端
前言 配套视频教程: 在 Bilibili课堂、CSDN课程、51CTO学堂 同步发售,提供:源码+部署脚本+文档。 bilibili课堂视频教程:智能体微服务架构企业级实战教程_哔哩哔哩_bilibili CSDN课程视频教程:智能体微服务架构企业级实战教程_在线视频教程-CSDN程序员研修院 51CTO学堂…...
告别LSMW!SAP S/4HANA数据迁移新宠:手把手激活Migration Cockpit (LTMC/LTMOM)服务
SAP S/4HANA数据迁移革命:Migration Cockpit全流程实战指南 在SAP生态系统中,数据迁移一直是项目实施过程中最关键的环节之一。传统LSMW工具虽然功能强大,但随着S/4HANA的推出,其局限性日益凸显。本文将带您深入探索SAP官方推荐的…...
Midjourney蓝莓印相技术白皮书(2024V2.3权威修订版):基于1726张A/B测试图谱验证的色阶偏移阈值与CMYK映射规则
更多请点击: https://intelliparadigm.com 第一章:Midjourney Blueberry印相技术的演进脉络与核心定义 Midjourney Blueberry印相技术并非官方术语,而是社区对Midjourney V6中基于蓝光敏感通道(Blue Channel Emulation࿰…...
LeagueAkari英雄联盟自动化工具终极使用指南:本地化智能助手全面解析
LeagueAkari英雄联盟自动化工具终极使用指南:本地化智能助手全面解析 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否曾为英…...
从物理接口到电平标准:串口、COM口、并口、RS232、USB的演进与实战选型
1. 串口通信的起源与基础概念 第一次接触串口是在大学实验室里,那台老旧的示波器需要通过一个9针的接口连接电脑。当时完全不明白为什么这个看起来像梯形的小接口能传输数据,直到后来拆解了一个鼠标才恍然大悟——原来这就是串口通信的雏形。 串口通信本…...
