Facebook 从 Java 到 Rust | Buck 的未来
Buck 是 Facebook 在 2013 年的Facebook Mobile DevCon上亮相的一个快速的 Android 构建系统。从那时起,它已经扩展到支持用15种以上的语言编写的应用程序,目标平台包括手机、服务器、智能设备和VR头盔等等。不过,随着时间的推移,Buck并没有跟上这种功能和灵活性的增长,没有进行必要的架构改变和改进来管理这种复杂性。随着Facebook内部和外部开发新的功能,发现这导致了巨大的实施复杂性,对核心和语言规则进行修改的挑战越来越大。虽然该团队在近4年前就开始了一项举措,逐步对 Buck 进行一些这样的跨领域的架构改进,但这些改变是非常困难的。 所以,从2020年开始,该团队开始构思,如果从零开始构建 Buck 会怎么样?怎样才能写出一个可以在未来10年或20年中继续扩展的构建系统?以下是Facebook团队的思考
- https://developers.facebook.com/blog/post/2021/07/01/future-of-buck
- 翻译from rust社区--张汉东
Rust错误处理项目组正在朝着什么方向努力
rust错误处理项目组要解决的第一个挑战是在reporte错误时很容易丢失上下文,eg:
use std::fmt;
// We have a program that loads a config and expects that
// loading the config will always succeed.
fn main() {
let _config = load_config()
.expect("config is always valid and exists");
}
// We have a dummy implementation of load_config which
// always errors, since we're just focusing on diagnostics
// here.
fn load_config() -> Result<(), Error> {
Err(Error(SourceError))
}
// And we have an error type that just prints "invalid
// config" and has a source error which just prints "config
// file does not exist"
#[derive(Debug)]
struct Error(SourceError);
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("invalid config")
}
}
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
Some(&self.0)
}
}
#[derive(Debug)]
struct SourceError;
impl fmt::Display for SourceError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("config file does not exist")
}
}
impl std::error::Error for SourceError {}
我们实际获得的:
$ cargo run
thread 'main' panicked at 'config is always valid and exists: Error(SourceError)', main.rs:4:33
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
当我们运行它时,我们更希望看到类似这样的输出:
$ cargo run
thread 'main' panicked at 'config is always valid and exists', src/main.rs:4:33
Error:
0: invalid config
1: config file does not exist
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
在这个错误消息中,我们可以看到程序因为panic而退出。我们可以看到通过访问的错误链中每个错误找到错误源. 项目组希望这些更改将显着改善Rust错误处理的体验,这使错误报告更加一致和灵活,并让最终的应用程序开发人员定义他们自己的格式化错误报告。错误处理的工具将更紧密地集成到标准库和语言本身中,通过更普遍地对Error特征进行标准化为嵌入式生态系统带来额外的好处
- https://blog.rust-lang.org/inside-rust/2021/07/01/What-the-error-handling-project-group-is-working-towards.html
在 Rust 中使用'wasmi'轻松托管wasm模块
我们一直在Web浏览器中托管WebAssembly模块,但这并不托管的唯一的方法。我们可以用Rust程序在Web浏览器之外托管wasm模块。博文介绍了如何做到这一点
- https://blog.knoldus.com/hosting-wasm-modules-in-rust-easily-using-wasmi/
RFC 3107 即将被合并 | 允许枚举类型使用
#[derive(Default)]
enum Option<T> {
#[default]
None,
Some(T),
}
- https://github.com/rust-lang/rfcs/pull/3107
From 日报小组 北纬27度 侯盛鑫
社区学习交流平台订阅:
评论区
写评论还没有评论