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

解释器模式:自定义语言解析与执行的设计模式

解释器模式:自定义语言解析与执行的设计模式

一、模式核心:定义语言文法并实现解释器处理句子

在软件开发中,当需要处理特定领域的语言(如数学表达式、正则表达式、自定义配置语言)时,可以通过解释器模式定义语言的文法规则,并实现一个解释器来解析和执行该语言的句子。

解释器模式(Interpreter Pattern) 通过将语言的文法规则分解为终结符表达式和非终结符表达式,利用递归调用的方式解析句子。核心解决:

  • 自定义语言解析:无需借助第三方解析工具(如 ANTLR),直接实现简单语言的解释器。
  • 文法扩展灵活:新增文法规则时,只需扩展表达式类,符合开闭原则。
  • 语法树构建:将语言句子转换为抽象语法树(AST),便于可视化和优化。

核心思想与 UML 类图

解释器模式包含以下角色:

  1. 抽象表达式(Expression):定义解释器的公共接口(如 interpret())。
  2. 终结符表达式(Terminal Expression):对应文法中的终结符(如表达式中的变量、常量),实现具体解释逻辑。
  3. 非终结符表达式(Non-terminal Expression):对应文法中的非终结符(如运算符),组合其他表达式进行解释。
  4. 上下文(Context):包含解释器所需的全局信息(如变量映射表)。
  5. 客户端(Client):构建抽象语法树并触发解释过程。

PlantUML Diagram

二、核心实现:简单数学表达式解释器

场景:解析形如 X + Y * 2 的表达式(简化文法,不考虑优先级)

1. 定义抽象表达式接口

public interface Expression {  int interpret(Context context); // 解释表达式,返回结果  
}  

2. 实现终结符表达式(变量或常量)

变量表达式(如 X、Y)
import java.util.Map;  
import java.util.HashMap;  public class VariableExpression implements Expression {  private String name;  public VariableExpression(String name) {  this.name = name;  }  @Override  public int interpret(Context context) {  return context.getVariable(name); // 从上下文中获取变量值  }  
}  
常量表达式(如 2、3)
public class ConstantExpression implements Expression {  private int value;  public ConstantExpression(int value) {  this.value = value;  }  @Override  public int interpret(Context context) {  return value; // 直接返回常量值  }  
}  

3. 实现非终结符表达式(运算符)

加法表达式
public class AddExpression implements Expression {  private Expression left;  private Expression right;  public AddExpression(Expression left, Expression right) {  this.left = left;  this.right = right;  }  @Override  public int interpret(Context context) {  return left.interpret(context) + right.interpret(context); // 递归解释左右表达式  }  
}  
乘法表达式
public class MultiplyExpression implements Expression {  private Expression left;  private Expression right;  public MultiplyExpression(Expression left, Expression right) {  this.left = left;  this.right = right;  }  @Override  public int interpret(Context context) {  return left.interpret(context) * right.interpret(context); // 递归解释左右表达式  }  
}  

4. 定义上下文(管理变量值)

import java.util.HashMap;  
import java.util.Map;  public class Context {  private Map<String, Integer> variables = new HashMap<>();  public void setVariable(String name, int value) {  variables.put(name, value);  }  public int getVariable(String name) {  return variables.getOrDefault(name, 0);  }  
}  

5. 客户端构建语法树并解释表达式

public class ClientDemo {  public static void main(String[] args) {  // 定义表达式:X + Y * 2  // 语法树结构:Add(X, Multiply(Y, 2))  Expression X = new VariableExpression("X");  Expression Y = new VariableExpression("Y");  Expression constant2 = new ConstantExpression(2);  Expression multiply = new MultiplyExpression(Y, constant2);  Expression expression = new AddExpression(X, multiply);  // 设置变量值:X=3,Y=4  Context context = new Context();  context.setVariable("X", 3);  context.setVariable("Y", 4);  // 解释表达式  int result = expression.interpret(context);  System.out.println("表达式结果:" + result); // 输出:3 + 4*2 = 11  }  
}  

输出结果

表达式结果:11  

三、进阶:处理复杂文法与优先级

问题:上述示例未处理运算符优先级(如乘法应先于加法计算)

解决方案:引入优先级规则,构建带优先级的语法树

1. 定义文法规则(BNF 表示)
expression = term + term | term  
term = factor * factor | factor  
factor = variable | constant  
variable = [A-Za-z]+  
constant = [0-9]+  
2. 实现带优先级的表达式解析(递归下降解析器)
import java.util.Stack;  public class Parser {  private final String[] tokens;  private int index = 0;  public Parser(String expressionStr) {  tokens = expressionStr.split(" "); // 假设表达式用空格分隔,如 "X + Y * 2"  }  // 解析顶级表达式(处理加法)  public Expression parseExpression() {  Expression expr = parseTerm();  while (index < tokens.length && tokens[index].equals("+")) {  index++;  expr = new AddExpression(expr, parseTerm());  }  return expr;  }  // 解析项(处理乘法)  private Expression parseTerm() {  Expression term = parseFactor();  while (index < tokens.length && tokens[index].equals("*")) {  index++;  term = new MultiplyExpression(term, parseFactor());  }  return term;  }  // 解析因子(变量或常量)  private Expression parseFactor() {  String token = tokens[index++];  if (token.matches("\\d+")) {  return new ConstantExpression(Integer.parseInt(token));  } else {  return new VariableExpression(token);  }  }  
}  

3. 客户端使用解析器构建语法树

public class ClientDemo {  public static void main(String[] args) {  String expressionStr = "X + Y * 2";  Parser parser = new Parser(expressionStr);  Expression expression = parser.parseExpression();  Context context = new Context();  context.setVariable("X", 3);  context.setVariable("Y", 4);  int result = expression.interpret(context);  System.out.println("带优先级表达式结果:" + result); // 输出:11  }  
}  

四、框架与源码中的解释器实践

1. 正则表达式引擎

正则表达式引擎(如 Java 的 Pattern 类)使用解释器模式解析正则表达式字符串(如 \\d+),构建状态机并匹配输入文本。

2. SQL 解析器

部分轻量级数据库(如 SQLite)的 SQL 解析模块通过解释器模式将 SQL 语句转换为执行计划,虽然现代数据库更多使用编译型方案,但解释器模式是基础实现思路之一。

3. 模板引擎(如 Velocity、Freemarker)

模板引擎解析模板字符串(如 ${name}),将变量替换和逻辑判断(如 ifforeach)转换为可执行的字节码或直接解释执行,本质上是解释器模式的应用。

五、避坑指南:正确使用解释器模式的 3 个要点

1. 避免处理复杂文法

解释器模式适用于简单文法(如四则运算、简单规则表达式),对于复杂文法(如完整的编程语言),应使用专业的解析工具(如 ANTLR、LLVM),避免解释器过于臃肿。

2. 性能优化

解释器的递归调用和语法树遍历可能导致性能瓶颈,对于高频执行的表达式,可通过以下方式优化:

  • 缓存解释结果:对相同表达式缓存解释后的结果。
  • 编译为字节码:将表达式编译为可执行字节码(如 Java 的 ClassLoader)。

3. 错误处理

解释器需完善语法错误处理(如非法字符、括号不匹配),避免解析时抛出未检查异常。可通过自定义异常类(如 ParseException)捕获错误并提示用户。

六、总结:何时该用解释器模式?

适用场景核心特征典型案例
简单领域语言语言文法简单,无需高性能解析配置文件解析(如自定义 .cfg 文件)
教学或演示用途需要直观展示语言解析过程编译器原理教学、脚本语言入门示例
快速原型开发无需引入复杂解析工具,快速实现功能小游戏中的自定义指令系统(如 move up 10

解释器模式通过将语言解析逻辑分解为表达式层次结构,提供了一种灵活的自定义语言实现方式。至此,23 种设计模式已全部讲解完毕!如果需要回顾某一模式或深入探讨具体应用,可以随时告诉我!

扩展思考:解释器模式的缺点

  • 效率低下:解释执行速度通常低于编译执行,不适合高性能要求的场景。
  • 维护成本高:复杂文法会导致表达式类数量激增,维护难度加大。

相关文章:

解释器模式:自定义语言解析与执行的设计模式

解释器模式&#xff1a;自定义语言解析与执行的设计模式 一、模式核心&#xff1a;定义语言文法并实现解释器处理句子 在软件开发中&#xff0c;当需要处理特定领域的语言&#xff08;如数学表达式、正则表达式、自定义配置语言&#xff09;时&#xff0c;可以通过解释器模式…...

第十二章 Python语言-大数据分析PySpark(终)

目录 一. PySpark前言介绍 二.基础准备 三.数据输入 四.数据计算 1.数据计算-map方法 2.数据计算-flatMap算子 3.数据计算-reduceByKey方法 4.数据计算-filter方法 5.数据计算-distinct方法 6.数据计算-sortBy方法 五.数据输出 1.输出Python对象 &#xff08;1&am…...

Oracle数据库巡检脚本

1.查询实例信息 SELECT INST_ID, INSTANCE_NAME, TO_CHAR(STARTUP_TIME, YYYY-MM-DD HH24:MI:SS) AS STARTUP_TIME FROM GV$INSTANCE ORDER BY INST_ID; 2.查看是否归档 archive log list 3.查看数据库参数 SELECT NAME , TYPE , VALUE FROM V$PARAMETER ORDER BY NAME; 4.…...

示例:Spring JDBC编程式事务

以下是一个完整的 Spring JDBC 编程式事务示例&#xff0c;包含批量插入、事务管理、XML 配置和单元测试&#xff1a; 1. 项目依赖&#xff08;pom.xml&#xff09; <dependencies><!-- Spring JDBC --><dependency><groupId>org.springframework<…...

Happens-Before 原则

Happens-Before 规则 Happens-Before是JMM的核心概念之一&#xff0c;是一种可见性模型&#xff0c;保障多线程环境下前一个操作的结果相对于后续操作是可见的。 程序顺序性&#xff0c;同一线程中前面代码的操作happens-before后续的任意操作。volatile变量规则&#xff0c;…...

怎样通过互联网访问内网 SVN (版本管理工具)提交代码更新?

你有没有遇到过这种情况&#xff1a;在公司或者家里搭了个 SVN 服务器&#xff08;用来存代码的&#xff09;&#xff0c;但出门在外想提交代码时&#xff0c;发现连不上&#xff1f; 这是因为 SVN 通常跑在内网&#xff0c;外网直接访问不了。 这时候就需要 “内网穿透” ——…...

Verilog 语法 (一)

Verilog 是硬件描述语言&#xff0c;在编译下载到 FPGA 之后&#xff0c; FPGA 会生成电路&#xff0c;所以 Verilog 全部是并行处理与运行的&#xff1b;C 语言是软件语言&#xff0c;编译下载到单片机 /CPU 之后&#xff0c;还是软件指令&#xff0c;而不会根据你的代…...

针对 Spring Boot 应用中常见的查询场景 (例如:分页查询、关联查询、聚合查询) 如何进行 SQL 优化?

通用优化原则&#xff08;适用于所有场景&#xff09;&#xff1a; 索引是基础: 确保 WHERE、JOIN、ORDER BY、GROUP BY 涉及的关键列都有合适的索引&#xff08;单列或联合索引&#xff09;。避免 SELECT *: 只查询业务需要的列&#xff0c;减少数据传输量和内存消耗。覆盖索…...

shadcn/radix-ui的tooltip高度定制arrow位置

尝试了半天&#xff0c;后来发现&#xff0c;不支持。。。。。就是不支持 那箭头只能居中 改side和align都没用&#xff0c;下面有在线实例 https://codesandbox.io/p/sandbox/radix-ui-slider-forked-zgn7hj?file%2Fsrc%2FApp.tsx%3A69%2C21 但是呢&#xff0c; 第一如果…...

ROS-真机向虚拟机器人映射

问题描述 ROS里的虚拟机械臂可以实现和真实机械臂的位置同步&#xff0c;真实机械臂如何动&#xff0c;ROS里的虚拟机械臂就如何动 效果 步骤 确保库卡机械臂端安装有EthernetKRL辅助软件和KUKAVARPROXY 6.1.101&#xff08;它是一个 TCP/IP 服务器 &#xff0c;可通过网络实…...

ap无法上线问题定位(交换机发包没有剥掉pvid tag)

一中学&#xff0c;新开的40台appoe交换机核心交换机旁挂ac出口路由的组网&#xff0c;反馈ap无法上线&#xff0c;让协助解决。 组网如下&#xff1a; 排查过程&#xff1a; 检查ac的配置&#xff0c;没有发现问题 发现配置没有问题&#xff0c;vlan1000配置子接口&#xff…...

Linux基础

03.Linux基础 了解VMware备份的两种方式 了解Linux系统文件系统 掌握Linux基础命令 备份操作系统 为什么要备份系统&#xff1f; 数据安全&#xff1a;防止因硬件故障、软件错误等原因导致的数据丢失。 系统恢复&#xff1a;快速恢复系统至正常状态&#xff0c;减少停机时…...

python函数与模块

目录 一&#xff1a;函数 1.无参函数 2.带参数函数 2.函数中变量中的作用域 4.内建函数 二&#xff1a;模块与包 1.模块 &#xff08;1&#xff09;模块定义 &#xff08;2&#xff09;模块导入 2.包 &#xff08;1&#xff09;包的使用 &#xff08;2&#xff09;_…...

线上助农产品商城小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的线上助农产品商城小程序源码&#xff0c;旨在为农产品销售搭建一个高效、便捷的线上平台&#xff0c;助力乡村振兴。 一、技术架构 该小程序源码采用了ThinkPHP作为后端框架&#xff0c;FastAdmin作为快速开发框架&#xff0c;UniApp作为跨…...

个人博客后台管理开发日志

技术栈&#xff1a;Vue3 Ts node.js mySQL pinia axios 3月14日 一、数据表梳理 用户&#xff08;user&#xff09; ID名字邮箱密码 头像 地址 创建 时间 总览有本地文件、博客文章、摄影图库、随笔随记&#xff0c;这些板块也有对应的分类&#xff0c;我们要把这些分类…...

[论文阅读]REPLUG: Retrieval-Augmented Black-Box Language Models

REPLUG: Retrieval-Augmented Black-Box Language Models REPLUG: Retrieval-Augmented Black-Box Language Models - ACL Anthology NAACL-HLT 2024 在这项工作中&#xff0c;我们介绍了RePlug&#xff08;Retrieve and Plug&#xff09;&#xff0c;这是一个新的检索增强型…...

Matlab 基于共面螺旋管或共面亥姆霍兹谐振器的超薄低频吸声板

经典吸声材料的吸声性能严格依赖于材料的厚度&#xff0c;要达到完全吸声&#xff0c;至少需要四分之一波长。在本文中&#xff0c;我们报道了一种厚度约为波长百分之一的超薄吸声板&#xff0c;可以完全吸收声能。其策略是将四分之一波长的减声管弯曲并缠绕成二维共面减声管&a…...

济南国网数字化培训班学习笔记-第二组-4节-输电线路工程安全管理

输电线路工程安全管理 安全标识 颜色 禁止红、警示黄、指令蓝、提示绿 安全器具 定义 安全工器具通常专指“电力安全工器具”&#xff0c;是防止触电、灼伤、坠落、摔跌、腐蚀、窒息等事故&#xff0c;保障工作人员人身安全的各种专用工具和器具 分类 个体防护设备 防…...

【C语言】数据在内存中的存储:从整数到浮点数的奥秘

前言 在计算机的世界里&#xff0c;数据的存储和表示是编程的基础。今天&#xff0c;我们就来深入探讨一下数据在内存中的存储方式&#xff0c;包括整数和浮点数的存储细节&#xff0c;以及大小端字节序的奥秘。这些内容不仅对理解计算机系统至关重要&#xff0c;还能帮助我们…...

白鲸开源WhaleStudio与崖山数据库管理系统YashanDB完成产品兼容互认证

近日&#xff0c;北京白鲸开源科技有限公司与深圳计算科学研究院联合宣布&#xff0c;双方已完成产品兼容互认证。此次认证涉及深圳计算科学研究院自主研发的崖山数据库管理系统YashanDB V23和北京白鲸开源科技有限公司的核心产品WhaleStudio V2.6。经过严格的测试与验证&#…...

图论---朴素Prim(稠密图)

O( n ^2 ) 题目通常会提示数据范围&#xff1a; 若 V ≤ 500&#xff0c;两种方法均可&#xff08;朴素Prim更稳&#xff09;。 若 V ≤ 1e5&#xff0c;必须用优先队列Prim vector 存图。 // 最小生成树 —朴素Prim #include<cstring> #include<iostream> #i…...

借助deepseek和vba编程实现一张表格数据转移到多张工作簿的表格中

核心目标 将工作表中的内容按村社名称分类放入对应位置的目标工作簿的第一个工作表的对应位置 deepseek提问方式 你是一个擅长vba编程的专家&#xff0c;核心目标是奖工作表中的部分内容按下列要求写入对应工作簿的第一个工作表中。第一&#xff0c;在工作表A列中筛选出相…...

springboot整合redis实现缓存

一、redis 二、spring boot 整合redis 三、基于注解的Redis缓存实现 使用Cacheable、CachePut、CacheEvict注解定制缓存管理 对CommentService类中的方法进行修改使用Cacheable、CachePut、CacheEvict三个注解定制缓存管理&#xff0c;修改后的方法如下 Cacheable(cacheNam…...

git tag使用场景和实践

背景 每次上线一个迭代&#xff0c;为了区分本次代码的分支是哪个迭代&#xff0c;可以给分支打上tag&#xff0c;这样利于追踪分支所属迭代&#xff0c;如果devops没有自动给分支打tag&#xff0c;需要自己来打 操作 1.查看当前tag git tag2.给分支打tag git tag <tag…...

十分钟恢复服务器攻击——群联AI云防护系统实战

场景描述 服务器遭遇大规模DDoS攻击&#xff0c;导致服务不可用。通过群联AI云防护系统的分布式节点和智能调度功能&#xff0c;快速切换流量至安全节点&#xff0c;清洗恶意流量&#xff0c;10分钟内恢复业务。 技术实现步骤 1. 启用智能调度API触发节点切换 群联系统提供RE…...

国产紫光同创FPGA视频采集转SDI编码输出,基于HSSTHP高速接口,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目紫光同创FPGA相关方案推荐本博已有的 SDI 编解码方案本方案在Xilinx--Artix7系列FPGA上的应用本方案在Xilinx--Kintex系列FPGA上的应用本方案在Xilinx--Zynq系列FPGA上…...

最小生成树-prim、kruskal算法

目录 prim算法 kruskal算法 题目练习 &#xff08;1&#xff09;AcWing 858. Prim算法求最小生成树 - AcWing &#xff08;2&#xff09;859. Kruskal算法求最小生成树 - AcWing题库​编辑 学习之前建议温习一下迪杰斯特拉算法和并查集~ 先简单认识下最小生成树&#xff1a…...

【硬核干货】JetBrains AI Assistant 干货笔记

快进来抄作业&#xff0c;小编呕心沥血整理的 JetBrains AI Assistant 超干货笔记&#xff01; 原文链接&#xff1a;【硬核干货】JetBrains AI Assistant 干货笔记 关于晓数神州 晓数神州坚持以“客户为中心”的宗旨&#xff0c;为客户提供专业的解决方案和技术服务&#xff…...

强化学习核心原理及数学框架

1. 定义与核心思想 强化学习&#xff08;Reinforcement Learning, RL&#xff09;是一种通过智能体&#xff08;Agent&#xff09;与环境&#xff08;Environment&#xff09;的持续交互来学习最优决策策略的机器学习范式。其核心特征为&#xff1a; ​​试错学习​​&#x…...

C# 综合示例 库存管理系统4 classMod类

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的 在《库存管理系统》中使用classMod类来保存全局变量。 变量定义和含义,请详见下面的源代码: public class classMod { //数据库路径...

[C] 第6章 C51函数

文章目录 C51函数函数概述从函数定义角度分类从函数有无返回值分类从函数有无参数 函数定义的一般形式C51无参函数的一般形式C51有参函数的一般形式 函数的形式参数和实际参数形式参数实际参数函数的返回值一般形式为&#xff1a; 函数的形参和实参的特点 函数的调用函数的调用…...

docker 配置代理

docker 配置代理有 2 中方法 1.Daemon configuration 直接在 /etc/docker/daemon.json 文件中配置 {"proxies": {"http-proxy": "http://proxy.example.com:3128","https-proxy": "https://proxy.example.com:3129",&quo…...

Redis 深度解析:从核心原理到生产实践

Redis 深度解析&#xff1a;从核心原理到生产实践 一、Redis 核心定位与数据结构 1. 核心能力矩阵深度解析 Redis 作为高性能内存数据库&#xff0c;核心能力覆盖缓存、数据存储、消息中间件等场景&#xff0c;其设计哲学围绕速度优先、内存高效、功能丰富展开&#xff1a; …...

从零搭建高可用分布式限流组件:设计模式与Redis令牌桶实践

一、需求背景与设计目标 在分布式系统中&#xff0c;面对突发流量时需要一种精准可控的流量控制手段。我们的组件需要具备&#xff1a; 多维度限流&#xff08;用户/IP/服务节点/自定义表达式&#xff09;分布式环境下精准控制开箱即用的Spring Boot Starter集成高扩展性的架…...

基于霍尔效应传感器的 BLDC 电机梯形控制方案详解

基于霍尔效应传感器的 BLDC 电机梯形控制方案解读 使用霍尔效应传感器的无刷直流(BLDC)电机梯形控制 一、系统核心架构与技术优势 (一)BLDC 电机与霍尔传感器控制原理 BLDC 电机作为永磁同步电机的一种,其核心特征是转子反电动势为梯形波,定子电流为 120 电角度宽度的矩…...

Pikachu靶场-File Inclusion

文件包含漏洞&#xff08;File Inclusion Vulnerability&#xff09;是Web应用程序中的一种常见安全漏洞&#xff0c;通常由于开发者未对用户输入进行严格过滤&#xff0c;导致攻击者能够包含并执行恶意文件。这种漏洞主要分为两种类型&#xff1a; 1. 漏洞类型 本地文件包含&a…...

如何模拟黑客攻击(Red Teaming)以测试服务器安全性

模拟黑客攻击&#xff08;Red Teaming&#xff09;是评估服务器安全性的有效方法&#xff0c;但需严格遵循**合法授权**和**道德准则**。以下是专业且安全的操作流程&#xff1a; --- ### **1. 前期准备** - **法律授权** - 获得目标系统的**书面授权**&#xff0c;明确测…...

分页查询优惠券

文章目录 概要整体架构流程技术细节小结 概要 接口分析 一个典型的带过滤条件的分页查询&#xff0c;非常简单。按照Restful风格设计即可&#xff0c;我们关注的点有两个&#xff1a; 请求参数 返回值格式 请求参数包含两部分&#xff0c;一个是分页参数&#xff0c;另一…...

QTcpSocket 和 QUdpSocket 来实现基于 TCP 和 UDP 的网络通信

在 Qt 中&#xff0c;您可以通过 QTcpSocket 和 QUdpSocket 来实现基于 TCP 和 UDP 的网络通信。以下是如何使用 Qt 实现这两种通信方式的简要示例。 1. TCP 网络通信 TCP 是面向连接的协议&#xff0c;确保数据的可靠传输。下面是一个简单的 TCP 客户端和服务器示例。 TCP …...

从岗位依附到能力生态:AI革命下“什么叫就业”的重构与价值

在人工智能(AI)技术深刻重塑社会生产关系的当下,“就业”这一概念正经历着从“职业绑定”到“能力变现”的范式转移。本文将从传统就业观的解构、AI赋能艺术教育的价值逻辑、以及未来就业形态的进化方向三个维度,探讨技术驱动下就业的本质变革,并揭示AI技术如何通过教育创…...

2025上海车展 | 移远通信全栈车载智能解决方案重磅亮相,重构“全域智能”出行新范式

2025年4月23日至5月2日&#xff0c;第二十一届上海国际汽车工业展览会在国家会展中心&#xff08;上海&#xff09;盛大启幕。作为车载智能解决方案领域的领军企业&#xff0c;移远通信以“全域智能 驭见未来”为主题&#xff0c;携丰富的车载解决方案及客户终端惊艳亮相8.2馆8…...

LVGL在VScode的WSL2中仿真

目录 一、前言 二、开始部署 1.拉取github的库 2.在WSL安装一些必要的库或者包 3.开始编译 三、注意事项 一、前言 相信有不少兄弟因为苦于没有外设而无法学习LVGL&#xff0c;这里我提供一种WSL中仿真LVGL工程的方法。结果图如下&#xff1a; 二、开始部署 1.拉取github…...

React-组件和props

1、类组件 import React from react; class ClassApp extends React.Component {constructor(props) {super(props);this.state{};}render() {return (<div><h1>这是一个类组件</h1><p>接收父组件传过来的值&#xff1a;{this.props.name}</p>&…...

驱动开发系列53 - 一个OpenGL应用程序是如何调用到驱动厂商GL库的

一:概述 一个 OpenGL 应用程序调用 GPU 驱动的过程,主要是通过动态链接库(libGL.so)来完成的。本文从上到下梳理一下整个调用链,包含 GLVND、Mesa 或厂商驱动之间的关系。 二:调用关系 1. 首先一个 OpenGL 应用程序(比如游戏或图形渲染软件)在运行时会调用 OpenGL 提供…...

【python】一文掌握 markitdown 库的操作(用于将文件和办公文档转换为Markdown的Python工具)

更多内容请见: python3案例和总结-专栏介绍和目录 文章目录 一、markitdown概述1.1 markitdown介绍1.2 MarkItDown支持的文件1.3 为什么是Markdown?二、markitdown安装2.1 pip方式安装2.2 源码安装2.3 docker方式安装三、基本使用3.1 命令行方式3.2 可选依赖项配置3.3 插件方…...

【网络入侵检测】基于Suricata源码分析NFQ IPS模式实现

【作者主页】只道当时是寻常 【专栏介绍】Suricata入侵检测。专注网络、主机安全,欢迎关注与评论。 1. 概要 👋 本文聚焦于 Suricata 7.0.10 版本源码,深入剖析其 NFQ(Netfilter Queue)模式的实现原理。通过系统性拆解初始化阶段的配置流程、数据包监听机制的构建逻辑,以…...

驱动开发硬核特训 · Day 19:从字符设备出发,掌握 Linux 驱动的实战路径(含 gpio-leds 控制示例)

视频教程请关注 B 站&#xff1a;“嵌入式 Jerry” 一、背景说明&#xff1a;字符设备驱动的角色定位 在 Linux 内核驱动体系中&#xff0c;**字符设备驱动&#xff08;Character Device Driver&#xff09;**扮演着关键的桥梁作用&#xff0c;它直接向用户空间程序提供 read/…...

项目——高并发内存池

目录 项目介绍 做的是什么 要求 内存池介绍 池化技术 内存池 解决的问题 设计定长内存池 高并发内存池整体框架设计 ThreadCache ThreadCache整体设计 哈希桶映射对齐规则 ThreadCache TLS无锁访问 CentralCache CentralCache整体设计 CentralCache结构设计 C…...

几种查看PyTorch、cuda 和 Python 版本方法

在检查 PyTorch、cuda 和 Python 版本时&#xff0c;除了直接使用 torch.__version__ 和 sys.version&#xff0c;我们还可以通过其他方式实现相同的功能 方法 1&#xff1a;直接访问属性&#xff08;原始代码&#xff09; import torch import sysprint("PyTorch Versi…...

如何实现跟踪+分割的高效协同?SiamMask中的多任务损失设计

如何实现跟踪分割的高效协同&#xff1f;SiamMask中的多任务损失设计 一、引言二、三大分支损失函数详解2.1 分类分支损失2.2 回归分支损失2.3 Mask分支损失 三、损失加权策略与系数选择3.1 常见超参数设定3.2 动态权重&#xff08;可选&#xff09; 四、训练实践&#xff1a;平…...