关于 WASM:1. WASM 基础原理
一、WASM 简介
1.1 WebAssembly 是什么?
WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C++、Rust)编译生成,并由浏览器中的 WebAssembly 引擎执行。
简而言之,WASM 是浏览器中的一个“轻量虚拟机”,它的目标是运行速度快、安全性高、体积小,适合执行计算密集型任务。
1.2 设计目标与用途
目标 | 解释说明 |
---|---|
高性能 | WASM 的指令非常接近底层机器语言,性能可达原生应用的 80%~90%。 |
可移植 | 编译后的 .wasm 文件可以在任意支持 WASM 的环境中运行,如浏览器、Node.js、区块链运行时等。 |
安全执行 | 运行在浏览器的沙箱环境中,无法直接访问文件系统或网络,只能访问明确授权的资源。 |
与 JavaScript 协同 | 设计目标不是取代 JS,而是补强——JS 做逻辑控制,WASM 处理高强度任务。 |
可快速加载 | .wasm 是压缩后的二进制格式,比 .js 加载更快、体积更小。 |
主要用途
-
图像/音频/视频处理:如将 C 写的 FFmpeg 编译为 WASM 在浏览器中运行;
-
游戏引擎移植:如 Unity、Unreal Engine 游戏编译成 Web 版本;
-
加解密算法实现:比如 AES、SHA256;
-
PDF / Word / Markdown 渲染;
-
AI/ML 推理模块;
-
区块链智能合约执行环境(如 EOS、Polkadot)。
1.3 与 JavaScript 的关系与运行方式
WebAssembly 的运行方式高度依赖 JavaScript,主要是 JS 扮演“调用者”的角色,WASM 负责“执行者”。
协作模式
-
JS 调用 WASM: 加载
.wasm
模块、传参、获取结果; -
WASM 导出函数: 供 JS 调用;
-
WASM 可导入 JS 提供的函数: 比如浏览器的打印、时间、内存等 API;
-
共享内存: 二者可以共享 ArrayBuffer(线性内存)。
示例流程图:
[ C/C++/Rust ]|↓┌───────────────┐│ 编译成 .wasm │ <── LLVM、Emscripten└───────────────┘↓┌──────────────────────────┐│ JavaScript 加载 .wasm ││ └ fetch / instantiate │└──────────────────────────┘↓┌──────────────────────────┐│ 浏览器 WASM 引擎执行代码 │└──────────────────────────┘
实际代码调用方式
HTML 页面中 JavaScript 调用 add.wasm
:
fetch('add.wasm') // 从服务器获取名为 'add.wasm' 的 WebAssembly 模块文件.then(response => response.arrayBuffer()) // 将响应数据转换为 ArrayBuffer(二进制格式).then(bytes => WebAssembly.instantiate(bytes)) // 将 ArrayBuffer 实例化为 WebAssembly 模块.then(result => { // 实例化成功后执行这个回调函数const add = result.instance.exports.add; // 从模块中导出名为 'add' 的函数console.log(add(5, 7)); // 调用导出的 'add' 函数,传入参数 5 和 7,输出结果 12});
注:需要先将一个用 C 写的加法函数编译为 .wasm
文件,JS 才能调用。
1.4 浏览器对 WASM 的支持情况
WASM 是由 Google、Mozilla、Microsoft、Apple 四大厂商联合设计的标准,当前所有主流浏览器均已支持 WebAssembly。
浏览器 | 支持版本(最低) | 是否默认开启 |
---|---|---|
Chrome | 57+ | 是 |
Firefox | 52+ | 是 |
Safari | 11+ | 是 |
Edge(旧版) | 16+ | 是 |
Edge(Chromium) | 所有版本 | 是 |
Node.js | 8+ | 是 |
检测支持的方法:
console.log(typeof WebAssembly === "object"); // true 表示支持
二、WASM 架构与运行模型
WebAssembly 本质上是一个基于栈机的运行时系统,核心架构包括:
-
模块(Module)
-
实例(Instance)
-
内存(Memory)与表(Table)
-
导入与导出(Import / Export)
-
栈式指令结构(Stack Machine Model)
2.1 模块(Module)
定义:模块是 WebAssembly 的最小部署单元,可以理解为 .wasm
文件中封装的逻辑程序块,就像一个 JavaScript 模块或 C 的动态链接库(.so/.dll)。
它包含:
-
类型(函数签名)
-
函数(函数体)
-
内存/表定义
-
全局变量
-
导入(import)项
-
导出(export)项
-
启动函数(start,可选)
示例
(module ;; 定义一个 WebAssembly 模块(func $add ;; 声明一个名为 $add 的函数(param $a i32) ;; 函数参数 $a,类型为 i32(32 位整数)(param $b i32) ;; 函数参数 $b,类型为 i32(result i32) ;; 返回值类型为 i32local.get $a ;; 读取本地变量 $a 的值local.get $b ;; 读取本地变量 $b 的值i32.add) ;; 对 $a 和 $b 执行加法运算(export "add" (func $add)) ;; 将 $add 函数导出,命名为 "add",供外部调用
)
以上 .wat
表示一个导出 add
函数的模块,两个参数相加。
注意:
特性 | .wat | .wasm |
---|---|---|
全称 | WebAssembly Text format | WebAssembly Binary format |
表现形式 | 可读的文本格式 | 压缩的二进制格式 |
人类可读性 | (适合调试、学习) | (需反编译工具查看) |
执行效率 | (需先转为 .wasm ) | (浏览器/引擎直接执行) |
使用场景 | 编写、调试 WebAssembly 模块 | 运行、部署 WebAssembly 模块 |
转换工具 | 使用 wat2wasm 转为 .wasm | 使用 wasm2wat 转为 .wat |
2.2 实例(Instance)
定义:模块是“代码模板”,实例(Instance)是模块在内存中的实际运行副本,加载后才具有运行能力。
它包含:
-
运行时内存
-
已绑定的导入值
-
各类资源的实例化副本(函数、表、内存、全局变量)
关系图:
.wasm↓ 编译Module(静态)↓ 实例化Instance(运行态)
通过 JS 调用 .wasm
,其实是使用模块创建了一个实例,然后调用其导出函数。
2.3 内存(Memory)与表(Table)
内存(Memory)
WebAssembly 的内存是一个线性内存(Linear Memory),表现为一个连续的字节数组(ArrayBuffer),供模块读写数据。
-
单位是“页”,每页 64KB(
65536 bytes
) -
只支持一段内存(Memory Index 为 0)
-
可以动态增长(grow)
-
由 JS 与 WASM 共享
// JS 中获取 wasm memory:
const memory = instance.exports.memory;
const bytes = new Uint8Array(memory.buffer); // 访问 wasm 中的内存数据
表(Table)
WebAssembly 的表是用于存储**函数引用(Function References)**的结构,用于支持间接调用(Indirect Calls)。
常用于:
-
动态函数调用(类似 C 的函数指针)
-
多态实现(如虚函数表)
2.4 导入与导出(Import / Export)
导入(Import)
允许模块使用外部定义的函数、内存、表、全局变量等,通常由 JavaScript 提供。
示例:
(import "env" "log" (func $log (param i32)))
上述表示模块希望导入一个 JS 的 env.log
函数。
导出(Export)
允许模块暴露函数、内存、表等供外部使用(JS 调用)。
(export "add" (func $add))
表示把 add
函数导出。
JS 调用关系
const imports = { // 定义导入对象 imports,供 wasm 模块使用env: { // 创建一个 "env" 命名空间(WebAssembly 中常见的导入命名空间)log: (arg) => console.log("WASM Log:", arg) // 定义一个 JS 函数 log,它会被 WebAssembly 模块中的代码调用,用于打印日志}
};WebAssembly.instantiate(bytes, imports) // 使用 imports 导入对象实例化 WebAssembly 模块.then(result => { // 实例化成功后执行这个回调const add = result.instance.exports.add; // 从模块中获取导出的函数 "add"console.log(add(2, 3)); // 调用 add(2, 3),输出 5(例如是加法函数)});
2.5 栈机结构(Stack Machine Model)
定义:WebAssembly 是一门基于栈的虚拟机语言(Stack Machine),所有指令不需要显式传参,而是通过操作数栈进行计算。
特点
-
无寄存器:不像 x86 或 ARM,WASM 不使用寄存器;
-
操作数栈工作方式:先压栈,再计算,再出栈;
-
函数、局部变量、控制流全靠指令栈操作完成
示例:
(func (param $a i32) (param $b i32) (result i32)local.get $a ;; → 将 $a 放入栈顶local.get $b ;; → 将 $b 放入栈顶i32.add ;; → 出栈两个数相加,将结果入栈
)
执行流程是这样的(假设 a=3,b=4):
[ ] ← 初始空栈
[3] ← local.get $a
[3, 4] ← local.get $b
[7] ← i32.add(弹出两个数,相加,再压入)
结果 7 就是函数返回值。
2.6 小结图示
┌──────────────┐
│ Module (.wasm) │
└──────┬───────┘↓ 实例化
┌──────────────┐
│ Instance │
│ ┌───────────┐ │
│ │ Memory │◄── JS 可访问 ArrayBuffer
│ └───────────┘ │
│ ┌───────────┐ │
│ │ Table ││── 动态函数表
│ └───────────┘ │
│ ┌───────────┐ │
│ │ Export │◄── JS 调用函数
│ └───────────┘ │
└──────────────┘▲│ Import│┌──────────────┐│ JavaScript │└──────────────┘
组件 | 作用描述 |
---|---|
Module | 静态代码定义 .wasm 文件 |
Instance | 模块运行时实例(JS 调用它) |
Memory | 线性内存,WASM/JS 共享 |
Table | 函数表,支持间接调用 |
Import | 模块向外请求的资源(JS 提供) |
Export | 模块向外暴露的函数或变量 |
Stack Machine | 栈结构执行指令,支持无寄存器运算 |
三、WASM 文件格式
WebAssembly 文件主要有三种格式:
-
.wasm
:二进制格式,供浏览器加载执行 -
.wat
:文本格式,便于阅读与手写 -
.wast
:测试格式(已废弃)
3.1 .wasm
二进制格式
定义:.wasm
是 WebAssembly 的主流部署格式,采用高度压缩的二进制编码(binary encoding),专为浏览器高效解析而设计。
特点
特性 | 描述 |
---|---|
高性能 | 加载与编译速度快,接近原生执行 |
不可读 | 对人类不友好,必须借助工具解析 |
可移植 | 不依赖平台,跨浏览器兼容 |
安全沙箱 | 所有行为在沙箱中运行,不会直接访问本地资源 |
文件结构(简化)
+---------------------+
| Magic Header (4B) | 0x00 0x61 0x73 0x6D → "\0asm"
| Version (4B) | 当前一般是 0x01 0x00 0x00 0x00
+---------------------+
| Section 1: Type |
| Section 2: Import |
| Section 3: Function |
| Section 4: Table |
| Section 5: Memory |
| Section 6: Export |
| Section 7: Code |
| Section 8: Data |
+---------------------+
可以使用工具如 wasm-objdump
来反编译:
wasm-objdump -x my_module.wasm # 查看段结构
wasm-objdump -d my_module.wasm # 反汇编
3.2 .wat
文本格式(WebAssembly Text Format)
定义:.wat
是 WebAssembly 的文本表示形式,类似汇编语言,用于手写、调试与学习。
特点
特性 | 描述 |
---|---|
可读性强 | 类 Lisp 风格,结构化、显式函数与局部变量 |
易于调试 | 方便修改和反编译观察 |
与 .wasm 可互转 | 通过官方工具如 wat2wasm 、wasm2wat |
示例 .wat
文件
(module;; 从 JS 中导入一个名为 "log" 的函数,接受一个 i32 参数(import "env" "log" (func $log (param i32)));; 定义加法函数 $add(func $add (param $a i32) (param $b i32) (result i32)local.get $a ;; 获取参数 alocal.get $b ;; 获取参数 bi32.add ;; 相加,栈顶变为结果(保留在栈顶);; 为了既返回又调用 log,我们使用 local.tee,把结果保存到临时变量local.tee 0 ;; 把结果存到局部变量 0,并保留在栈上用于返回call $log ;; 调用 log 打印结果)(export "add" (func $add)) ;; 导出函数
)
搭配 JavaScript 使用:
const imports = {env: {log: (arg) => console.log("WASM Log:", arg) // log 会在 WASM 中被调用}
};WebAssembly.instantiate(bytes, imports).then(result => {const add = result.instance.exports.add;console.log("JS Result:", add(2, 3)); // 先 WASM 打印,再 JS 打印
});
输出效果:
WASM Log: 5 // 来自 WebAssembly 内部调用 log
JS Result: 5 // 来自 JS 的 console.log
格式转换
需要安装 WABT 工具集(WebAssembly Binary Toolkit):
# 安装
brew install wabt # MacOS
sudo apt install wabt # Ubuntu# 转换为二进制
wat2wasm add.wat -o add.wasm# 反编译为文本
wasm2wat add.wasm -o add.wat
3.3 工具推荐
工具 | 作用 |
---|---|
wat2wasm | 文本转二进制 |
wasm2wat | 二进制转文本 |
wasm-objdump | 查看段信息 |
wasm-interp | 执行 wast 测试脚本 |
WebAssembly Studio | 在线 IDE |
wasm-pack | Rust 生成 WebAssembly |
binaryen | 优化 .wasm |
四、WebAssembly 实战
4.1 安装 WebAssembly 工具:WABT
WABT(WebAssembly Binary Toolkit) 是官方的 WASM 编译工具链,包含:
-
wat2wasm
:将文本.wat
转成二进制.wasm
-
wasm2wat
:反编译.wasm
为文本 -
wasm-objdump
:查看段信息
MacOS:
brew install wabt
Ubuntu/Debian:
sudo apt update
sudo apt install wabt
Windows:
-
前往 GitHub 下载编译好的 ZIP: https://github.com/WebAssembly/wabt/releases
-
解压并将
bin/
目录添加到系统环境变量Path
4.2 项目目录结构
mkdir wasm-demo && cd wasm-demo
项目目录:
wasm-demo/
├── index.html # 网页
├── main.js # JavaScript 逻辑
├── add.wat # WebAssembly 文本源码
├── add.wasm # 编译生成的二进制文件
4.3 编写 WebAssembly 文本文件(add.wat)
创建文件 add.wat
:
;; 文件:add.wat
(module(func $add (param $a i32) (param $b i32) (result i32)local.get $alocal.get $bi32.add)(export "add" (func $add))
)
这是一个简单的加法函数,接收两个 i32
整数,返回它们的和,并通过 export
导出。
4.4 编译 .wat 为 .wasm
wat2wasm add.wat -o add.wasm
成功后看到生成的 add.wasm
二进制文件,浏览器可以直接加载它。
4.5 编写 HTML 页面(index.html)
<!-- 文件:index.html -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>WebAssembly 加法演示</title>
</head>
<body><h1>WebAssembly 示例:3 + 4 = <span id="result">?</span></h1><script src="main.js"></script>
</body>
</html>
4.6 编写 JS 加载逻辑(main.js)
// 文件:main.jsasync function initWASM() {const response = await fetch('add.wasm'); // 从服务器加载名为 add.wasm 的 WebAssembly 文件const bytes = await response.arrayBuffer(); // 将响应内容转换为 ArrayBuffer(二进制)const { instance } = await WebAssembly.instantiate(bytes); // 实例化 WebAssembly 模块,获取模块实例const result = instance.exports.add(3, 4); // 调用导出的 add 函数,传入 3 和 4document.getElementById('result').textContent = result; // 将计算结果显示在页面 id="result" 的元素中
}initWASM(); // 执行函数,初始化并调用 WASM 模块
说明:
-
fetch()
加载.wasm
文件 -
WebAssembly.instantiate()
编译 + 实例化 -
调用导出的函数
add(3, 4)
-
显示结果到网页
4.7 运行本地服务器测试
浏览器无法直接读取本地文件的 .wasm
,必须通过 HTTP 服务运行它。
推荐方法:使用 Python(快速)
# Python 3.x
python -m http.server 8080
然后访问:
http://localhost:8080
如果一切成功,网页上会显示:
WebAssembly 示例:3 + 4 = 7
4.8 小结
步骤 | 内容 |
---|---|
1 | 编写 .wat 文件 |
2 | 使用 wat2wasm 编译 |
3 | 写 HTML 页面结构 |
4 | 用 JS 加载 .wasm |
5 | 使用本地 HTTP 服务运行 |
相关文章:
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南
🚀 C extern 关键字深度解析:跨文件编程的终极指南 📅 更新时间:2025年6月5日 🏷️ 标签:C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言🔥一、extern 是什么?&…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...

SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...