< 返回版块

ChaosBot 发表于 2018-07-20 09:51

Tags:rustnews

Ripgrep开启多行搜索功能

原文


关于CTFE和类型系统的思考

CTFE(Compile-Time Function Evaluation),是指编译时函数求值,直白地说,是编译期执行代码。比如,知道了数组的大小如何在编译期计算其内存布局。

从Rust1.26以来Rust引进了CTFE,因此引发了一系列CTFE期间应该允许哪些操作的探讨。这篇文章是从类型系统角度对这些讨论的看法。

CTFE仅用于const的值或者是数组长度

rust fn demo() { const X: u32 = 3 + 4; // CTFE let x: u32 = 4 + 3; // no CTFE }

CTFE需要考虑的问题(要点总结):

  • const安全,并非所有操作都可以在CTFE上下文使用 ,所以需要考虑以下问题:

    • CTFE必须是确定的,也就是说,不能存在歧义,否则会计算错误。
    • const fn 之所以存在,是为了满足在CTFE上下文中调用指定的函数。const fn 关键字可以让编译期识别,以便和普通的fn区分。
  • const类型系统和健壮性

    • const类型系统不允许CTFE调用非const函数
    • CTFE不能支持指针,因为在编译期需要合法有效的值,指针无法保证
  • CTFE的正确性

    • Rust中CTFE是由miri来执行的,miri是一个mir解释器,已经集成到了rustc中
    • miri执行const上下文的代码,并且目前,拒绝原始指针的所有操作。但是未来还会计划修改miri来让它执行更多的操作。
    • CTFE的正确性是指编译期求值和运行时的表现完全一致。但是目前CTFE对于浮点数的计算比较困难。
  • CTFE与Unsafe(假如扩展miri来支持unsafe,需要允许哪些操作?)

    • CTFE目前已经实现了以确定的方式支持内存分配
    • 允许引入 const-unsafe来操作原生指针,也就是说,把const上下文也分为safe和unsafe两个区域
  • 静态提升(Static Promotion)

    • 比如,fn make_a_3() -> &'static i32 { &3 } 返回值 包含的&3会被提升为一个静态值,从而编译通过。
    • 应该只允许遵循const-well-type的值进行静态提升,比如&3可以提升,而*const T不行
    • 要保证CTFE的正确性

看来,CTFE还有很长一段路要走啊,想利用miri来检测unsafe中的UB比我想象中困难

原文


对Rust crate依赖的理论化研究

这个仓库里包含了一篇论文,研究了依赖的兼容性

原文


用Rust的impl块来玩单射(injection)和满射(surjection)

对于 y=f(x)

  • 单射(injection):每一个x都有唯一的y与之对应
  • 满射(surjection):每一个y都必有至少一个x与之对应

原文


Podcast:Steve Klabnik 访谈: Rust与并发

原文


Arch: 使用rust和webassembly为3w个Led彩灯制作动画

Lin Clark在jsconf上面的演讲视频

原文


评论区

写评论
slanterns 2018-07-21 14:07

https://rust-lang-nursery.github.io/futures-rs/blog/2018/07/19/futures-0.3.0-alpha.1.html

1 共 1 条评论, 1 页