2021/12/14
又是两年过去了,再谈谈自己最近的想法。
先说下rust。语言方面,rust这两年变化不大,总算是稳定下来了。市场方面,有不少公司在需要高性能的场景开始尝试使用rust,也有些实践经验公布分享出来,这是个好迹象。但是,考虑当前的生态情况,除非你是高手,依旧不推荐用于生产环境。如果确实想用,还是先提前做好评估和测试。个人审美方面,总体上还是比较喜欢rust的语法,尤其是enum+match的用法,逻辑看上去就很漂亮,和elixir还挺像的;不过对string还有::这种c++风格的符号等不太感冒啊。而对其内存管理模型,这个rust的核心,个人依旧感到不甚满意,感觉写起来心智方面其实和c++差不多,也挺心累的,当然rust的编译器纠错能力比c++强太多了。我对rust的期望是比较高的,希望能替代c++,也希望能推而广之,因此还是想着语言本身能有个更简单些的模型,即使这个简单模型能力弱一些也没关系。
再说下go。语言方面,终于generic要来了,至此,可以说go几乎没有短板了。其他的,各种对err或者三元操作符之类的批评,其实更多只是审美问题,官方大概是不会改进。其实我个人就更喜欢 多返回值+err 的方式,而不喜欢抛exception。市场方面,可以说go已成气候,无论库、教程、培训、职位,还是赞美、批评等等,都已经具有一门成熟语言所具有的特征了。很是推荐学一下,反正也不花时间,就和学lua一样。至于是否用于生产环境,还是得评估加测试。个人审美方面,总体而言go其实相当乏味,没有让人惊艳的感觉。但我就是喜欢这种简单直白、好写好读,用起来也能更好更快地出货。一直以来虽然我用go比较多,但对go本身的期望并不高,因此对它的不足也相对容忍,不过还是希望官方或准官方能有个统一的web框架以及orm/query builder库等,或者有个类似spring boot这种组织。
另外,有兴趣的话,更推荐大家去github上看看对语言的建议和评论,看看某种特性是怎么设计实现出来的。比如go的generic,这么多年来改了多个版本,评论区也有很多建议和观点,有些挺有意思的,讨论氛围也挺不错的。
2019/12/30
又一年过去了,再谈下自己的想法。
先说下前途。
这个看市场就知道了,目前Go更有钱途,而有钱途才能有前途。原本Rust有Libra作背书,可以大大宣传一把,可惜Libra一直不出来。
再说下语言的变化。
Go最大的变化应该是go mod了,至此Go的包管理总算勉强和Rust站同一台阶上。而下一个最大的变化,应该是generic了, 看了它的设计文档,感觉挺好。Rust最大变化,应该是async-await了,至此Rust的并发也勉强和Go站一台阶上了,至于下一个变化,不知道是啥,Rust目标太大太多。
最后谈谈自己的感受。
Go到目前为止都还没有generic,实在让人看不下去,还好官方总算计划在2.0时加入。另外,我觉得很多人误解认为官方不加generic是觉得不需要,是自大,但是仔细看了官网的FAQ以及一些访谈,我觉得作者的意思应该是他们也想要generic,但是找不到好的办法,而且反正也只是写框架时用下,就先用interface{}凑合吧。至于其他的,我还是相当满意的,符合我自我感觉的正交风格。不过但是最让我信服的是,Go自从1.0发布以来,基本没有改过,每次发新版本,只要从新编译下,就能获得更好的性能,让人很省心。我希望Go能有更多高质量的库,并且希望Go团队能一直做下去。
Rust满足我了对c++的各种期望。以前要写好C++,得看很多书,effective系列、exception系列、再来个谷歌编码规范指南之类的,这才能勉强写出能看的代码,之后还要经历各种内存泄漏、满屏幕的STL报错信息等等,而Rust则几乎是C++的最佳写法。语言设计方面,我觉得在正交性上,Rust做得不够好,有些语法功能大体相同,却又有微妙的差异。还有string,竟然用几种基础类型来应对不同的用途,我觉得可以交给库来处理更好。对内存管理,这个本质上复杂的问题,Rust是用复杂的方法来解决复杂问题,甚至有时候方法的复杂度要超过问题本身的复杂度。但这些都瑕不掩瑜,真正要命的是Rust一直不太稳定,语言本身设计也好,标准库也好,第三方库也好,都是这样,让人很不放心, 有点学之者生,用之者死的感觉。总体而言,我还是希望Rust能更简单些,至少要简单一半,否则过高的学习成本容易导致曲高和寡。
另外,这几年都没有新语言出来,虽然不用担心学不动,但也让人失望了些。
2018/11/21 更新
看到还有人关注这个话题,就再更新下最新的想法。
先说Go, 因为这几个语言中,Go的动静最大,倒不是官方发力宣传,而是Go又基本按时发布了其第11个版本,这稳定的节奏应该会让其他语言有压力。到目前为止,可以说Go已经在国内站稳脚跟了,证据是:有好几个培训机构开始推广、培训Go了。这也不知是好事坏事。当然讨厌Go的人也越来越多,而且讨厌程度也升了级,因为以前用的人少可以不用理会,而现在可能就在眼皮底下晃悠。我已经把Go用到了嵌入式领域了,主要是在AP上(现在的AP内存真是够大的)。用C封装了硬件层,对外提供socket接口,然后用Go对接并做业务逻辑,实在是太方便了,晚上做梦也没有梦到调指针bug了。
然后是Rust,也往前走了几(小)步。越来越多的人开始尝试Rust,大力赞扬,并主动推广。也越来越多的人说Rust已经处于爆发的临界点了。但个人觉得爆发是需要机遇的。Rust没赶上云(先是Python后来被Go区代),没赶上区块链(Go和C++),也没赶上最近不知道是往上走的还是往下走的AI(C++和Python)。另外,也很少听说有将Rust用于实际产品的。个人唯一听说的有一个较大的团队选了Rust,但搞了很久没出货,不得已再改向Go,却只用之前Rust的一半时间就完成上线了。这对Rust来说这可不是好消息。当然这样举例比较偏颇,我也可以举出有团队用Go然后最终转Java的例子。总之,爆发尚未开始,Ruster仍需努力。另外,最近看了些代码,并写了些,有一点感觉比较明显,就是很难一眼看出代码是好是坏,然后编译器却吐出一堆报警,这应该是我Rust经验不足。
最后是Swift,最近半年把这语言有好好过了几遍,并写了些代码。我要收回以前的话,我不觉得Swift能在性能领域和Rust有得一拼,甚至差的远,因为Swift过于“动态”了,有不少运行时消耗,但用来写UI程序还是很爽的。Swift有点大杂烩的感觉,各种语言特性都往里面加,有许多特性还有形式不同的语法糖,这样可以满足不同口味的人,但代码就难以统一了,个人感觉真没必要,或许他们真应该请王垠大大去参谋下。Swift最近只发了个小版本,也没多大动静,但我看到有越来越多的公司开始用Swift写App了。总之,不管你喜不喜欢,只要苹果坚持Swift,那这门语言就值得学习(为了工作)。
2017/09/09 更新
Rust加了lifetime后就辣眼睛了,不知道后续版本还会再加什么符号。在内存管理上感觉Rust走了极端,颇有Scala学院风范。个人倒是越来越觉得引用计数法更好用,只要不加入strong weak类型。Rust急需一个killer级别的系统作背书,而Rust编译器以及没见到人用的Servo是不够的。另外,各位Rust党们,你们的敌人不是带GC的Go语言,而是同样抢C++蛋糕,同样基于llvm,却背景雄厚的Swift。
Swift没什么说的,只能感慨苹果真是有钱任性,都快发布5.0了,竟然ABI还不稳定。不过据说5.0要稳定了,等着瞧吧。
Go自诞生起受到了很多批评,比其他新语言加起来还多,却硬是靠着简洁的设计,丰富高质量的标准库,靠谱的核心团队,以及谷歌的支持,在云计算这个领域切下了大块的蛋糕,到目前为止已经发布了10个版本。而且有了官方的dep之后,代码目录干净了许多。在使用中,感觉有点缺憾的是没有统一的web框架和orm库,这方面Elixir做得比较好。
Elixir真是挺漂亮的,性能和可靠性有erlang&otp 兜底,Ecto和Phoenix也颇得Rails神韵。但个人没有大量使用,不敢下结论。
----------------------
Dlang是最早出的,但这么多年也没见着killer级别的程序,估计以后更难,可以丢一边去。
Golang和Rust都是后起之秀,可以从以下几点对比下:
出身
-----------
Golang和Rust都出身于工程界,这方面没什么好比。Golang出自谷歌,Rust出自Mozilla, 都有个好爹,当然前者要更土豪。但Golang的爹只提供了生活费,其他就不管了;Rust的爹目前看来要更负责任些。综合起来,彼此差不多。
语法
----------
Golang比Rust要简洁不少,好学好记。Rust综合了很多语言优点,值得赞一个。两者的坑都很少,写起来代码行数差不多。可以说两者走了不同的方向,喜欢哪个,就看爱好了,众口难调,说不上高下。
应用场景
------------
Golang适合高并发网络服务程序;Rust适合UI、游戏等对性能要求高的程序。
换句话说,Golang适合Java、Python的领域;Rust适合C++的领域。
成熟度
------------
Golang已经很成熟了,生态已经成型,killer级别的程序也有几个了,可以放心使用;Rust 1.0正式版还没发布,学学可以,但别用在公司项目中。
槽点
-----------
Golang的槽点主要集中在缺少模板和错误处理,这可以看看Golang的FAQ,里面解释了为何不要模板,以及为何不抛异常。Rust的槽点主要集中在版本和文档,这不还没发布正式版嘛。
前景
-----------
Golang瞄准的是C++, 结果打落了几只Java鸟和Python鸟;Rust直接就一头撞向C++,令人捏一把汗。
其实Golang和Rust的重合度不高。可以先学Golang,这样就可以立即用得上;然后再学Rust,这样等其成熟了,也可以开始用了。