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

编译原理笔记 2025/4/22

基本概念

汇编语言与高级程序设计语言的关系/汇编干嘛的:高级语言与硬件无关,汇编语言的定义与CPU的指令系统直接相关。只要将高级语言编写的程序等价地转换成特定硬件平台所支持的方式来实现(汇编程序或机器指令序列),那么软件设计师就不必为每种硬件平台重写编写具有相同功能的软件。

编译器:1.狭义的编译器,将高级语言翻译成等价的可执行指令序列(或先翻译成汇编,再翻译成可执行指令序列);2.广义的编译器,只要程序在功能和含义上与原来的程序一致就行,(不管能不能执行。)

解释器:除了编译执行之外,还有解释执行。由于高级语言和底层指令系统差别较大,因此要实现对程序的解释执行,必须在程序解释执行的过程中进行程序的翻译。由于不是被CPU直接执行,解释执行的程序在性能上比编译执行的程序慢。

虚拟机:如java虚拟机,定义了一套标准的指令集合(字节码)。java编译器将java程序翻译成具有相同功能的字节码程序,然后由虚拟机对字节码程序进行解释执行。(字节码和CPU二进制指令接近,解释的就更快。)Java编译器还采用即时编译JIT提高执行效率。

编译技术:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成。

  1. 词法分析:将源代码转换为词法单元序列(词法分析程序又称为扫描程序,对源程序每个字符进行线性读取)
  2. 语法分析:构建(抽象)语法树AST。(成功表明程序符合语法,否则存在某种语法错误)
  3. 语义分析:验证语义规则。(语法分析只给了程序格式正确性的要求,语义则给出了程序含义正确的规定)
  4. 中间代码生成:生成中间表示(获得了程序语义信息理论上就可以将其翻译成汇编代码或二进制机器代码。不过只是理论上这样,实际上要先把程序转换为某种形式的中间表示或中间代码,对其进行性能、存储优化处理,再翻译成可执行代码)(一般采用抽象语法树AST中间表示,AST前面进行语法、语义分析时已经逐步建立和完善了)
  5. 代码优化:优化以提高性能(执行时间与存储空间两方面)
  6. 目标代码生成:输入优化后中间代码,产生汇编代码或目标机器代码的指令序列(具体操作是为每个变量分配具体存储地址,使用实际机器的寄存器,将每个中间代码指令映射到一条或一组等价且高效的机器指令等)

编译器按功能分前端和后端:

  • 前端:词法分析、语法分析、语义分析
  • 后端:代码优化、目标代码生成等
  • 前后端通过中间表示和中间代码进行信息交换

形式语言与自动机理论基础

词法分析

语法分析——自顶向下分析方法

三个重要集合

自顶向下语法分析条件

LL1分析方法

求三个集合例子👇

E → TE'
E' → +TE' | ε
T → FT'
T' → *FT' | ε
F → (E) | i

构造LL(1)分析表👇

分析表构造好后分析👇

判断是否满足LL(1)文法的例子👇

语法分析——自底向上分析方法

简单优先分析

1.简单优先文法及其优先关系

2.矩阵的构造

3.简单优先分析算法

例👇

判断是否是简单优先文法👇

完整例子👇

LR分析法

这里的L表示从左向右扫描输入串,R表示构造一个最右推导的逆过程。

由于LR(k)分析方法对文法的限制很少,因而大多数能用上下文无关文法描述的程序设计语言都可用LR分析法进行有效的分析。

因此,LR分析法是当前最一般的语法分析方法。

LR(0):已知文法,构造状态机和分析表的例子👇

例子👇

语义分析和符号表

中间代码生成

中间代码优化

http://www.xdnf.cn/news/9717.html

相关文章:

  • 容器(如 Docker)中,通常不建议运行多个进程或要求进程必须运行在前台
  • Linux系列-2 Shell常用命令收集
  • fingerprint2浏览器指纹使用记录
  • Spring框架学习day4--Spring集成Mybatis(IOC)
  • Vue 3 的路由管理
  • 小白成长之路-Linux日志管理
  • [MMU]IOMMU的主要职能及详细的验证方案
  • 3 分钟学会使用 Puppeteer 将 HTML 转 PDF
  • Axure设计案例——科技感渐变线性图
  • 不可变集合类型转换异常
  • Astra学习之-如何修改Header-logo和favicon图标
  • Linux | Shell脚本的基础知识
  • 基于ubuntu安装hadoop
  • .NET8入门:14.ASP.NET Core MVC进阶——Model
  • 前端高频面试题1:HTML/CSS/浏览器/计算机网络
  • 安装 Node.js 和配置 cnpm 镜像源
  • Java异常处理的全面指南
  • 基于通义千问的儿童陪伴学习和成长的智能应用架构。
  • Spring AI 之对话记忆(Chat Memory)
  • [网页五子棋][匹配模块]处理开始匹配/停止匹配请求(匹配算法,匹配器的实现)
  • python h5py 读取mat文件的<HDF5 object reference> 问题
  • StarRocks x Iceberg:云原生湖仓分析技术揭秘与最佳实践
  • 【大模型】Bert变种
  • Kubernetes资源申请沾满但是实际的资源占用并不多,是怎么回事?
  • 微深节能 码头装卸船机定位与控制系统 格雷母线
  • WPF 按钮悬停动画效果实现
  • 【五模型时间序列预测对比】Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN
  • 《AI大模型的开源与性能优化:DeepSeek R1的启示》
  • 互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景
  • 深入理解C#中的LINQ:数据查询的终极利器