【SPIN】PROMELA语言编程入门基础语法(SPIN学习系列--1)
PROMELA(Protocol Meta Language)是一种用于描述和验证并发系统的形式化建模语言,主要与SPIN(Simple Promela Interpreter)模型检查器配合使用。本教程将基于JSPIN(SPIN的Java图形化版本),围绕顺序编程(Sequential Programming)核心知识点展开,通过示例代码和操作演示,帮助你快速掌握PROMELA的基础语法与实践。
1.1 第一个PROMELA程序
PROMELA程序的核心是定义进程(process),通过proctype
关键字声明。程序执行从init
进程开始(类似C语言的main
函数)。
示例1-1:基础结构与输出
/* 第一个PROMELA程序:输出简单信息 */
proctype HelloWorld() {printf("Hello, PROMELA!\n"); /* 打印输出 */
}init {run HelloWorld(); /* 启动HelloWorld进程 */
}
操作步骤(JSPIN工具):
- 打开JSPIN,新建文件并输入上述代码,保存为
hello.pml
。 - 点击
Verify
→Parse
检查语法(无错误则显示Parsing completed
)。 - 点击
Simulate
→Run
启动模拟,控制台将输出Hello, PROMELA!
。
示例1-2:变量赋值与输出
proctype VarDemo() {int x = 5; /* 声明并初始化int变量 */byte y = 10; /* 声明byte变量(0-255) */printf("x = %d, y = %d\n", x, y); /* 格式化输出 */
}init {run VarDemo();
}
示例1-3:简单计算
proctype CalcDemo() {int a = 10, b = 3;int sum = a + b;int product = a * b;printf("Sum: %d, Product: %d\n", sum, product);
}init {run CalcDemo();
}
关键说明:
proctype
定义进程模板,init
是程序入口。printf
支持%d
(整数)、%s
(字符串)、%c
(字符)等格式化符号。
1.2 Random simulation(随机模拟)
PROMELA支持非确定性(Non-determinism),通过rand()
函数或多分支选择(如if
语句)实现随机行为。JSPIN的模拟功能可展示不同执行路径。
示例1-4:随机数生成
proctype RandDemo() {int r = rand() % 10; /* 生成0-9的随机数 */printf("Random number: %d\n", r);
}init {run RandDemo();
}
操作步骤(观察随机结果):
在JSPIN中多次点击Simulate
→ Run
,每次输出的随机数可能不同(因rand()
依赖伪随机种子)。
示例1-5:多分支随机选择
proctype BranchDemo() {if:: printf("执行分支1\n"); /* 分支1 */:: printf("执行分支2\n"); /* 分支2 */fi; /* if结束 */
}init {run BranchDemo();
}
示例1-6:条件随机选择
proctype CondRandDemo() {int x = rand() % 2; /* 0或1 */if:: x == 0 -> printf("x是0\n"); /* 条件分支1 */:: x == 1 -> printf("x是1\n"); /* 条件分支2 */fi;
}init {run CondRandDemo();
}
关键说明:
if
语句的分支用::
分隔,JSPIN会随机选择一个可执行的分支(若多个分支条件满足)。->
符号表示“仅当条件满足时执行该分支”(后续1.6节详细说明)。
1.3 Data types(数据类型)
PROMELA支持以下基础数据类型,需注意取值范围和使用场景:
1.3.1 基础类型对比
类型 | 描述 | 取值范围 | 示例 |
---|---|---|---|
bool | 布尔值 | true /false | bool flag = true; |
byte | 无符号8位整数 | 0 ~ 255 | byte age = 30; |
int | 有符号32位整数(依赖SPIN配置) | -2³¹ ~ 2³¹-1 | int score = -5; |
mtype | 枚举类型 | 用户定义的符号常量集合 | mtype { A, B, C }; |
示例1-7:bool类型使用
proctype BoolDemo() {bool isReady = true;if:: isReady -> printf("准备就绪\n");:: else -> printf("未就绪\n"); /* else分支(仅当isReady为false时执行) */fi;
}init {run BoolDemo();
}
示例1-8:byte与int的取值范围
proctype OverflowDemo() {byte b = 255;b = b + 1; /* 溢出:255+1=0(模256) */int i = 2147483647; /* int最大值 */i = i + 1; /* 溢出:2147483648(依赖SPIN配置,可能报错) */printf("b=%d, i=%d\n", b, i);
}init {run OverflowDemo();
}
示例1-9:mtype枚举类型
mtype { SUCCESS, FAIL, PENDING }; /* 定义枚举类型 */proctype MtypeDemo() {mtype status = PENDING;if:: status == SUCCESS -> printf("成功\n");:: status == FAIL -> printf("失败\n");:: status == PENDING -> printf("等待中\n");fi;
}init {run MtypeDemo();
}
关键说明:
byte
溢出会自动取模(如255+1=0),int
溢出可能导致未定义行为(SPIN默认不检查)。mtype
枚举用于提高代码可读性,避免“魔法数值”。
1.3.2 Type conversions(类型转换)
PROMELA支持隐式转换(小范围类型转大范围)和显式转换(需强制声明)。
示例1-10:隐式转换(byte→int)
proctype ImplicitConv() {byte b = 100;int i = b; /* 隐式转换:byte→int */printf("b=%d, i=%d\n", b, i); /* 输出:100, 100 */
}init {run ImplicitConv();
}
示例1-11:显式转换(int→byte)
proctype ExplicitConv() {int i = 300;byte b = (byte)i; /* 显式转换:截断高位,300 → 300-256=44 */printf("i=%d, b=%d\n", i, b); /* 输出:300, 44 */
}init {run ExplicitConv();
}
示例1-12:bool与int的转换
proctype BoolIntConv() {bool flag = true;int x = flag; /* true→1,false→0 */bool y = (bool)0; /* 0→false,非0→true */printf("x=%d, y=%s\n", x, y ? "true" : "false"); /* 输出:1, false */
}init {run BoolIntConv();
}
关键说明:
- 隐式转换仅允许从低精度到高精度(如
byte
→int
),反之需显式转换。 bool
转int
时,true
为1,false
为0;int
转bool
时,0为false
,非0为true
。
1.4 Operators and expressions(操作符与表达式)
PROMELA支持算术、逻辑、比较等操作符,优先级与C语言类似(()
可改变优先级)。
1.4.1 操作符分类
类型 | 操作符 | 示例 | 说明 |
---|---|---|---|
算术 | + , - , * , / , % | a + b , c % d | % 为取模,结果符号与被除数一致 |
逻辑 | && , ` | , !` | |
比较 | == , != , < , > , <= , >= | a != b , c <= d | 结果为bool 类型 |
示例1-13:算术操作符
proctype ArithmeticOps() {int a = 10, b = 3;printf("a+b=%d, a-b=%d\n", a+b, a-b); /* 13, 7 */printf("a*b=%d, a/b=%d\n", a*b, a/b); /* 30, 3(整数除法取整) */printf("a%%b=%d\n", a%b); /* 1(10%3=1) */
}init {run ArithmeticOps();
}
示例1-14:逻辑与比较操作符
proctype LogicOps() {int x = 5, y = 10;bool cond1 = (x > 0) && (y < 20); /* true */bool cond2 = (x == 5) || (y != 10); /* true */bool cond3 = !cond1; /* false */printf("cond1=%s, cond2=%s, cond3=%s\n", cond1 ? "true" : "false", cond2 ? "true" : "false", cond3 ? "true" : "false");
}init {run LogicOps();
}
示例1-15:表达式优先级
proctype PrecedenceDemo() {int a = 2, b = 3, c = 4;int res1 = a + b * c; /* 2 + (3*4)=14 */int res2 = (a + b) * c;/* (2+3)*4=20 */printf("res1=%d, res2=%d\n", res1, res2);
}init {run PrecedenceDemo();
}
关键说明:
- 整数除法
/
会截断小数部分(如10/3=3
)。 - 逻辑操作符
&&
和||
支持短路求值,避免无效计算。
1.4.2 Local variables(局部变量)
PROMELA中变量分为全局变量(声明在进程外)和局部变量(声明在进程或init
内),局部变量作用域限于所在进程。
示例1-16:全局变量与局部变量对比
int global_var = 10; /* 全局变量 */proctype LocalVarDemo() {int local_var = 20; /* 局部变量 */printf("全局变量: %d, 局部变量: %d\n", global_var, local_var);
}init {run LocalVarDemo();/* 无法访问LocalVarDemo的local_var(作用域仅限该进程) */
}
示例1-17:局部变量的生命周期
proctype LifeCycleDemo() {int x = 0;x = x + 1; /* x=1 */printf("x=%d\n", x); /* 输出1 */
} /* 进程结束,x被销毁 */init {run LifeCycleDemo();run LifeCycleDemo(); /* 再次启动进程,x重新初始化为0 */
}
示例1-18:同名变量覆盖
int x = 100; /* 全局变量x */proctype ShadowDemo() {int x = 200; /* 局部变量x覆盖全局变量 */printf("局部x: %d, 全局x: %d\n", x, ::x); /* ::x访问全局变量 */
}init {run ShadowDemo();
}
关键说明:
- 全局变量可被所有进程访问,局部变量仅所在进程可见。
- 使用
::x
显式访问被局部变量覆盖的全局变量(如示例1-18)。
1.4.3 Symbolic names(符号名)
通过#define
定义常量,或typedef
定义类型别名,提高代码可读性。
示例1-19:#define常量
#define MAX_USERS 10 /* 定义常量 */
#define PI 3.14 /* 注意:PROMELA不支持浮点数,此处仅为示例 */proctype DefineDemo() {int users = MAX_USERS;printf("最大用户数: %d\n", users);
}init {run DefineDemo();
}
示例1-20:typedef类型别名
typedef Score int; /* 定义Score为int的别名 */proctype TypedefDemo() {Score math = 90; /* 等价于int math=90 */printf("数学成绩: %d\n", math);
}init {run TypedefDemo();
}
示例1-21:符号名与枚举结合
#define SUCCESS 0
#define FAIL 1
mtype { STATUS_SUCCESS=SUCCESS, STATUS_FAIL=FAIL }; /* 枚举关联常量 */proctype SymbolDemo() {int result = SUCCESS;if:: result == STATUS_SUCCESS -> printf("操作成功\n");:: result == STATUS_FAIL -> printf("操作失败\n");fi;
}init {run SymbolDemo();
}
关键说明:
#define
是预编译指令,仅替换文本(需注意括号避免优先级问题,如#define ADD(a,b) (a+b)
)。typedef
用于创建类型别名,提高代码可维护性。
1.5 Control statements(控制语句)
PROMELA的控制语句用于管理代码执行顺序,包括顺序执行、分支(if
/alt
)、循环(do
/for
)等。
1.6 Selection statements(选择语句)
PROMELA提供两种选择语句:if
(非阻塞选择)和alt
(阻塞选择),易混淆点在于分支条件不满足时的行为。
1.6.1 if与alt的对比
语句 | 行为 | 示例 |
---|---|---|
if | 若所有分支条件均不满足,报错(invalid end of if ) | if :: cond -> ... fi |
alt | 若所有分支条件均不满足,阻塞(等待条件变化) | alt :: cond -> ... od |
示例1-22:if语句(非阻塞)
proctype IfDemo() {int x = 5;if:: x > 10 -> printf("x>10\n"); /* 条件不满足 */:: x < 3 -> printf("x<3\n"); /* 条件不满足 */fi; /* 报错:所有分支条件均不满足 */
}init {run IfDemo();
}
示例1-23:alt语句(阻塞)
proctype AltDemo() {int x = 5;alt:: x > 10 -> printf("x>10\n"); /* 条件不满足,阻塞 */:: x < 3 -> printf("x<3\n"); /* 条件不满足,阻塞 */od; /* 程序卡住,等待x的值变化 */
}init {run AltDemo();
}
示例1-24:带else的if语句
proctype IfElseDemo() {int x = 5;if:: x > 10 -> printf("x>10\n");:: else -> printf("x≤10\n"); /* else分支(所有其他情况) */fi; /* 输出:x≤10 */
}init {run IfElseDemo();
}
关键说明:
if
必须至少有一个分支条件满足,否则SPIN会报错(error: invalid end of if
)。alt
用于并发场景中等待条件满足(如进程间同步),单独使用可能导致死锁。
1.6.2 Conditional expressions(条件表达式)
条件表达式是if
/alt
语句的核心,支持复杂逻辑组合。
示例1-25:多条件组合
proctype CondExprDemo() {int a = 5, b = 10;if:: (a > 0) && (b < 20) -> printf("条件1满足\n"); /* true */:: (a == 5) || (b != 10) -> printf("条件2满足\n"); /* true */fi; /* 随机选择一个满足的分支执行 */
}init {run CondExprDemo();
}
示例1-26:基于变量的条件
proctype VarCondDemo() {int flag = rand() % 2; /* 0或1 */if:: flag == 0 -> printf("flag=0\n");:: flag == 1 -> printf("flag=1\n");fi;
}init {run VarCondDemo();
}
示例1-27:枚举类型条件
mtype { ON, OFF };proctype MtypeCondDemo() {mtype state = ON;if:: state == ON -> printf("设备开启\n");:: state == OFF -> printf("设备关闭\n");fi;
}init {run MtypeCondDemo();
}
1.7 Repetitive statements(重复语句)
PROMELA支持do
(类似while
)和for
(计数循环)两种循环结构。
1.7.1 do循环(无限循环)
do
循环重复执行分支,直到break
或所有分支条件不满足(do
无退出条件时会无限循环)。
示例1-28:简单do循环
proctype DoLoopDemo() {int count = 0;do:: count < 3 -> printf("计数: %d\n", count);count++;:: else -> break; /* 退出循环 */od;
}init {run DoLoopDemo(); /* 输出0,1,2 */
}
示例1-29:多分支do循环
proctype MultiBranchDo() {int x = 0;do:: x < 2 -> printf("x=%d(分支1)\n", x);x++;:: x >= 2 -> printf("x=%d(分支2)\n", x);break;od;
}init {run MultiBranchDo(); /* 输出x=0(分支1),x=1(分支1),x=2(分支2) */
}
示例1-30:无退出条件的do循环(死锁)
proctype InfiniteDo() {do:: true -> /* 永远满足 */printf("循环中...\n");od; /* 无限循环,SPIN模拟时需手动终止 */
}init {run InfiniteDo();
}
1.7.2 Counting loops(计数循环)
for
循环用于已知次数的迭代,语法为for (init; cond; update) { ... }
。
示例1-31:基本for循环
proctype ForLoopDemo() {int sum = 0;for (int i=1; i<=5; i++) { /* i从1到5 */sum += i;}printf("1+2+3+4+5=%d\n", sum); /* 输出15 */
}init {run ForLoopDemo();
}
示例1-32:嵌套for循环
proctype NestedForDemo() {for (int i=1; i<=2; i++) {for (int j=1; j<=3; j++) {printf("i=%d, j=%d\n", i, j);}}
}init {run NestedForDemo(); /* 输出i=1,j=1; i=1,j=2; ... i=2,j=3 */
}
示例1-33:for循环与break
proctype ForBreakDemo() {for (int i=1; i<=5; i++) {if (i == 3) {break; /* 退出循环 */}printf("i=%d\n", i); /* 输出i=1,2 */}
}init {run ForBreakDemo();
}
关键说明:
do
循环更灵活(支持多分支),for
循环适合固定次数的迭代。- 避免在
for
循环中修改循环变量(可能导致不可预期的行为)。
1.8 Jump statements(跳转语句)
PROMELA支持break
(退出循环)和goto
(跳转到标签),需谨慎使用以避免代码混乱。
示例1-34:break退出循环
proctype BreakDemo() {int i = 0;do:: i < 5 -> i++;if (i == 3) {break; /* 退出do循环 */}printf("i=%d\n", i); /* 输出i=1,2 */od;
}init {run BreakDemo();
}
示例1-35:goto跳转到标签
proctype GotoDemo() {int x = 0;start: /* 标签 */x++;if:: x < 3 -> printf("x=%d\n", x); /* 输出x=1,2 */goto start; /* 跳转回start标签 */:: else -> printf("结束\n");fi;
}init {run GotoDemo();
}
示例1-36:goto跨循环跳转
proctype GotoCrossLoop() {int i = 0, j = 0;outer: /* 外层循环标签 */for (i=1; i<=2; i++) {for (j=1; j<=3; j++) {if (j == 2) {goto outer; /* 跳转到外层循环 */}printf("i=%d, j=%d\n", i, j); /* 输出i=1,j=1 */}}
}init {run GotoCrossLoop();
}
关键说明:
break
仅退出当前最内层循环,goto
可跳转到任意标签(包括循环外)。- 过度使用
goto
会降低代码可读性,建议优先使用break
或重构循环逻辑。
总结
本教程围绕PROMELA顺序编程的核心知识点,结合JSPIN工具演示了从基础程序结构到控制语句的完整流程。通过30+示例代码,你已掌握:
- PROMELA的进程定义与
init
入口。 - 随机模拟与非确定性行为。
- 数据类型、操作符与表达式的使用。
- 选择语句(
if
/alt
)和循环语句(do
/for
)的区别。 - 跳转语句(
break
/goto
)的应用场景。
后续可结合SPIN的模型检查功能(如spin -a
生成验证代码),进一步验证并发系统的正确性。
相关文章:
【SPIN】PROMELA语言编程入门基础语法(SPIN学习系列--1)
PROMELA(Protocol Meta Language)是一种用于描述和验证并发系统的形式化建模语言,主要与SPIN(Simple Promela Interpreter)模型检查器配合使用。本教程将基于JSPIN(SPIN的Java图形化版本)&#…...
Linux --systemctl损坏
systemctlSegmentation fault (core dumped) 提示这个 Ubuntu/Debian sudo apt-get update sudo apt-get --reinstall install systemdCentOS/RHEL sudo yum reinstall systemd # 或 CentOS 8 / RHEL 8 sudo dnf reinstall systemd...
Vue3+ElementPlus 开箱即用后台管理系统,支持白天黑夜主题切换,通用管理组件,
Vue3ElementPlus后台管理系统,支持白天黑夜主题切换,专为教育管理场景设计。主要功能包括用户管理(管理员、教师、学生)、课件资源管理(课件列表、下载中心)和数据统计(使用情况、教学效率等&am…...
Seata源码—3.全局事务注解扫描器的初始化二
大纲 1.全局事务注解扫描器继承的父类与实现的接口 2.全局事务注解扫描器的核心变量 3.Spring容器初始化后初始化Seata客户端的源码 4.TM全局事务管理器客户端初始化的源码 5.TM组件的Netty网络通信客户端初始化源码 6.Seata框架的SPI动态扩展机制源码 7.向Seata客户端注…...
Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(七)
Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(七) 在 Android Coli 3 ImageView load two suit Bitmap thumb and formal,Kotlin(六)-CSDN博客 的基础上改进,主要是…...
快速搭建一个electron-vite项目
1. 初始化项目 在命令行中运行以下命令 npm create quick-start/electronlatest也可以通过附加命令行选项直接指定项目名称和你想要使用的模版。例如,要构建一个 Electron Vue 项目,运行: # npm 7,需要添加额外的 --: npm cre…...
Python网络请求利器:urllib库深度解析
一、urllib库概述 urllib是Python内置的HTTP请求库,无需额外安装即可使用。它由四个核心模块构成: urllib.request:发起HTTP请求的核心模块urllib.error:处理请求异常(如404、超时等)…...
2025认证杯第二阶段数学建模B题:谣言在社交网络上的传播思路+模型+代码
2025认证杯数学建模第二阶段思路模型代码,详细内容见文末名片 一、引言 在当今数字化时代,社交网络已然成为人们生活中不可或缺的一部分。信息在社交网络上的传播速度犹如闪电,瞬间就能触及大量用户。然而,这也为谣言的滋生和扩…...
IP地址、端口、TCP介绍、socket介绍、程序中socket管理
1、IP地址:IP 地址就是 标识网络中设备的一个地址,好比现实生活中的家庭地址。IP 地址的作用是 标识网络中唯一的一台设备的,也就是说通过IP地址能够找到网络中某台设备。 2、端口:代表不同的进程,如下图: 3、socket:…...
leetcode0621. 任务调度器-medium
1 题目:任务调度器 官方标定难度:中 给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表,用字母 A 到 Z 表示,以及一个冷却时间 n。每个周期或时间间隔允许完成一项任务。任务可以按任何顺序完成,但有一个限制…...
中小型培训机构都用什么教务管理系统?
在教育培训行业快速发展的今天,中小型培训机构面临着学员管理复杂、课程体系多样化、教学效果难以量化等挑战。一个高效的教务管理系统已成为机构运营的核心支撑。本文将深入分析当前市场上适用于中小型培训机构的教务管理系统,重点介绍爱耕云这一专业解…...
centos7 基于yolov10的推理程序环境搭建
这篇文章的前提是系统显卡驱动已经安装 安装步骤参照前一篇文章centos7安装NVIDIA显卡 安装Anaconda 下载地址anaconda.com 需要注册账号获取下载地址 wget https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh赋予权限 chmod ax Anaconda3-2024.10-1-…...
Web GIS可视化地图框架Leaflet、OpenLayers、Mapbox、Cesium、ArcGis for JavaScript
Mapbox、OpenLayers、Leaflet、ArcGIS for JavaScript和Cesium是五种常用的Web GIS地图框架,它们各有优缺点,适用于不同的场景。还有常见的3d库和高德地图、百度地图。 1. Mapbox 官网Mapbox Gl JS案列:https://docs.mapbox.com/mapbox-gl-…...
Kafka如何实现高性能
Kafka如何实现高性能 Kafka之所以能成为高性能消息系统的标杆,是通过多层次的架构设计和优化实现的。 一、存储层优化 1. 顺序I/O设计 日志结构存储:所有消息追加写入,避免磁盘随机写分段日志:将日志分为多个Segment文件&…...
如何通过partclone克隆Ubuntu 22系统
如何通过partclone克隆Ubuntu 22系统 一. 背景知识:为什么要克隆系统?二. 准备工作详解2.1 选择工具:为什么是partclone?2.2 制作定制化ISO的深层原因 三. 详细操作步骤3.1 环境准备阶段3.2 ISO改造关键步骤3.3 启动到Live环境3.4…...
语义化路径是什么意思,举例说明
下面的java代码输出结果是/a/b/../c/./a.txt/a/c/a.txt,语义化路径是什么意思呢?代码如下所示: import org.springframework.util.StringUtils; public class StringUtilsTest { /** 字符串处理 */ Test public void …...
Dockerfile构建镜像
Dockerfile 构建镜像 # 使用本地已下载的 java:8-alpine 镜像作为基础镜像 FROM java:8-alpine# 设置工作目录 WORKDIR /home/www/shop# 复制 JAR 文件到容器中 COPY ./fkshop-build.jar /home/www/shop/fkshop-build.jar# 复制配置文件(如果需要) COPY…...
vue3.0的name属性插件——vite-plugin-vue-setup-extend
安装 这个由于是在开发环境下的一个插件 帮助我们支持name属性 所以需要是-D npm i vite-plugin-vue-setup-extend -D在pasckjson中无法注释每个插件的用处 可以在vscode中下载一个JsonComments这样可以在json中添加注释方便日后维护和查阅API 引入 在vite.config.js中 im…...
gRPC为什么高性能
gRPC 之所以具备高性能的特性,主要得益于其底层设计中的多项关键技术优化。以下从协议、序列化、传输机制、并发模型等方面详细解析其高性能的原因: 1. 基于 HTTP/2 协议的核心优势 HTTP/2 是 gRPC 的传输基础,相较于 HTTP/1.x,它通过以下机制显著提升了效率: 多路复用(…...
进度管理高分论文
2022年,xx县开展紧密型县域医共体建设,将全县县、镇两级医疗机构组建成2家医共体,要求医共体内部实行行政、人员、财务、业务、信息、绩效、药械“七统一”管理。但是卫生系统整体信息化水平较低,业务系统互不相通,运营…...
每日算法刷题计划Day7 5.15:leetcode滑动窗口4道题,用时1h
一.定长滑动窗口 【套路】教你解决定长滑窗!适用于所有定长滑窗题目! 模版套路 1.题目描述 1.计算所有长度恰好为 k 的子串中,最多可以包含多少个元音字母 2.找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。 3.…...
C++核心编程--1 内存分区模型
C程序执行时,内存可以划分为4部分 代码区:存放函数体的二进制代码 全局区:存放全局变量、静态变量、常量 栈区:局部变量、函数参数值,编译器自动分配和释放 堆区:程序员自己分配和释放 1.1 程序运行前…...
产品更新丨谷云科技 iPaaS 集成平台 V7.5 版本发布
五月,谷云科技 iPaaS 集成平台保持月度更新, V7.5 版本于近日正式发布。我们一起来看看新版本有哪些升级和优化。 核心新增功能:深化API治理,释放连接价值 API网关:全链路可控,精准管控业务状态 业务状态…...
【AI论文】对抗性后期训练快速文本到音频生成
摘要:文本到音频系统虽然性能不断提高,但在推理时速度很慢,因此对于许多创意应用来说,它们的延迟是不切实际的。 我们提出了对抗相对对比(ARC)后训练,这是第一个不基于蒸馏的扩散/流模型的对抗加…...
欧拉计划 Project Euler 73(分数有范围计数)题解
欧拉计划 Project Euler 73 题解 题干分数有范围计数 思路code 题干 分数有范围计数 考虑形如 n d \frac{n}{d} dn的分数,其中 n n n和 d d d均为正整数。如果 n < d n<d n<d且其最大公约数为1,则称该分数为最简真分数。 将所有 d ≤ 8 d\l…...
Quic如何实现udp可靠传输
QUIC(Quick UDP Internet Connections)是由 Google 设计并被 IETF 标准化的传输层协议,它基于 UDP 实现,但提供了类似 TCP 的可靠性和更高级的功能(如多路复用、0-RTT 握手、TLS 加密等)。 尽管 UDP 是不可…...
本地文件操作 MCP (多通道处理) 使用案例
## 概述 文件操作 MCP (Multi-Channel Processing) 是一种用于高效处理本地文件的框架和库,它提供了并行处理、批量操作、监控和异常处理等功能。通过多通道架构,MCP 能够显著提高大规模文件操作的效率,特别适用于需要处理大量文件或大型文件…...
Blender 入门教程(三):骨骼绑定
一、前言 不知道大家有没有玩过一些单机游戏的 Mod,比如《侠盗猎车》里主角变成奥特曼,各种新能源汽车乱入等等。 这些都是别人对原有模型就行修改换皮,并重新绑定骨骼完成的,所以如果会了骨骼绑定后,你也就可以自己…...
Java 异常处理之 BufferOverflowException(BufferOverflowException 概述、常见发生场景、避免策略)
一、BufferOverflowException 概述 BufferOverflowException 是 Java NIO 包中的一个运行时异常,是 RuntimeException 的子类 public class BufferOverflowException extends RuntimeException {... }# 继承关系java.lang.Object-> java.lang.Throwable-> j…...
密码学实验:凯撒密码
密码学实验:凯撒密码 一、实验目的 掌握凯撒密码的数学原理:理解字符移位与模运算的结合,实现加解密算法。理解暴力破解本质:通过穷举有限密钥空间,掌握利用语言特征破解密文的方法。编程实践:用Python实…...
C40-指针
一 指针的引入 什么是指针:指针是一个变量,其值是另一个变量的内存地址 简单的使用地址输出一个变量: 代码示例 #include <stdio.h> int main() {int a10;printf("a的地址是:%p\n",&a);printf("a%d\n",*(&a)); //*号是取值运算符…...
Cloudflare防火墙拦截谷歌爬虫|导致收录失败怎么解决?
许多站长发现网站突然从谷歌搜索结果中“消失”,背后很可能是Cloudflare防火墙误拦截了谷歌爬虫(Googlebot),导致搜索引擎无法正常抓取页面。 由于Cloudflare默认的防护规则较为严格,尤其是针对高频访问的爬虫IP&…...
3.3 掌握RDD分区
本实战任务旨在掌握Spark RDD 的分区操作,包括理解 RDD 分区的概念、作用、分区数量的确定原则以及如何通过自定义分区器来优化数据处理。通过创建一个 Maven 项目并编写 Scala 代码,实现了一个自定义的科目分区器 SubjectPartitioner,该分区…...
以项目的方式学QT开发(二)——超详细讲解(120000多字详细讲解,涵盖qt大量知识)逐步更新!
API 描述 函数原型 参数说明 push_back() 在 list 尾部 添加一个元素 void push_back(const T& value); value :要添 加到尾部的元 素 这个示例演示了如何创建 std::list 容器,并对其进行插入、删除和迭代操作。在实际应用中&am…...
linux备份与同步工具rsync
版权声明:原创作品,请勿转载! 文章目录 版权声明:原创作品,请勿转载! 实验环境介绍: 1.工具介绍 2.详细介绍 2.1 本地模式(用得少) 2.2 远程模式 2.3 守护进程模式…...
Ascend的aclgraph(九)AclConcreteGraph:e2e执行aclgraph
1回顾 前面的几章内容探讨了aclgraph运行过程中的涉及到的关键模块和技术。本章节将前面涉及到的模块串联起来,对aclgraph形成一个端到端的了解。 先给出端到端运行的代码,如下: import torch import torch_npu import torchair import log…...
2025 OceanBase 开发者大会全议程指南
5 月 17 日,第三届 OceanBase 开发者大会将在广州举办。 我们邀请数据库领军者与AI实践先锋,与开发者一起探讨数据库与 AI 协同创新的技术趋势,面对面交流 OceanBase 在 TP、AP、KV 及 AI 能力上的最新进展,深度体验“打破技术栈…...
【深度学习之四】知识蒸馏综述提炼
知识蒸馏综述提炼 目录 知识蒸馏综述提炼 前言 参考文献 一、什么是知识蒸馏? 二、为什么要知识蒸馏? 三、一点点理论 四、知识蒸馏代码 总结 前言 知识蒸馏作为一种新兴的、通用的模型压缩和迁移学习架构,在最近几年展现出蓬勃的活力…...
Java大师成长计划之第23天:Spring生态与微服务架构之服务发现与注册中心
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4-turbo模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 在微服务架构中,服务发现…...
list简单模拟实现
成员变量迭代器(重点)ListIterator运算符重载begin、end 插入、删除inserterase头插、尾插、头删、尾删 operator->const_iterator拷贝构造operator析构函数完整代码 由于前面已经模拟实现了vector,所以这里关于一些函数实现就不会讲的过于…...
undefined reference to `typeinfo for DeviceAllocator‘
出现“undefined reference to typeinfo”链接错误的原因及解决方法如下: class DeviceAllocator { public:explicit DeviceAllocator(DeviceType device_type){};virtual void* allocate(size_t n) 0;virtual void deallocate(void* p) 0;~DeviceAllocator() d…...
动态规划问题 -- 多状态模型(买股票的最佳时机II)
目录 动态规划分析问题五步曲题目概述利用状态机推导状态转移方程式代码编写 动态规划分析问题五步曲 不清楚动态规划分析问题是哪关键的五步的少年们可以移步到 链接: 动态规划算法基础 这篇文章非常详细的介绍了动态规划算法是如何分析和解决问题的 题目概述 链接: 买股票的最…...
【落羽的落羽 C++】进一步认识模板
文章目录 一、非类型模板参数二、模板的特化1. 函数模板特化2. 类模板特化 三、模板的编译分离 一、非类型模板参数 模板参数可以分为类型参数和非类型参数。我们之前使用的都是类型参数,即出现在模板参数列表中,跟在class或typename之类的参数类型名称…...
Java爬虫能处理京东商品数据吗?
Java爬虫完全可以处理京东商品数据。通过Java爬虫技术,可以高效地获取京东商品的详细信息,包括商品名称、价格、图片、描述等。这些信息对于市场分析、选品上架、库存管理和价格策略制定等方面具有重要价值。以下是一个完整的Java爬虫示例,展…...
#跟着若城学鸿蒙# web篇-初探
前言 先看下官方介绍,这里总结了比较重要的几点Web组件基础:加载与渲染网页全面解析Web组件是现代应用开发中不可或缺的重要元素,它允许开发者在原生应用中无缝集成Web内容。本文将全面介绍Web组件的基本功能,包括多种内容加载方…...
Top-p采样:解锁语言模型的创意之门
Top - p采样 是什么:核采样:排序,累计到0.7,随机选择 在自然语言生成和大规模语言模型推理中,Top - p采样(又叫核采样,Nucleus Sampling)是一种基于累积概率的采样策略。 Top - p介…...
周赛好题推荐
这周周赛很有质量的,上了一个很有意思的数学题目,推了半天..... 给定一个区间[l,r],求出区间内所有满足x mod 2^i !k的所有正整数(最后全部进行异或) 首先我们不妨先算出[l,r]区间所有数字的异或,然后在算…...
【RabbitMQ】实现RPC通信的完整指南
文章目录 RPC 通信创建相关队列客户端代码声明队列发送请求接收响应完整代码 服务端代码设置同时只能获取一个消息接收消息完整代码 运行程序启动客户端启动服务端 RPC 通信 RPC (Remote Procedure Call), 即远过程调用。它是一种通过网络从远程计算机上请求服务,而…...
CK3588下安装linuxdeployqt qt6 arm64
参考资料: Linux —— linuxdeployqt源码编译与打包(含出错解决) linux cp指令报错:cp: -r not specified; cp: omitting directory ‘xxx‘(需要加-r递归拷贝) CMake Error at /usr/lib/x86_64…...
滑动窗口之二(优先队列)
原本滑动窗口的板子用的是数组和双指针模拟,我嫌麻烦还不好懂找了双端队列。但其实还是不太好使,比如今天的这道题就处理起来很麻烦。但是如果用优先队列的话就可以一直保证整个窗口是有序的,只需判断一下是否在窗口内即可。但是!…...