不堪回首的往事
七八年前,我自认还是一名合格的C/C++开发者。后来涉及大数据处理方向,被Python的魅力所吸引,大部分开发都使用Python进行,偶尔使用C写个链接库解决Python的性能瓶颈。
半年前,阴差阳错的接下了一个C/C++嵌入式开发的项目,开启了这段痛苦的经历。工期紧任务重,来不及充分的熟悉业务,就必须提交成果。C/C++对开发者的要求高,嵌入式设备的内存又少的可怜,写代码需要非常谨慎,七八年前的开发经验早已荒废,不足以支撑这个项目,种种原因交织在一起,注定了这个项目要走向失败。
要重拾C/C++,难度不小,这不是语法的原因,而是思想的原因。C/C++要求程序心中必须紧绷一根弦,时刻关注内存等使用情况。习惯了其他的语言,即便心里明白这一点,但做起来却着实不易。
是时候考虑换一种语言,规避C/C++的顽疾。
选择的方向
之前在工作的闲暇里,也考虑过这个问题,当时简单了解了一下Go和Rust。这二位都有一个NB的老爹,最近几年里发展的很快,双双进入开发语言排行前20的序列。
Go
优点
Go语言的优点有很多,对于我而言,最看重下面这几条:
- 简单易学
- 简单高效的并发
- 丰富的标准库
- 开发者效率高
- 编译时间短
缺点
Go语言的缺点也不少,但下面这几条,是我无法接受的:
- Go语言性格倔强,狂妄自大:Go是名符其实的官二代,很霸道,虽然有很大的社区,但Go从来不听社区的声音,坚持自己的观点,连花括号的书写方式都要进行限制,像特朗普一样蛮不讲理。
- Go 语言通过函数和预期的调用代码简单地返回错误,没有好的错误处理策略。
基于以上两点,我决定不使用Go语言。
Rust
优点
Rust的很多优点也被圈内人士津津乐道,我最看重如下几点:
- 与众不同的内存管理:与其他语言基于垃圾回收的内存管理不同,Rust采用所有权、引用借用、生命周期的内存管理方式,这是世界上独一无二的管理方式,它可以0开销的解决内存管理的各种问题。
- 强大的编译器:Rust的编译器设计理念与Go完全不同,Go为了编译速度快,不惜牺牲很多错误的检查,而Rust的编译器可以发现代码中几乎所有的问题并给出非常人性化的提示。强大的编译器与内存管理方式结合,号称只要编译通过,程序就不会因为内存问题崩溃。
- 与C/C++的obj完全兼容:Rust只有编译器,没有链接器,Rust的编译器可以将Rust代码编译为与C/C++完全兼容的obj文件,然后使用C/C++的链接器进行链接。这使得Rust与C/C++完美结合,已有的项目可以一个模块一个模块的替换C/C++的代码。
- 完整易用的工具链:Rust的工具链提供了从创建项目、包管理、编译、调试和方方面面,甚至连代码提示都有工具支持,这使IDE的实现变得极为容易,用vscode、sublime等工具稍加配置即可成为强大的开发工具。
缺点
世界上没有完美的语言,Rust也存在许多缺点:
- 陡峭的学习曲线:与Go相比,Rust学习难度高,尤其是其内存管理的方式,理解有些困难,但与C/C++相比,这不算什么。
- 生态还未完全建立:现在的Rust生态还不是很丰富,有些领域还没有很好的库支撑,好在它能与C/C++很好的结合,多多少少可以弥补库的不足。
结论
通过以上比较,我更喜欢用Rust来代替C/C++,做一些较为底层的开发工作。