Rust如何扩展?扩展限制通常取决于通信和分发机制的可用性。至于通信机制,基于消息传递和每个进程垃圾收集和ETS的Erlang模型是否比Rust拥有单一所有权和共享变异的渠道更有效率是值得商榷的。
在Erlang中,任何消息都可以通过复制发送到所有其他进程。垃圾收集器在发送和接收过程中都进行了大量清理工作。而另一边,Rust的渠道是多个生产者和单一消费者。这意味着如果消息发送给消费者,则不会将其复制并将其所有权转移给消费者。然后,消费者在其范围的末尾注入清除代码以回收这个值。通过为所有通道克隆这个值,可以向多个消费者发送相同的消息。在某些情况下,Rust的所有权模型与可预测的内存清理相结合可能会比Erlang的垃圾收集更好。
通信的另一个重要方面是共享突变。从理论上讲,Erlang:的ETS与联合使用Rust共享突变与互斥体和引用计数类似。但是,尽管Rust具有非常细粒度的突变单位,它就像Rust变量一样小,但Erlang的ETS中的突变单位处于ETS表级别。另一个重大差异是Rust缺乏内置的分配机制。
在Rust中是如何���发的?Rust线程默认为本地线程。操作系统使用自己的调度机制来管理它们,因此它是操作系统的属性,而不是语言的属性。拥有本机操作系统线程可以显着提升网络,文件IO,加密等操作系统库的性能。或者,您可以使用一些绿色线程或自带调度程序的协同库,你可以有足够的选择。不幸的是,目前还没有稳定的crate。Rayon是一个数据并行库,它实现了一个工作窃取(work-stealing )算法来平衡本地线程间的负载。
Rust是如何做内存管理的?正如所讨论的,它使用所有权和生命周期的概念进行了大量静态分析,以确定哪些变量可以分配到堆栈以及哪些分配到堆。Rust在这里有一件事做得很好,它尝试在栈上分配尽可能多的数据,而不是在堆上。这在很大程度上提高了内存读取/写入速度。
垃圾收集是怎么做的?如上所述,Rust在编译时标记并确定变量的生命周期。此外,Rust使用的大多数变量都倾向于存在于堆栈中,这更易于管理。在Erlang中,垃圾收集器必须在给定的时间间隔内触发,以便在整个堆中查找未使用的数据,然后释放它。在允许共享引用的语言中,如果没有任何警告,这会变得更加困难,例如Java。垃圾收集持续时间的可预测性很难在这些语言中实现,Java的可预测性比Erlang低,而Rust的可预测性比Erlang更高。
容错是如何工作的?Rust本身没有内置的机制来识别运行时失败并从中恢复。Rust通过Result和Option类型提供了基本的错误处理,但这不能保证永远都能处理每个意外情况,除非您的语言中嵌入了运行时错误管理框架。Erlang在这一点占了上风,通过贯彻使用其监督框架和热代码加载它可以提供至少五个九的正常运行时间。Rust要做到这一点还得再加把劲儿才行。
结论Erlang和Rust在各自的领域都很强大。Erlang已经存在有很长一段时间了,并且在可扩展性、并发性、分布和容错方面已经证明是一个强大且行业就绪的生态系统。Rust具有自己定义的特性,如能在低层次运行且具有可利用本地性能的高级语言特性,安全编程以及常见特性(如并发支持和针对错误处理的规定)。