知乎 Rust 圆桌年话专题问答精选

编辑:张汉东

在牛年春节期间,我在知乎发起 Rust 语言圆桌年话 | 关于 Rust 语言基金会成立,你有什么想说的呢?


关于 Rust 语言基金会成立,你有什么想说的呢?

@韩朴宇:

链接:https://www.zhihu.com/question/443595816/answer/1734191236
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

华为在创始成员中既惊讶又感到正常,因为并没有听说华为在rust项目上的投资(其他4个成员公司存在大量的Rust项目组成员),但是华为也有Rust写的产品,比如StratoVirt。StratoVirt 是华为的企业级Linux操作系统EulerOS的开源版openEuler旗下的一个项目,是一个基于Linux KVM的虚拟机StratoVirt兼容QEMU的QMP API,同时支持x86和鲲鹏arm处理器,并且使用virtio半虚拟化设备接口。除了华为的StratoVirt, 还有一些Rust编写的虚拟机。最早的应该是Google的crosvm (cros是ChromeOS的缩写),这个虚拟机管理器是为了在ChromeOS上运行一个单独的Linux虚拟机而设计的(即Crostini 计划)。

ChromeOS是一个类似于Android的系统,其系统分区是只读的,使用A/B分区的方式无缝升级,并且使用单独的用户数据分区。但是不同于Android高度定制化的用户空间,ChromeOS的用户空间就是用Gentoo Linux的包管理器Portage编译出来的,因此ChromeOS是一个标准的GNU/Linux系统。但是Google认为直接在该系统上运行任意的Linux程序会损害ChromeOS的安全性,因此在ChromeOS上运行一个轻量级虚拟机来运行一个命令行版的ChromeOS, 该系统可以运行LXC容器,默认的容器是Debian。Google认为这样套娃下来,既可以运行普通的Linux程序,又不会产生安全性问题。crosvm的特色是实现了一个基于virtio的Wayland总线,可以将虚拟机的Wayland/Xwayland程序的窗口直接穿过虚拟机的界限绘制到主系统的Wayland合成器上。使用最广的应该是AWS的 firecracker-microvm/firecracker ,AWS已经将其用于生成环境。此外还有Intel的 cloud-hypervisor/cloud-hypervisor,不仅支持x64, 而且像前3者一样也支持ARM64,而且还支持Windows 10。Rust在KVM上的生态离不开rust-vmm项目,该项目提供了对KVM api的绑定,该项目带起了整个Rust虚拟机的生态。

@iyacontrol:

链接:https://www.zhihu.com/question/443595816/answer/1723079060
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

首先恭喜Rust有了好爸爸,而且不止一个。而且可以预见不久的未来,IBM、阿里云、腾讯云等大厂也会加入进来。有了这么多的好爸爸的加持,小伙伴们可以放心大胆地用Rust了,不用再担心Rust被砍掉了。通过基金会的成员来看,除了亲爸爸Mozilla,其他member大多都和云有关系。可以得出两点:Rust 的安全性和不差的性能,适合用来写一些偏底层的软件,比如各种运行时。而且也得到了大家一致的认可。Rust 将在云原生领域大放异彩了。目前来看,很有可能和Golang相互配合,Rust负责底层部分,Go负责中间部分,共同服务上层各种语言的应用。另外,感谢Mozilla的不为五斗米折腰,没有让Rust走了Java的路。如果Rust卖给类似于甲骨文的公司,那么Rust的前景就不好说了。

@最帅的物理课代表:

链接:https://www.zhihu.com/question/443595816/answer/1734618924
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

虽然我是老华为黑粉了,但是其实很开心能看到华为在创始人名单之列。rust语言是很有前途的语言,这几乎是业界共识。华为有自研的容器项目,采用rust语言编写,这是一个很有意义的作品,比hm系列高到不知道哪里去。我们能通过这些看到华为的决心和勇气。同时这也很能带动国内的其他互联网企业,一起为rust投入更多精力,也给全球的rust社区添砖加瓦。我国的互联网发展和欧美一些国家一直都有较大的差距。但是众所周知,我们的传统艺能就是弯道超车。

还有很多回答,可以去知乎查看。


您对 2021 年的 Rust 语言有哪些期待?

@韩朴宇:

链接:https://www.zhihu.com/question/438833112/answer/1673155747
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我在rustbuild(即src/bootstrap)上提过几个pr,因此说几个和rustc相关的(或者说和语言无关的工程问题)。

  1. cranelift以及rustc_codegen_cranelift可以大大加速debug build,test,proc_macro和build.rs的速度,结合jit模式,可以实现以接近cargo check的速度同时检查语法错误,借用检查错误和逻辑错误。目前cg_clif已经进入rust仓库,在SYSV abi,Windows ABI,原子操作,内联汇编,SIMD上还有一些问题。cg_clif是由一位开发者bjorn3单枪匹马写出来的,很厉害。另外新的asm!内联汇编宏不再使用llvm_asm的语法,就是因为有朝一日rustc会集成上全功能的rust编写的后端。由Inline Assembly project group开发

  2. std aware cargo也就是 cargo -Z build-std,这个功能在优化二进制大小上很有用,在操作系统开发上是必需品。由std Aware Cargo working group负责。

  3. core::error::Error, core::io::Errorbacktrace支持这是Error handling project group的工作重点,目前已有demo可用。有了这个wasm,嵌入式和操作系统开发也可以用常用的错误处理库了。

  4. chalk 。trait 系统的改进全靠这个,包括GATtraits working group负责为什么我的期待都有working group,因为这就是rust项目的治理方式,没有working group的东西就肯定是没戏的,至少一年内是如此。比如取一个稳定的abi,作为rust abi和c++ abi的子集和C abi的超集,已经吵了好几年了,估计今年也是没戏。

@Nugine:

链接:https://www.zhihu.com/question/438833112/answer/1672070201
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

min const generics 将于 1.51 稳定,大约3月底,可以解锁一些较为常规的设计方法。

GAT 仍然是我最期待的有生之年的特性,它与 async trait, monad 之类的东西相关,能派生出很多魔法设计。

async-std 1.8tokio 1.0,希望更多常用的库不再犹豫,赶紧1.0。

希望 tracing 加快速度到 0.2,异步上下文追踪就指望它了。

生态中很多常见领域都已经有了至少一两个占主导地位的库,但还需要打磨。希望做到商业级、工业级可用。

希望 2021 Rust 多出一些杀手级产品,最好是国产的。

@dontpanic:

链接:https://www.zhihu.com/question/438833112/answer/1673710125
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

我比较没出息,我只想要糖…… 最想要的几个:

  1. arbitrary_self_types(p.s 这个例子并不是必须使用arbitrary self types,使用 associate function可以有同样的效果,参见评论区)真的好用,已经离不开了。

目前能用做 Self 类型的,只有 self/&self/&mut self/Box<Self>/Rc<Self> 等几个类型。 Arbitrary self types 允许使用任意 Deref 到 Self 的类型用作 self。有什么用呢?比如,我想扩展下面的


#![allow(unused)]
fn main() {
Base:trait Derived {
    fn foobar(&self);
}

struct Base<T: Derived> {
    ext: T,
}

impl<T: Derived> Base<T> {
    fn foo(&self) {
        self.ext.foobar();
    }

    fn bar(&self) {
        println!("bar!");
    }
}

struct DerivedImpl {
    base: Weak<RefCell<Base<DerivedImpl>>>,
}

impl Derived for DerivedImpl {
    fn foobar(&self) {
        self.base.upgrade().unwrap().borrow().bar();
        println!("foobar!");
    }
}
}

这样的实现就会强制 base 必须以使用 Rc 的方式使用,并且要小心多次 BorrowMut(很容易发生,要么就需要 Derived 提供 interior mutability)。或者也可以在 trait Derived 的函数参数里面把 base 传进去,但是有点 verbose。当然也可以说这种设计不够 rust idiomatic...不过有了 Arbitrary self types 之后,世界就清爽了。

首先实现一下deref/deref_mut


#![allow(unused)]
fn main() {
impl<T: Derived + 'static> Deref for Base<T> {
    type Target = T;

    #[inline(always)]
    fn deref(&self) -> &T {
        &self.ext
    }
}

impl<T: Derived + 'static> DerefMut for Base<T> {
    #[inline(always)]
    fn deref_mut(&mut self) -> &mut T {
        &mut self.ext
    }
}
然后 Derived 可以直接:trait Derived : 'static + Sized {
    fn foobar(self: &mut Base<Self>);
}

struct DerivedImpl {
}

impl Derived for DerivedImpl {
    fn foobar(self: &mut Base<Self>) {
        self.bar();  // !!!!!
        println!("foobar!");
    }
}
}

多了 'static + Sized,但也可以接受。

  1. let_chains_2,啥也不说了,羡慕 Swift。

  2. 标准库里面有很多 unstable 的函数,经常会一用上来发现还是 unstable 需要开 feature。自己的项目随便开开倒是无所谓,但生产环境必定要谨慎的多。希望能够尽快 stable,比如 drain_filter。

longfangsong:

链接:https://www.zhihu.com/question/438833112/answer/1674659637
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。    

其他答主说的已经很好了,尤其是语言设计上的(GAT什么的大家都久等了),我再补充几点:

语言设计:

  1. 看Rust Internals的时候看到的一个感觉有点意思的idea:更细粒度的unsafe。
  2. 看到前面有人说的enumerate variant as type,我想要的一个和这个比较像的一个糖是 Typescript 那样的 (untagged) union type,目前我习惯是用enum_dispatch crate来部分模拟这个特性。

工具方面的:

  1. IDE支持,CLion 现在index不了编译时生成的代码(即使开了RA也一样)。vsc可以但是RA有时会莫名其妙地hang住。
  2. 能不能修修cargo[patch] 只认repo的url而不管rev的问题,即cargo#7497
  3. 求编译能再快一点……编译产物能再多复用一点……

社区建设方面:

  1. 现在感觉很多还没有入门rust的人都被它“传言中”的难度吓到了,实际上rust也就是一门普通的语言,可能所有权检查、强制性的线程安全这些特性确实是别的语言没有的,但掌握这些特性其实也不比掌握指针之类的概念困难,还有其实很多看着很长很可怕的写法(Option<Rc<RefCell>>>)虽然第一眼看上去劝退实际上却更合理更可读(分离了是否可空、是否多个所有者、是否可变三个关注点,相比其他某些语言一个指针走天下其实更容易分析)。其实宣传的时候可以更多的去给新人一种rust并不难的印象,可以更好地壮大社区。
  2. 有没有入口可以给rust foundation捐钱啊(x

还有很多回答,可以去知乎查看。


还有很多精彩的问题等待你的探索和回答: