「SO问答」既然两个可变引用不能别名为啥Rust编译器没有对其进行优化

#Rust #stackoverflow

该问题的作者描述,比如C代码中:

void adds(int  *a, int *b) {
    *a += *b;
    *a += *b;
}

两个指针a和b有可能互为别名(俩指针指向同一数据),所以clang在编译该代码的时候,会在寄存器中存储两次(%rsi),%eax来防止这种情况。当然也可以使用restrict关键字来对参数进行约束,显式地告诉编译器这俩指针不可能互为别名(但在C语言中,restrict关键字仅仅是告诉编译器可以优化,它不会帮助开发者进行检查,也就是说,很可能因为开发者没有遵循此契约而引发未定义行为)。从而生成的优化代码中只存储一次寄存器。

但是作者发现在Rust中虽然有编译器检查,两个可变引用不存在互为别名的情况,但是编译器并没有因此而进行任何优化:

#![crate_type = "staticlib"]
#[no_mangle]
fn adds(a: &mut i32, b: &mut i32) {
    *a += *b;
    *a += *b;
}

所以他比较担忧,是不是在Safe Rust之下也可能存在别名?

该贴的回复给出了答案:

Rust最初启用了LLVM的noalias属性,但这导致了非预期的编译结果(算是LLVM的一个Bug,等issues 54878修复以后就正常了)。现在也可以使用-Zmutable-noalias=yes参数进行编译就能得到预期结果。

  • Read More
  • issues/54878

「学术」使用类型化指针反转进行高效析构

#TypedPointerReversal #paper

HAL INRIA貌似是法国国家信息及自动化研究院。该论文提出了ML风格编程语言的资源管理模型,旨在兼容OCmal理念和运行时模型,提议使用析构函数扩展OCmal,在系统编程所有权和借用模式之上来提升OCmal的安全性、效率。

没错,借用了Rust/C++中的一些概念。感兴趣的可以看看,对资源管理应该会有深入的了解。

该组织已经发布了多篇关于Rust研究的论文了。

Read More

Python和Rust实现神经网络

#NeuralNetworks

这篇文章是作者探索Rust是否适合数据科学的工作。他分别用python和rust实现了一个小型的神经网络,然后进行了性能测试,利用火焰图进行分析,最终得出一个结论:

  • 大部分时间都花在做线性代数上,不管Rust还是Python,所以使用Rust永远也不会有10倍的加速。
  • Python进行优化以后,性能可以提升两倍,Rust原则上可以进行相同的优化,但目前ndarray还不支持2维数据以上的矩阵乘法。
  • 作者认为,Rust目前还没有做好胜任数据科学的工作。未来还需要更完善的生态系统。

Read More

关于Rust依赖安全的最新思考

#RestSec

很高兴有人在帮我们思考这个问题:当一个crate依赖越来越多的crates时,我们有什么办法可以审计它们?

Read More

paperclip: OpenAPI的代码生成工具

#openapi #WIP

0.3发布,支持OpenAPI V2接口。

paperclip

rocket-lamb: 方便在aws lambda上面跑rocket的库

#rocket

rocket-lamb

async-injector: Rust的异步反应式依赖注入库

#async

新库,WIP状态。该库是从作者的另外一个项目OxidizeBot(高性能Twitch机器人)中提取出来的。

  • Read More
  • async-injector
  • OxidizeBot

「讨论」Rust如何实现代数效应

#AlgebraicEffects

看样子该贴作者是一个函数式粉丝。评论回复中有人用Rust实现了一个代数效应库effective-rust。

代数效应目前是一个学术/实验概念,它允许你通过使用类似于throw catch的机制来改变称为“效果”的某些计算元素(如函数调用,打印语句等)。

  • Reddit 讨论
  • effective-rust
  • Algebraic Effects相关文章
  • what-does-algebraic-effects-mean-in-fp

Debian Buster 将会预装Rust编译器

#Debian

2019年7月6日发布的Debian GNU/Linux 10 “Buster” 操作系统将预装Rust编译器。

rustdesk 定制编译_rustdesk 定制编译