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

关于 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。

浏览器支持版本(最低)是否默认开启
Chrome57+ 是
Firefox52+ 是
Safari11+ 是
Edge(旧版)16+ 是
Edge(Chromium)所有版本 是
Node.js8+ 是

检测支持的方法:

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 formatWebAssembly 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 可互转通过官方工具如 wat2wasmwasm2wat

示例 .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-packRust 生成 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 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;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模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 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&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点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供电系统绝缘监测及故障定位解决方案

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

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

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

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

在鸿蒙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通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

uniapp中使用aixos 报错

问题&#xff1a; 在uniapp中使用aixos&#xff0c;运行后报如下错误&#xff1a; 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文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 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的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...