文章《Specifying Rust via Desugarings》
这篇文章探讨了如何通过 “脱糖”(Desugaring) 这一核心思想来对 Rust 这样复杂的语言进行规范化定义(Specification)。作者 Nadrieril(Rust 类型团队成员)认为,与其直接定义 Rust 繁杂的表面语法,不如将其转化为一种更小、更简单的核心语言。
- 核心理念:表面 Rust vs. 核心 Rust
- 表面 Rust (Surface Rust):开发者编写的代码,包含各种便捷的语法糖(如
for循环、?操作符)。 - 核心 Rust (Core Rust):一个规模极小、语义明确的子集。
- 脱糖:定义从表面语法到核心语法的转换规则。通过这种方式,只需精确定义“核心 Rust”的语义,就能间接定义整个 Rust 语言。
- 脱糖作为规范化的优势
- 降低复杂度:规范编写者只需关注少数核心原语,而不必为每个复杂的语法特性编写数百页的说明。
- 确保一致性:通过将不同特性(如
if let和while let)脱糖到同一种match结构,可以自然地保证它们行为的一致性。 - 简化形式化验证:对于安全研究者来说,验证一个小型的核心语言比验证庞大的 Rust 编译器要可行得多。
- 文中提到的具体示例
for循环:可以完全脱糖为loop、match和对IntoIteratortrait 的调用。?操作符:脱糖为对Trytrait 的调用加上match和提前返回(return)。- 模式匹配 (
match):虽然复杂,但可以被拆解为更基础的“判定树”和对内存位置的原始测试。
- 实施中的挑战
- 诊断信息(Diagnostics):如果脱糖太彻底,编译器报错时可能会显示开发者从未写过的底层代码(如显示
IntoIterator的内部错误而不是for循环的错误)。规范化必须平衡“逻辑简洁”与“用户理解”。 - 循环依赖:有些特性互为基础(例如:某些脱糖需要 trait,而 trait 的定义又可能涉及其他需要脱糖的语法),必须小心定义脱糖的先后顺序。
- 性能与优化:某些高层抽象(如
Iterator)直接脱糖可能丢失编译器进行高阶优化的机会,因此核心语言仍需保留足够的语义信息。
- 与 Rust 官方规范的关系 该思路正被应用于 Rust 的官方规范项目(如 Ferrocene 和 PLRS)。作者认为,这不仅是编写文档的技术手段,更是理清 Rust 语言演进方向、确保未来新特性不会导致语义冲突的关键路径。
总结结论: 作者主张 “以简驭繁”。通过将 Rust 的高级特性还原为一组最小化的、定义严谨的基础构建块(Desugaring),可以使 Rust 变成一门在形式上更可预测、在标准上更易实现的语言。
阅读:https://nadrieril.github.io/blog/2025/12/18/specifying-rust-via-desugarings.html
FRAME:基于 Web/WASM 的音乐节奏工作站
Frame 是一款完全使用 Rust 编写、并编译为 WebAssembly (WASM) 在浏览器中运行的 Groove Machine(节奏工作站/音乐制作工具),结合了采样器、合成器和步进编排器。
核心技术栈:
- 语言:100% Rust。
- 前端渲染:使用了
wgpu进行图形渲染。作者提到他并没有使用现成的 UI 框架(如 egui),而是构建了自己的 UI 系统,以实现高度定制化的视觉效果。 - 音频处理:使用了 Web Audio API 结合
AudioWorklet。Rust 代码被编译为 WASM,在独立的高优先级音频线程中运行,以确保音频不会因为主线程的 UI 渲染而产生爆音或延迟。 - 数据交换:利用了
SharedArrayBuffer在主线程(UI)和音频线程之间高效传输音频数据。
主要功能点
- 内置引擎:包含一个采样器(Sampler)和一个频率调制(FM)合成器。
- 效果器:内置了延迟(Delay)、混响(Reverb)和多种滤波器。
- 编排能力:支持非线性序列编排,用户可以实时修改节奏和音色。
- Ableton Link 支持:作者提到他实现了 Ableton Link 的 WASM 移植版本,允许该网页应用与其他音乐软件进行同步(这在浏览器应用中非常罕见)。
社区讨论:
- 性能与延迟:作者强调 Rust 让他能够实现极低的音频延迟和稳定的 60FPS 刷新率。
- 开发动机:作者希望证明 WebAssembly 已经成熟到可以处理复杂的、实时性要求极高的专业音频生产任务。
- 浏览器兼容性:讨论中提到了该应用在 Chrome 和 Edge 上表现最好,而 Firefox 因为对
SharedArrayBuffer的限制可能需要特定配置。 - 开源/闭源状态:在帖子发布时,该项目是 闭源 的商业/个人实验项目,作者表示目前更倾向于将其作为一个完整的产品(frame.sh)来运营,而不是开源库。
社区反馈
- UI 评价:评论区对应用的视觉美感(尤其是发光效果和响应式布局)给予了极高评价。
- 技术惊叹:许多开发者对作者能将 Ableton Link 成功移植到 WASM 并实现如此顺滑的音频处理表示钦佩。
该帖子展示了一个由 Rust 驱动的、具有专业级性能和高颜值 UI 的在线音乐制作工具,证明了 Rust 在 Web 端处理高性能音频和图形的强大潜力。
Reddit:https://www.reddit.com/r/rust/comments/1pvtkea/frame_a_groove_machine_built_in_rust_compiled_to/
讨论: Axum 还是 Salvo?
- Axum:主流且稳健的选择
- 优势:由 Tokio 团队维护,拥有最强大的社区支持和生态系统。它基于
Tower服务模型,具有极高的组合性和稳定性。 - 劣势:追求极致的模块化,因此核心功能较为精简。许多常见的 Web 功能(如 OpenAPI/Swagger 自动生成、复杂的文件上传处理等)需要依赖第三方库(如
utoipa),有时会增加集成难度和配置成本。 - 适用场景:追求长期维护稳定性、需要深度定制、或希望利用 Tokio 生态系统优势的大型项目。
- Salvo:开箱即用的“电池完备”型框架
- 优势:被认为是 Rust 里的“Batteries Included”框架。它内置了大量常用功能(如 OpenAPI、WebSocket、JWT、文件上传等),且 API 设计参考了 Express.js 或 Flask,对新手或追求开发效率的开发者更友好。
- 劣势:社区规模较 Axum 小,虽然增长迅速,但在极端长期的维护预期上可能不如 Axum 这种“官方背景”框架。
- 适用场景:希望快速原型开发、不想在配置 Swagger 或处理基础件上耗费时间的开发者。
- 其他提及的替代方案
- Loco:讨论中多次被提到。它是一个基于 Axum 构建的、类似 Ruby on Rails 的全栈框架。如果你喜欢 Axum 的底层稳定性,又想要 Salvo 那种开箱即用的体验,Loco 是一个极佳的折中选择。
- Poem:另一个被称赞具有极好开发者体验(DX)的框架,功能也相对全面。
- Actix-web:虽然 Axum 目前更火,但 Actix-web 依然是追求性能极限和老牌稳定性的首选。
- 社区建议的决策标准
- 看重生态和职业通用性:选 Axum。
- 看重开发速度和内置功能(特别是 OpenAPI):选 Salvo。
- 想要“全家桶”式的开发体验(类似 Rails/Django):选 Loco。
- 最务实的建议:分别用两个框架写一个微型 MVP(最小可行产品),亲手体验其 API 设计和编译报错的友好程度,因为“开发者的直观感受”在 Rust 学习曲线中非常重要。
总结结论: 并没有“绝对更好”的框架。如果追求不出错的职业选择,Axum 是安全牌;如果你讨厌 Axum 的繁琐,Salvo 带来的开发体验提升是非常显著的。
Reddit:https://www.reddit.com/r/rust/comments/1pujc9e/how_can_i_choose_between_axum_and_salvo_in_late/
--
From 日报小组 苦瓜小仔
社区学习交流平台订阅:
评论区
写评论还没有评论