导读:以下是选择 Rust 的原因,包括我们遇到的障碍,以及重写后的收益比例
Rust 已经悄然成为最流行的编程语言之一。
其作为一门新兴的系统语言,具有内存安全机制、接近C/C++的性能优势、优秀的开发者社区、工具链、IDE等诸多特点。
本文将介绍我们用 Rust 重写项目并逐步在生产环境中实现的过程,包括选择 Rust 的原因、遇到的问题和结果。
我们正在使用 Rust 开发的项目称为KCL。KCL是一种开源的基于约束的记录与功能语言。它通过成熟的编程语言栈改进了复杂配置的编写。它的目标是围绕配置构建更好的模块化、可扩展性和稳定性、更简单的逻辑编写,快速的自动化和良好的生态扩展性。
KCL项目之前是用Python写的。考虑到用户体验、性能和稳定性,我们决定用 Rust 重写,收获了如下益处:
Rust 强大的编译检查和错误处理,让Bug更少;
语言中端到端编译和执行性能提高 66%;
语言前端解析器性能提升20倍;
语言语义分析器的性能提升了 40 倍;
语言编译器在编译过程中的平均内存占有量是原来 Python 版的一半。
https: //github.com/Peefy/StackMachine
越来越多的编程语言编译器或运行时,尤其是前端基础设施项目,都在使用 Rust 编写或重构。此外,Rust还出现在基础设施、数据库、搜索引擎、网络、云原生、UI、嵌入式等领域,这些均验证了这个编程语言的可用性和稳定性。
考虑到后续项目开发还会涉及到区块链和智能合约方向,用户社区中大量的区块链和智能合约项目也都是用Rust写的。
通过 Rust 可以获得更好的性能和稳定性,使系统更易于维护和更健壮。同时可以通过FFI对外暴露C写的 API,实现多语言使用和扩展,方便生态扩展与融合。
Rust 用友好的方式支持 WASM。Rust 在社区中构建了大量的 WASM 生态系统。KCL 语言和编译器可以借助 Rust 编译成 WASM,并在浏览器中运行。
总结上述的原因,我们选择了 Rust 而不是 Go 语言。
特别是在整个重写过程中,我们发现Rust的综合素质确实非常优秀(主要是高性能和足够的抽象)。虽然在一些语言特性上有一定的学习成本,尤其是生命周期,但是它在生态上更加丰富。
from dataclasses import dataclass
class KCLObject:
pass
@dataclass
class KCLIntObject(KCLObject):
value: int
@dataclass
class KCLFloatObject(KCLObject):
value: float
rust
enum KCLObject {
Int(u64),
Float(f64),
}
例如,我遇到了 Rust 生命周期错误,如下代码所示。排查了半天,发现lifetime不匹配是因为忘记标注lifetime参数导致的。
此外,Rust 的生命周期与类型系统、范围、所有权和借用检查等概念相结合,导致理解成本高且复杂。错误报告信息通常不像类型错误那样明显。
生命周期不匹配错误报告信息有时是不灵活的,这可能导致高昂的故障排除成本。当然,熟悉相关概念后效率会提高。
struct Data < 'a > {
b: & 'a u8 ,
}
// func2 省略了生命周期参数,func2 没有。
// 默认情况下,Rust 编译器会将 func2 的生命周期推导为 '_,
这会导致生命周期不匹配错误。
impl < 'a > Data< 'a > {
fn func1 (& self ) -> Data< 'a > {Data { b: & 0 }}
fn func2 (& self ) -> Data {Data { b: & 0 } }
}
使用Rust的收获
几位团队成员花了数月的时间,使用Rust完全重写并稳定投入到生产环境。几个月后,我们回顾了整个过程,觉得有如下的收获。
从技术角度来说,rewrite 的过程训练了我们快速学习一门新的编程语言和编程知识并付诸实践。整个重写过程让我们反思KCL编译器的设计不合理,并进行修改。对于一门编程语言来说,这是一个长周期的项目。我们了解到,编译系统更加稳定安全,代码清晰,bug更少,性能更好。
虽然不是所有的模块都能得到40倍的性能(因为有些模块的性能瓶颈,比如KCL运行时就是内存深拷贝操作),我觉得还是值得的。而当Rust使用到一定时期后,心智和开发效率就不再是限制因素。
作者:高朋
参考资料
https://github.com/KusionStack/KCLVM
https://github.com/Peefy/StackMachine
https://doc.rust-lang.org/book/
https://github.com/sunface/rust-course
本文为 @ 万能的大雄 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。