< 返回版块

苦瓜小仔 发表于 2025-07-27 19:50

Tags:日报

This Week in Rust #609

阅读:https://this-week-in-rust.org/blog/2025/07/23/this-week-in-rust-609/

书籍《Rust 嵌入式驱动开发(RED)》

  • 学习如何用 Rust 创建自己的嵌入式驱动程序。
  • 为 DHT22 传感器创建一个简单的驱动程序,用于读取湿度和温度。
  • 使用 embedded-hal 特性,实现平台无关性。
  • 学习如何使用 embedded-hal-mock 进行测试。

阅读:https://red.implrust.com/

仓库:https://github.com/implFerris/red-book

v8-rust:用 Rust 重写 V8 引擎

我在用 C++ 为 Node 开发一个项目,试图构建一个原生多线程管理器时,遇到了一些(好吧,很多)问题。为了弄明白这些事情,我决定研究一下 V8。由于我那时也在学习 Rust(因为为什么不让自己生活更有趣呢?),我想:“如果我尝试把这想法移植到 Rust 上呢?”这就是我开始用 Rust 编写这个引擎的旅程。

以下仓库是我到目前为止取得的进展。注意:这并不是 V8 本身的重写或移植。这是一个全新的 JavaScript 引擎,完全用 Rust 从头开始构建,但受到了 V8 架构和理念的启发。所有代码都是原创的,所以如果你发现任何错误,你就知道该怪谁了!

仓库:https://github.com/wendelmax/v8-rust

Reddit:https://www.reddit.com/r/rust/comments/1m8iuha/im_rewriting_the_v8_engine_in_rust/

文章《从零开始构建编译器》

作者 Geoffrey Copin 分享了自己年轻时对软件制作的好奇,以及对编译器的探索。

文章介绍了编译器的基本概念,即它是一种将高级代码转换为机器代码的程序。

作者计划在系列中逐步构建一个将极简语言 Pylite 编译为 x86 汇编代码的编译器。

文章还简要介绍了编译器的高级架构,包括解析器、语义分析器、中间表示生成器、优化器和代码生成器等阶段,并解释了前端和后端的概念。

阅读:https://blog.sylver.dev/build-a-compiler-from-scratch-part-0-introduction

Reddit:https://www.reddit.com/r/rust/comments/1ma1dar/build_a_compiler_from_scratch_in_rust_part_0/

文章《StackSafe:在 Rust 中驯服递归,避免栈溢出》

这篇文章介绍了 StackSafe,这是一个用于 Rust 的库,旨在解决递归算法中常见的栈溢出问题。通过使用 #[stacksafe] 属性,开发者可以轻松地将递归函数和数据结构转换为栈安全的形式,从而避免程序崩溃。StackSafe 通过自动扩展栈空间,使得递归函数和数据结构在处理深度嵌套或大规模数据时不会导致栈溢出。

栈溢出问题:

  • 递归算法虽然优雅直观,但容易导致栈溢出,尤其是在处理深度嵌套的数据结构(如 JSON 解析或树结构)时。
  • 标准 Rust 无法预测或处理这种栈溢出问题。

现有解决方案:

  • 手动转换为迭代代码:将递归算法改写为使用显式栈的循环,但这种方法在某些情况下(如数据结构转换、多递归调用协调或非尾递归模式)变得极其复杂或不可能。
  • 低级库:如 stackerrecursive,提供低级栈扩展机制和简化递归函数标注的宏,但存在局限性,例如必须手动为所有递归函数添加标注,并且派生的特质(如 DebugCloneDrop)在深度嵌套结构上仍可能引发栈溢出。

StackSafe:完整解决方案

  • 递归函数安全化:通过添加 #[stacksafe] 属性,将任何递归函数转换为栈安全形式。
  • 递归数据结构安全化:通过 StackSafe<T> 包装递归字段,自动实现栈安全的特质。
  • 调试时安全检查:在调试构建中,StackSafe<T> 会在访问包装值时检查当前函数是否正确标注了 #[stacksafe],帮助开发者在开发过程中识别潜在的栈溢出位置。
  • 现有代码的采用:将现有递归代码转换为栈安全形式非常简单,只需添加 #[stacksafe] 属性和 StackSafe<T> 包装即可。

示例

  • 递归函数
    #[stacksafe]
    fn tree_depth(node: &TreeNode) -> usize {
        match node {
            TreeNode::Leaf => 1,
            TreeNode::Branch(left, right) => {
                1 + tree_depth(left).max(tree_depth(right))
            }
        }
    }
    
  • 递归数据结构
    #[derive(Debug, Clone, PartialEq)]
    enum BinaryTree {
        Leaf(i32),
        Node {
            value: i32,
            left: StackSafe<Box<BinaryTree>>,
            right: StackSafe<Box<BinaryTree>>,
        },
    }
    

结论:StackSafe 消除了编写优雅递归代码与避免栈溢出之间的根本矛盾。它全面处理了递归函数和数据结构,让开发者能够专注于算法逻辑,而不是栈管理。StackSafe 的采用非常简单,只需在函数上添加 #[stacksafe] 属性,并在递归字段上使用 StackSafe<T> 包装即可。

阅读:https://fast.github.io/blog/stacksafe-taming-recursion-in-rust-without-stack-overflow/

仓库:https://github.com/fast/stacksafe

Reddit:https://www.reddit.com/r/rust/comments/1m830y9/stacksafe_taming_recursion_in_rust_without_stack/

--

From 日报小组 苦瓜小仔

社区学习交流平台订阅:

评论区

写评论

还没有评论

1 共 0 条评论, 1 页