[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$fOUAD9PNSQPlaER3Juh65gmrr88btw_RhomC4VZiPDG4":3},{"item":4,"related":44},{"id":5,"type":6,"title":7,"slug":8,"summary":9,"body":10,"coverUrl":11,"productScreenshots":12,"productLinks":13,"authorName":14,"authorUrl":15,"authorSubject":16,"category":17,"tags":22,"sourceLabel":35,"sourceName":35,"sourceUrl":36,"status":37,"seoTitle":7,"seoDescription":9,"canonicalUrl":38,"isFeatured":39,"sno":40,"sortOrder":41,"publishedAt":42,"updatedAt":43,"createdAt":43},"4ce57934-2b23-41a1-800e-bb2d8ab36684","article","Wasm Component Model：不同语言写的模块怎样用同一套接口协作？","wasm-component-model-wit-interfaces","WebAssembly Component Model 用有类型的接口描述组件如何交换数据与调用功能，WIT 则帮助表达这些接口。本文用模块化电器说明跨语言组合的意义，也指出它不代表程序脱离运行时就能在任何环境原样运行。","一个项目可能用 Rust 编写图像处理模块，用 JavaScript 做界面，再用 Python 运行数据分析。传统上，不同语言之间要靠专门的绑定、进程通信或服务接口对接。WebAssembly Component Model 希望让模块以明确的类型接口组合起来；WIT 是描述这些接口的一种接口定义语言。\n\n## 从“能运行”到“能组合”\n\n核心 WebAssembly 模块提供可移植的执行格式，但单个模块的导入导出接口偏底层。Component Model 在模块外再定义组件边界，描述函数、记录、列表、字符串、资源等更丰富的数据类型，并规定调用方与被调用方如何交换这些值。适配层会在组件接口与底层 Wasm ABI 之间完成转换。\n\nWIT 像是组件之间的合同：一个组件声明自己需要什么功能、提供什么功能，以及输入输出是什么类型。构建工具可以据此生成不同语言的绑定，让实现语言不同的组件按同一接口协作。就像插座标准不要求电器内部电路相同，但要求插头尺寸和电压约定一致，组件接口也把实现细节与协作方式分开。\n\n## 接口标准化不代表到处都能直接运行\n\n组件仍需要兼容的运行时、编译工具链和宿主环境。若组件要访问文件、网络或系统时钟，宿主必须提供相应能力；不同运行时支持的提案、资源接口和安全策略也可能不完全一致。组件格式解决了接口描述与组合问题，却不会自动生成所有平台的设备驱动。\n\n类型兼容也不保证语义兼容。两个服务都接受同一结构，仍可能对单位、错误码、权限和生命周期有不同理解。因此，接口设计需要写清楚错误处理、资源所有权、版本兼容和安全能力。跨语言调用还可能带来数据转换开销，是否适合高频路径应实测。\n\nComponent Model 的价值，是把“每种语言都自己约定一套绑定”转化为可描述、可工具化的接口契约。它不是把所有程序魔法般变成通用二进制，而是提供一层更适合组合软件的标准边界，让运行时、工具链和开发者能围绕清晰契约协作。\n\n来源：[Bytecode Alliance：Component Model Concepts](https:\u002F\u002Fcomponent-model.bytecodealliance.org\u002Fdesign\u002Fcomponent-model-concepts.html)","\u002Fuploads\u002F2026-10-17\u002F0eb1c88d-dc1f-486d-8194-54f72dd215ec.jpg",[],[],"Foundit","https:\u002F\u002Ffoundit.cn","foundit-ai-editorial",{"id":18,"name":19,"slug":20,"description":21},"6179d3b6-dc34-4483-9ded-3cd9f1b37a47","科普","abbreviation","介绍各领域新兴概念",[23,27,31],{"id":24,"name":25,"slug":26},"144abe77-0dc6-4f66-a176-20bddb1c0bfa","编程","coding",{"id":28,"name":29,"slug":30},"a202d639-99a6-488a-a712-4d4c6ffd7e15","开发","dev",{"id":32,"name":33,"slug":34},"7c76bfc2-f80f-4ee0-a95d-27bd8708b434","技术","slug","Bytecode Alliance","https:\u002F\u002Fcomponent-model.bytecodealliance.org\u002Fdesign\u002Fcomponent-model-concepts.html","published",null,false,45,0,"2026-10-17T00:00:00.000Z","2026-10-17T03:08:52.474Z",[45,53,61],{"id":46,"type":6,"title":47,"slug":48,"summary":49,"coverUrl":50,"authorName":14,"sno":40,"publishedAt":51,"createdAt":52},"07fe8e6e-82b0-46cc-9015-c6d027564430","pidfd：进程号会被重用，怎样才能稳定指向一个进程？","linux-pidfd-stable-process-reference","Linux pidfd 用文件描述符稳定引用一个进程，避免退出后的 PID 被重用而误操作新进程。本文介绍它的等待、信号用途和版本边界。","\u002Fuploads\u002F2026-10-06\u002F699e59f8-693f-47cb-87b1-c51764d1a679.jpg","2026-10-06T00:00:00.000Z","2026-10-06T07:51:27.054Z",{"id":54,"type":6,"title":55,"slug":56,"summary":57,"coverUrl":58,"authorName":14,"sno":40,"publishedAt":59,"createdAt":60},"15988123-6303-4ab1-ba01-dcc41f36329f","Futex：Linux 的锁为什么大多数时候根本不需要进内核？","futex-fast-userspace-locking","Futex 把无竞争时的锁操作留在用户态，只有真正需要睡眠和唤醒时才进入内核，是 Linux 高性能锁的关键低层构件。","\u002Fuploads\u002F2026-09-26\u002F90e98cc8-e57b-4dea-afc7-2afe7550d483.jpg","2026-09-27T00:00:00.000Z","2026-09-26T16:25:54.119Z",{"id":62,"type":6,"title":63,"slug":64,"summary":65,"coverUrl":66,"authorName":14,"sno":67,"publishedAt":59,"createdAt":68},"69224a1f-e0fc-4431-a3bd-acc1d81523d0","io_uring：Linux 如何用两个环形队列批量处理异步 I\u002FO？","io-uring-async-io-rings","io_uring 通过提交队列和完成队列连接应用与内核，让大量 I\u002FO 请求可以批量提交与收取结果，减少固定交互成本。","\u002Fuploads\u002F2026-09-26\u002F0eb80204-5abc-41e2-8c8a-0e1ac633b209.jpg",46,"2026-09-26T16:25:57.069Z"]