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上面的演讲视频
1
共 1 条评论, 1 页
评论区
写评论https://rust-lang-nursery.github.io/futures-rs/blog/2018/07/19/futures-0.3.0-alpha.1.html