rust木们怎么进,试用Rust一个月之感想 (转载)
发布日期:2022-02-10 01:26:35 浏览次数:9 分类:技术文章

本文共 2157 字,大约阅读时间需要 7 分钟。

我从2003年起基于原先的C语言基础学习了C++,并作为科学计算用户使用C++超过10年时间。期间写过C with class、OO、C++ template等风格的C++程序,多年以来一直觉得C++写起来非常累, i.e., 心智负担过重。曾经多次考察过转向其它语言的可能性,期间调研过scala, Haskell, OCaml, Scheme, F#等,它们当然各有有缺点,但是C++的两个主要特性template(我用它来实现对不同数据类型的类似算法,起到了类似static duck typing的作用)和高运行效率使得之前转向其它语言的尝试均以失败告终。

Scala的类型系统据说很牛逼,但是无法实现C++中基于template的static duck typing,运行效率不合格,运行时太大,无法用在集群上(以科学计算为目标配置的集群,多基于mpi),由于类型擦除的存在导致generic不完善。

Haskell程序写起来非常简洁,但是有两个缺点我不喜欢:强行要求类型首字母必须大写、record语法的名字是全局的,而且要写出高效的程序,用户的水平必须非常高。同样没有static duck typing,即使它的类型系统非常牛逼。

Ocaml没有运算符重载, which对于科学计算程序来说非常重要,否则写起来非常罗嗦。

F#在linux上环境配置失败,遂放弃

直到我上个月开始接触rust,首先有几个特点很对我的胃口:尽管仍然没有可以直接实现static duck typing的template语法,但是由于其添加成员、实现trait都是非侵入性的,所以为一个数据类型添加行为并不需要修改库。这个特点使得它优于scala。同时它的基础库中为运算符重载所设计的几个trait是为各个运算符独立写的,比如说加法运算符是Add,减法是Sub, etc.这使得它在此方面的灵活性优于Haskell。反观Haskell,数学运算符是和数字type class绑定的,用户想要实现一个类似于Float的类型,需要实现整套运算符+常见函数,如果我想要一个能做加减乘除再加上一个对数,我还得连带实现sin, cos等一堆初等函数,即使我用不到它们,而且这几个函数的名字是全局的,带来诸多不便。

作为一个多年C++使用者,我认为使用Rust来完成科学计算有这么几个好处:

1. 非侵入式的实现trait的语法能实现接近C++ template的方便性,而且错误提示更加友好,不像C++ template,如果不实例化,错误是无法被发现的。

2. 依赖管理简单, cargo用起来非常简单,和同为包管理系统的jvm上的sbt和maven比起来,简单一个数量级,看看.toml,再看看sbt的配置文件,一目了然。

3. 有运算符重载,这使得rust践行C++的“实现对基础类型和用户定义类型尽量一视同仁”的理念成为可能。

4. 统一的错误处理模式,不像C++,由于历史原因,返回err code和抛异常共存,而且不同的库有不同的处理方法,导致使用外部库的时候存在不一致性。尽管对于科学计算程序来说不是个大问题,但是显然rust的处理更具美感。

5. enum和pattern matching太好用了,C++里面有一个match7库,由于语言本身不支持,导致其实现非常扭曲,反正我不会用。

6. 严格的编译器检查,导致很多错误不必到运行的时候segment fault才暴露,而且编译器的提示太友好了,照着改就行了。Segment fault的调试之痛苦,我觉得每一个C++用户都有体验。

此外,rust程序的效率也是非常有吸引力的。在了解了rust的上述优点之后,我曾经出于自身的懒惰,想找点理由不去学它,于是我就用rust把我以前写的一个monte carlo采样程序重新实现了一遍,想看看是不是效率很低,这样我就有理由不去学rust了, which是非常累的。结果它居然比我的C++版本还快。这令我震惊了。于是我就花一个月学了一下rust。

不过Rust也是有一些缺点的(比C++少):

1. borrow语义毁誉参半,毁在太非主流(并不难),一开始会不习惯。当然好处也是有的,就是方便编译器检查,容易提前暴露问题。

2. 太年轻,导致用的人少,用的人少就有夭折的可能性,这么优秀的语言最后用的人少夭折了实在是太可惜了。

3. 库太少,一些C++中常见的库,特别是我经常用到的许多科学计算的库,在C++中有那么几家老字号,比如说:fftw, gsl,mtl, eigen, 还有许多处理不同格式文件的库,比如说hdf5, fits等等,目前rust中要么没有,要么才刚刚开始有人写,毛病还太多

总体而言,我认为rust是一个优秀的语言,我希望它有一天能达到可以和C++比肩的地为(库的数量、用户数)。

最后多说一句对它现状的担忧。由于C++继承了大量的历史遗产、包含了多种设计范式,导致它拥有庞大的生态系统,而此方面rust可说是一穷二白。在可预期的未来,我觉得rust要抢占C++的生态位难度巨大,搞不好会淹没在历史的长河中。但愿不要如此。

C++版主说了,欢迎在C++版讨论rust,所以这不算偏离主题吧。

转载地址:https://blog.csdn.net/weixin_33595317/article/details/116214055 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:linux 脚本 交互,创建交互式shell脚本对话框
下一篇:php包括装箱和什么,C#_轻松学习C#的装箱与拆箱,首先看一看什么是装箱和拆箱 - phpStudy...

发表评论

最新留言

做的很好,不错不错
[***.243.131.199]2024年03月11日 15时37分49秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

axios delete有请求体吗_关于axios请求——delete方法 2019-04-21
java 自助更改密码 api_搭建ldap自助修改密码系统--Self Service Password 2019-04-21
php继承exten,stylus中文文档 » 继承(@extend) » 张鑫旭-鑫空间-鑫生活 2019-04-21
mysql函数大全 pdf,MySQL函数大全 2019-04-21
php 常用文件系统函数,php 文件系统函数整理介绍 2019-04-21
android pm.java,java – AM / PM的Android DateFormat因设备而异 2019-04-21
oracle存储过程调用sql文件,oracle - 在SQL Developer中运行存储过程? 2019-04-21
oracle同时报604和12507,V$SES_OPTIMIZER_ENV 查不到刚修改的隐含参数, 2019-04-21
zblog的php更换域名,zblogphp更换域名后,原zblog里使用了固定域名,登录不进去怎么办... 2019-04-21
oracle dnfs 配置,Source of Oracle参数解析(dnfs_batch_size) - django-\/\/ i K | 2019-04-21
oracle所需的环境,转:面对一个全新的oracle环境,首先应该了解什么? 2019-04-21
linux 小数四则运行,shell四则运算(整数及浮点数)的方法介绍 2019-04-21
linux系统分区后进入紧急模式,Linux系统的救援模式应用详解 2019-04-21
linux配置匿名ftp服务器,在Linux环境中使用vsftpd搭建ftp实现匿名上传详细配置 2019-04-21
linux创建硬盘分区lvm,LVM创建及分区调整、更换LVM硬盘 2019-04-21
FreeBSD可以安装Linux软件吗,在Linux服务器上面通过网络安装FreeBSD 2019-04-21
.net core linux 桌面应用,C# dotnet core + AvaloniaUI 开发桌面软件,hello world 2019-04-21
linux tcp 113错误,linux系统报tcp_mark_head_lost错误的处理方法 2019-04-21
南昌工程学院c语言答案,南昌工程学院C语言程序设计基础课件第3讲运算符和表达式... 2019-04-21
python学画画_python学画画(下) 2019-04-21