3 个版本
0.1.2 | 2022年4月17日 |
---|---|
0.1.1 | 2022年4月16日 |
0.1.0 | 2022年4月16日 |
#413 in 数学
145KB
3K SLoC
arranged
A Rust ranged-type 库。
arranged
是 Rust 的范围类型 crate。注意:此 crate 目前处于预 alpha 阶段,仍在建设中。
目标
arranged
是一个探索性实现,用于 Rust 中的安全默认算术值操作——任何算术操作都不应因运行时溢出而失败(panic)(除非用户明确请求 panic)——同时通过传统的算术运算符(+
,-
,*
,/
,%
等)来支持易用性。
设计哲学
范围类型尽可能以零运行时开销设计,否则以最小运行时开销设计
- 两个未包装的范围类型之间的所有算术操作边界检查都发生在编译时
mem::size_of::<Ranged<T>>() == mem::size_of::<T>()
(即范围是零大小的)。性能和缓存友好,尤其是在处理大量值时
行为
Ranged<T>
{op}Ranged<U>
产生Range<V>
并在编译时进行边界检查(其中 {op} 代表一个算术运算,而T
,U
和V
代表相同机器字类型的值范围)。任何可能的溢出都会导致编译失败。Ranged<T>
{op}*Wrapper<Ranged<U>>
生成Ranged<T>
,运行时进行范围检查并按照*
策略处理溢出,其中*
是检查、溢出、恐慌、饱和或包装溢出策略之一。Ranged<T>
{op} {标量} 因为策略未指定而无法编译Ranged<T>
{op}*Wrapper<{标量}>
生成Ranged<T>
,运行时进行范围检查并按照*
策略处理溢出- {标量} {op}
Ranged<T>
因为策略未指定而无法编译 - {标量} {op}
*Wrapper<{标量}>
生成*Wrapper<{标量}>
,运行时进行范围检查并按照*
策略处理溢出 - {标量} {op}
*Wrapper<Ranged<T>>
生成*Wrapper<Ranged<T>>
,运行时进行范围检查并按照*
策略处理溢出 *Wrapper<Ranged<T>>
{op}Ranged<U>
生成*Wrapper<Ranged<V>>
,编译时进行范围检查并按照*
策略处理溢出*Wrapper<Ranged<T>>
{op}†Wrapper<Ranged<U>>
生成*Wrapper<Ranged<T>>
,运行时进行范围检查并按照*
策略处理溢出。† 策略被忽略。*Wrapper<Ranged<T>
{op} {scalar} 生成*Wrapper<"Ranged<T>>
,运行时检查边界,并根据*
策略处理溢出。
实施计划
-
统一现有的 Rust 算术溢出策略在算术特性下 + 添加Panicking
策略 (arith_traits) -
建立一个算术 *Wrapper 类型的一个初始实现 (arith_wrappers) 以支持快速 PoC -
设计和实现一个初始的 Range 静态边界可验证、零大小的整数类型,解决快速 PoC 的关注点 1、2 -
设计和实现 Ranged 类型,将范围和值的概念合并为单一类型 - 实现一个 Ranged 算术运算,涵盖上述所有变体,包括和不包括一个包装类型作为 PoC。
- 验证实现是零运行时开销或在发布模式下低运行时开销
- 扩展 pathfinder 实现以支持 f32 和 f64
— !! pathfinder 完成 !! — 如果成功
- 实现剩余的 arith_traits
- 实现剩余的 arith_wrappers
- 为
Ranged<Ri*>
(其中Ri
是arranged
的范围包含类型,*
表示任何 int 和 float 机词类型或BigInt
或BigUint
) 实现剩余的算术运算符 - 实现 R (半开范围) 类型
- 为
Ranged<R*>
(其中R
是arranged
的 (半开) 范围类型,*
表示任何 int 和 float 机词类型或BigInt
或BigUint
) 实现剩余的算术运算符 - 考虑实现额外范围类型的优先级(JIT/按需基础?)
arranged
解决了什么问题?
Rust 已经取得了巨大的进步,在保证安全和正确性的同时没有牺牲性能。然而,我们仍然背负着 20 世纪 70 年代初 C 的算术模型,该模型在重要的现实世界安全性场景中提供可预测行为的能力非常差--Ariane 5 初始发射、分析。
随着软件越来越多地占据世界,高性能、易用、默认安全的系统的意义日益增加。
arranged 之外
探索利用 arranged 作为 Rust 中更全面的 “语义类型” 实现的一部分,希望进一步解决诸如 NASA 失去 3 亿美元以上的任务 的安全问题
用法
// Create a `u8`-based `RangeInclusive`-style type limited to `1..=100`, set to the value 42
let my_ranged_value = Ranged::<RiU8<1, 100>>::from(42);
有关更多示例,请参阅 ranged::unit_tests
。
许可
许可方式任选
- MIT 许可证(见 LICENSE-MIT 文件)
- Apache License,版本 2.0(见 LICENSE-APACHE 文件)
贡献
除非您明确说明,否则您有意提交供作品包含的贡献将双许可如上,不附加任何额外条款或条件。
依赖项
~0.8–1.3MB
~29K SLoC