Rust 真香,Python 再见

为啥这么说

之前一段时间,我以 Python 为码字主力语言。顺带选择了 Django 作为网站框架。

一开始选择 Python,是看中其非常人性化的语言定义和强大的生态。毕竟咱写程序不能老仅仅是在 C 类这样虽然很灵活,但实现具体需求要哗啦哗啦造一堆轮子代码的语言上吧。

好吧。其实是因为学业和其它安排上的压力告诉我,不能再像以前学 C 和 AT 汇编那样抱着一门语言啃 5 年了。当年年 少轻狂,试图自学入门,结果被指针和汇编断腿找段定位段坑到死的阴影历历在目

为啥要试图转 Rust & Python 不尽我意的地方

  • 动不动就内存泄露 + 大额占用,很难受啊。尤其是 Django 这种需要长时间运行的生产项目,内存占用多一点还好,但泄露一下…人都要烦死了。
  • 除了语言简洁之外,我还想追求程序的性能。我这台小破本太菜了,带个 calibre 动不动吃掉所有的内存 + swap 然后卡机
  • Rust 即有 C 的底层特性,也有现代 Java 程序的高级编程特性(比如说面向对象什么的)。这让我感觉 Rust 很 Geek,很高效,很简洁,应用范围极其之广:rofl:。既可以用在家里,随意造轮子,也可以认真一点丢到生产力环境上跑。而且 Rust 本来性能就挺高的,不是吗。
  • 感觉 Rust 既可以选择让编译器帮你自动优化好一切,也可以自己在代码里手动定义具体行为。之前很不爽 Python、Java 等一类高级语言砍掉了 C 的引用等大量底层常用特性,但是奈何 C 不是很适合日用 + Python 要改个底层行为 ~= 各种 Abc 轮子警告,只能用这些高级语言凑合度日。看来现在有一个完美方案 Rust 摆在我面前。万岁!
  • 进程 + 类型安全 YES
  • Rocket 比 Django 更简洁、好玩、强大。

综上

决定以后入 Rust 这个大坑了。因为实在是太爽了哈哈哈,底层特性 + 简洁人性化语法 + 各种周边生态 + 极致性能。太爽了,可以说是 Python 的完美替代品了。

在 Rust Playground 随意搞事 ing. :sweat_smile:

至于入门,我看的是官方教程 + 这篇文章:

IBM 里面的文章,感觉很棒,有时摸不着头脑的时候,就去参考一下。

这俩压根用途不一样的语言好不好。rust 专注运行速度,python 专注开发速度与可阅读性。

搞 web 开发,目前没有比 django 更爽的。Python 随处可用的鸭子类型虽然慢,但是能让程序员写起来很舒服。

哈哈。对我这种小学搞过某 C 艹 数学竞赛 + 学习用汇编 + C 造过小型 OS 的人来说,Python 的简洁并不是特别吸引我。我更喜欢代码背后的原理。

换句话说,比起一堆嗡嗡作响的黑匣子,我更喜欢看到一群在转的齿轮:rofl:

当然 Django 的文档是真的香,毋庸置疑——真,教科书级别。

Rocket 的语法也挺香的,写起来不比 Django 复杂多少。可能 API 文档难理解点,不过问题不大。


至于你说两种语言应用场景有别,这个是实话。

个人感觉,Python 适合写一些原型代码和小工具。大型项目上我目前还是不会优先考虑 Python 去实现。

毕竟生命在于折腾。在喜欢的事情上做到前沿,个人感觉还是很有意思的。

欢迎入坑,Rust 重写一切,哈哈!:joy:

Rust 的参数太难传了 也许我还不会搞那个所谓的 所有权 Go 在这方面就不用考虑这个了

我不会 Python 只会 Ruby 和 Go。

不过我准备用 Rust 重写我之前 Ruby 写一半的 upstream-notifier。

1赞

好比汇编里面名(不)副其实的 MOV(说是移动,实则赋值。执行指令后原来的值还在那里一动不动,当时学得时候吐槽半天为什么不叫 COPY):rofl:

个人觉得还好(而且感觉这种传递形式更形象?)。按照 IBM 的那篇文章,只要注意赋值对象、传值对象的所有权和作用范围就好。

实在不行全部写 &mut var 也行啊

2赞

这种小众学院派语言如果没有一个流行的成功案例,永远只能在边缘徘徊,沦为玩具。现在的纯语言发展停滞不前,
无非是一些语法糖的变化,没有质的突破,真正影响性能的是架构和算法,代码级别的影响微乎其微,
连 c++ 这种号称高性能图灵完备的语言,也被各大公司抛弃,成本高,招人难,没个 5,6年 的经验,没人敢说熟练,
5年 时间要花多少成本去培养一个人,C 语言成为无可替代的系统语言,就是因为简洁。C 语言的 DBUS 消息机制解决一切架构问题,
直接导致 c++ 语言级别的大型架构流行不起来

C++ 太复杂了。

我觉得 rust 跟你说的学院派语言还是有区别的,rust 有明确的目标以及非常活跃的社区,如果你用 Rust 写过项目,肯定不会再想碰 C 了。而且目前 Rust 也得到各大公司的支持,微软正在用 Rust 或其变种重写 windows 底层组件,亚马逊、google、阿里、头条也都有应用。

2赞

哈哈,居然苏姐也会 go,用 go 写不行吗???:joy:

这几个语言各不一样。。

c 相当于高级汇编,每行语句都简明地对应翻译后的汇编结果。用于直接控制硬件。编写繁琐。大杀器,一般不用。

rust 相当于高级 c 语言,专注编写高性能代码。不适合控制硬件——当然也有人这么干,但其实是误用。小杀器,一般不用。

java 只用于编写简单的业务代码,但是不适合复制的业务需求。容易协作第一、可靠第二位,性能第三。写起来麻烦。因为表达能力太弱,不适合非常复杂的业务。最适合互联网工业使用。

python 相当于写伪代码,尽量接近自然语言,可以优雅表达各种业务。性能不重要。用于各种快速原型。不适合后期使用。小型 (两三人参与) 项目和各种随写随弃脚本的最佳选择。

go 跟 java 类似,但性能第一重要。不容易协作,也不如 java 可靠。也适合工业使用。

c++ 试图做得比上面所有的语言好。然而语法非常复杂。屠龙之技,用了就是错。但是在桌面编程领域,再考虑性能限制,在某些极端少见情况下是唯一可用的语言。

JavaScript 是 web 浏览器专用语言。虽然也能用于后端,但基本是玩票性质。

在某些领域,由于惯性,需要使用特定语言。

比如 unity 开发语言用 c#

区块链有很多 JS 矿池

有些网游公司用 go 和 lua 写服务器之类的。

不代表这些语言适合这些领域。每种语言都有大量相似的轮子。

go 有一点不好,不能动态加载插件。好比我一个 URL,通过 regexp pattern 发现它是 github.com 就 load github.so 去处理…要是 suse.org.cn 就尝试 load suse.so。没有再 fallback 到一般处理或者干脆 warning 退出。

Ruby 这是很简单的一个 Meta programming 的问题。Go 就实现不了,但是 Ruby 的 concurrency 做的又不好。想看看 Rust 有没有这类的方式。

因为我做 upstream notifier,好比跑在一台树莓派上给所有人提供通知服务,主服务肯定不能没事老停机加个插件什么的,肯定是根据 URL 去尝试加载同名插件,然后单独开发插件就行了。

rust 有两种方式

一种是 c dylib, 可用但功能 受限于 c 的 abi
库: libloading, dynamic_reload

据说还有一种是编译器插件(unstable)

@marguerite

对,小众学院派的语言难以流行,所以 Haskell 再见,Rust 真香啊。

Rust 的动态加载就是 C 那个,因为 Rust 没有 stable ABI 所以只能用 C ABI。所以加载插件要搞 ffi 有些麻烦、有限制,在边界上也会失去 Rust 的安全性。不过好歹是可行的,而且这个样子你还可以用别的语言(比如 C、C++)去写插件。

其实啊,Rust + Python 才是最香的:资源受限、需要性能、对正确性要求高的部分用 Rust 写,变化多端的部分拿 Python 糊一下,多方便。反正 Rust 和其它语言的互操作性很好。

搞热更新吗

不过你说的挺有道理:wink:。我把 Rust 本体搞转了之后来好好研究下跨语言集成。

顺带发现了一个 CPython 的 Rust 重写实现