1
typetraits 2021-03-19 09:44:08 +08:00 1
Rust 适合有 C++基础的人学
第一天用的时候各种报错,到第二天突然感觉豁然开朗,有种语言就该这么设计的感觉。昨天写 JavaScript 时顺手写了个 const x = if {} 一直报错,看了半天才发现问题 对我个人来说最大的缺点是还需要写分号 |
2
yamasa 2021-03-19 09:47:36 +08:00
那要看你之前主要用的啥。
|
3
no1xsyzy 2021-03-19 09:53:39 +08:00 8
Rust 是给原本写 C/C++ 的人用的。
既不想放弃 C/C++ 手动管理内存的性能优势,又想要避免手动管理内存的风险 结果就很简单:编译器帮你作内存管理的 Code Review 而为了实现这一目的,填充了大量的让编译器能理解的标注。 |
4
missdeer 2021-03-19 10:00:06 +08:00
几年前 Rust 刚出来的时候我看了一下,也觉得挺难的,直接被劝退了
前些天偶然在 B 站看到一个微软 MVP 做的入门教程,发现也不难,除了语法糖多,也就多了个内存管理和生命周期的新概念 |
5
abcbuzhiming 2021-03-19 10:07:36 +08:00
我个人对 Rust 的看法是,它其实并没有降低复杂性(因为它要操作内存,并且需要极致性能),它只是把复杂性从开发者那里,移动到了编译器的变异阶段,所以 rust 的编译速度特别慢,而且它的特性不比 C++少多少
|
7
solaya 2021-03-19 10:12:29 +08:00 1
搞过 C++的学起来还好
|
8
676529483 2021-03-19 10:12:56 +08:00 1
我以前也这么觉得,后来看了 c++,发现 rust 就是 c++的 move+RILL+引用,就没那么难了。当然,放弃了指针也带来了很多不便,最关键找工作没用。。。
|
9
anonydmer 2021-03-19 10:13:20 +08:00 1
春节时候学习了一下 Rust,发现难就难在它那个内存管理和生命周期的概念上;但是编译器都帮你搞定了几乎;所以基本上只要代码能通过编译,就没问题了
|
10
yannxia 2021-03-19 10:13:59 +08:00
Rust 的 lifetime 属于好理解,写起来就有点脑壳痛。学习曲线复杂还是得看 Haskell 。Rust 学习的背景大多数是因为之前不是搞 CPP 的,如果从 Java / Go 转过来会在内存管理上卡一下,如果是从 C 转过来,就会在复杂的语言特性卡一下。说起来还是 CPP 本身的复杂度换了个马甲。
|
11
XIVN1987 2021-03-19 10:14:38 +08:00 2
因为有且仅有它和 C++追求“zero cost abstraction”
既想要没有性能损失,还想要高级的抽象能力,,那肯定要损失点儿什么,,总不能只有好处、没有代价吧,,天下哪有这么好的事儿 |
12
h82258652 2021-03-19 10:16:37 +08:00 3
确实是很难,生命周期这东西我就没一次可以一次性写对的,总是被编译器教做人
宏定义这玩意到现在还是学不会 然而我觉得 Rust 这种才是未来语言的发展方向,完整的 tool chain ( cargo 、rustfml 、rustdoc ),ownership 使得不需要 GC 的存在,不存在 null 也就不存在 NullPointerException,灭掉 Exception 改为 Result 这样就不会像 C#、Kotlin 这种调用第三方不知道里面会扔什么异常的情况( Java 有显式异常所以还好)。 trait 我目前还是保留意见,没有其它语言中 extends 这种感觉还是怪怪的,但数据字段与方法实现的完整分离是个好设计。 目前对于 Rust 来说最大问题就是生态,async 、await 标准确定下来才没多久,可用的 GUI 框架也没有( iced 试过,离实际生产差太多了)。再过个 5 年或者 10 年应该就会好很多,现在学完全就是投资未来。 PS:个人想法,要是 Rust 能加上 C# 的表达式树那就完美了 |
13
yazoox 2021-03-19 10:21:46 +08:00 6
再难能有 c++难?
c++编译那一堆莫名其妙的 compile or linking errors,那才是让人崩溃呢...... |
14
araaaa 2021-03-19 10:34:45 +08:00 1
难的原因其实就是把原来 C 运行期的问题提前到了编译期,然后就会产生非常多的写法上的限制。
|
15
SuperMild 2021-03-19 10:41:57 +08:00 1
Rust 不难,难的是 rust 想解决的问题。
我试过不管效率不管资源消耗,一切对象都复制复制,这样写 Rust 非常爽,不难学。但如果想尽量提高效率节省资源,就难写了。 然而,想尽可能提高效率节省资源,哪种语言不难呢?可见难的不是语言,是现实问题。 |
16
levelworm 2021-03-19 10:42:41 +08:00 1
话说如果写 C++严格按照一个子集来写,会不会也很好?之前在知乎看到一个帖子,说是大家讨论 C++里面哪些特性应该小心使用,不知道大家怎么看这个?
> 能做到对 C++语言的特性基本分类,然后根据分类正确使用它们我对 C++特性的四大分类为了兼容 C 语言,不得不继承下来的特性,比如#include,强制类型转换,直接内存操作,基础类型和函数系统,宏为了零开销实现 OOP 而设计的特性,比如 class 继承和派生,虚函数,函数重载为了开发效率而设计的特性,比如 template 以及一些列 stl,算符重载,auto 为了解决实际问题不得不向现实妥协而设计的特性,比如 explicit,mutable,xxxxx_cast,register,volatile,inline,asm,template 特化,friend 第一种特性在真正需要和 C 语言打交道是要小心使用,第二种特性才是主要使用的,第三种特性只在遇到开发效率问题时使用,第四种特性要尽量避免使用,尽量不要制造需要这些特性才能解决的问题 作者:姚冬 链接: https://www.zhihu.com/question/444555079/answer/1754123101 |
17
SuperMild 2021-03-19 10:45:03 +08:00 1
看到楼主附言说 “学 Rust 虽然可以理解,但是学完一点生产力都没有,看别人的源码还是不知所云”,可见 rust 本身不难,而是一般需要用到 rust 的地方,多数是想解决难题,“看别人的源码不知所云”不是不理解 rust,而是不理解别人在解决的问题。
|
18
DearMark 2021-03-19 10:45:07 +08:00
通过编译,世界和平。为了无 GC,加上了无数特性。但确实很规范的语言,Result 处理真的优雅。
|
19
gygesm123 2021-03-19 10:53:11 +08:00
|
20
rust 2021-03-19 10:56:41 +08:00
|
21
h82258652 2021-03-19 11:04:31 +08:00
@gygesm123
https://www.zhihu.com/question/50779086/answer/122684586 垠神这篇早就被干烂了 反正我觉得王垠这篇完全就只是看了下语法然后写出来的,return 那个简化我一开始也很不习惯,但没这个 lambda 表达式就没法简洁了 |
22
HiShan 2021-03-19 11:05:44 +08:00
你确定你会 Scala ? 逃)
Rust 难,因为你计算机基础不够,你对操作系统内存变量这些东西理解不足。 |
23
cco 2021-03-19 11:08:23 +08:00
Scala - -。头皮发麻,自己写的代码时间长不看都看不懂。
|
25
coolmenu 2021-03-19 11:11:09 +08:00
还是要做一个小项目才能熟练起来。
|
27
nbndco 2021-03-19 11:13:10 +08:00 via iPhone
@gygesm123 wangyin 那个解读真的太肤浅了。大概就是大家在评红楼梦,他说章节标题没加粗大家不容易找到的感觉。
可读性当然很重要,但是 wangyin 那些东西对 rust 的可读性完全没有意义,如果写过 rust 的人就知道反而会显著降低可读性,因为 rust 里匿名类型太多了。 |
28
fakeshadow 2021-03-19 11:14:22 +08:00
从 GC 语言转到 Rust 一般都会有类似感觉。
|
29
fengjianxinghun 2021-03-19 11:16:37 +08:00
@h82258652 哪有什么生态问题,去年写了一年 async/await smol/tokio 一堆实现还不够你用?
|
30
fengjianxinghun 2021-03-19 11:18:07 +08:00
@fengjianxinghun 去年用 smol 的 async/await 实现了一个 2 层 tap/vpn 一个 tcp/udp 代理
|
31
tairan2006 2021-03-19 11:19:20 +08:00
Rust 主要还是写起来太费劲…
老实说我不觉得这是未来语言发展方向 |
33
h82258652 2021-03-19 11:24:25 +08:00
@fengjianxinghun async-std 和 tokio 的问题啊。。。当你发现一个 lib 依赖 async-std,然后另一个 lib 依赖 tokio 的时候。。。反正我心里是崩溃的,虽然 tokio 说会靠近 async-std 就是了。
另外 GUI 这块生态就是真的不行。 |
34
fengjianxinghun 2021-03-19 11:27:20 +08:00 1
@h82258652 啥,smol 早就兼容 2 种写法了,你在 smol 里即可用 async-std 也可以用 tokio,async-std 内部用得 smol 更没问题。
smol::block_on(Compat::new(async move { //三种都兼容 })); |
35
h82258652 2021-03-19 11:28:43 +08:00
@fengjianxinghun 感谢,smol 还没用过,有空看一下
|
36
fengjianxinghun 2021-03-19 11:29:36 +08:00
@h82258652 三种实现源码我全看了,现在生态成熟得不行。sj 大神得 smol 兼容一切得弄法完全修补了分裂。
|
37
SuperMild 2021-03-19 11:35:13 +08:00
@tairan2006 C/C++写起来也费劲啊,不是未来发展方向,但要压榨硬件性能也没有更好的办法。rust 不是用来取代 GC 语言的。
|
38
chenqh 2021-03-19 11:41:34 +08:00
因为 rust 无 gc 呀,如果 rust 有 gc 的话,估计不会这么难
|
39
fffang 2021-03-19 11:45:07 +08:00 1
![image.png]( https://i.loli.net/2021/03/19/Da4uCAf8yFlSOq5.png)
|
40
cmdOptionKana 2021-03-19 11:45:27 +08:00
@chenqh 如果 rust 有 gc, 那就完全发展不起来了,单凭语法特点干不过 C#和 kotlin 。
|
41
fffang 2021-03-19 11:45:50 +08:00
这个 V2EX 的 markdown 闹哪样?
|
42
chinvo 2021-03-19 11:47:56 +08:00 1
用过 C++ 的都说好.
Rust 确实不是用来解决"互联网工程"相关的工业级问题的, 相比能快速开撸大工程 (CRUD, 笑) 的 PHP .Net Java, 缺少"工业级"轮子. 相比 Go Python 缺乏亲民性. 在简单用用的情况下相比 C/C++ 又太过复杂. 但是如果深度使用过 C/C++, 总有一个内存管理的坑等着你, 这时候再用 Rust, 会发现它简直是"世界之光". 只要能编译,根本不怕跑飞. 前段时间的同类讨论 /t/757796 |
43
chinvo 2021-03-19 11:49:03 +08:00
|
44
xarthur 2021-03-19 11:58:22 +08:00
Scala 也不好理解啊(逃
说正经的。我最近在把 Rust 的语法过了一下,大部分的概念没什么特别新奇的(包括 trial ),主要还是内存管理部分比较新奇,乍一看上挺难的,实际上手写感觉还行(也可能我没接触比较大的项目) 我写 Rust 目前遇到最大的问题是不知道写什么,大部分项目不需要 Rust 这种 zero-cost abstractions (大部分项目也不延时敏感、内存敏感)。而如果单论语法 Rust 的语法其实在一堆现代语言里算不错(相比 Go 就好多了),但是不是最好的( Rust 各种符号用的太多了,乍一眼看上去会很复杂,个人观点)。 想来想去,Rust 可能对于我来说适合写一些关于网络编程的小工具。 |
45
Justin13 2021-03-19 12:14:44 +08:00 via Android 4
确实,我最近得空也在看 Rust 。有好的设计,也有让我很难受的地方,具体的有
1. 可以通过不写分号来返回表达式的值,这可太隐晦了,可读性直接拉到底。 2. lifetime 各种意义上的反人类,特别是那个语法,最烦的就是这种依附于特殊字符的语法了,代码堆到最后,那是人看的? 比如下面这个函数声明 fn longer<'a>(s1: &'a str, s2: &'a str) -> &'a str { 直接把我劝退,这还是没加泛型呢。。。 3. 没有三元运算符,本来还没什么,搜了一下把我看乐了,反对的原因多是,可读性差,有 if else 一种写法就够了,写这些的人怎么不看看那恶心的无分号返回值呢。 这语言我是不喜欢,但是它的设计思路很有意义,把内存管理,变量生命期等痛点从运行时提前到编译时,但是带来的限制就是写起来束手束脚,并且额外的信息量得由程序员给出,这可太痛苦了。 我比较倾向于 dependent type,让语言和编译器本身支持更高级的类型识别,从而真正解放程序员。 |
46
chenqh 2021-03-19 12:19:14 +08:00
@cmdOptionKana 但是 rust 能编译成 2 进制呀
|
47
gggxxxx 2021-03-19 12:38:03 +08:00 1
我始终有个观点就是,这个时代来说,c++和 rust 这种语言是非常糟糕的语言。
就跟汽车发展一样,最早是手动挡,对驾驶员操作要求蛮高的,还得略懂一些汽车机械原理。 然后自动挡取代手动挡,用过都说好。什么费油不费油都是穷人思维,工具就是拿来用的,用不重要开销换便利才是对的思维。 再然后就是自动驾驶,人以后只需要乘车就是。 编程语言朝着接近自然语言和超多辅助语法糖发展才是正道,但是偏扁现在的风气又有点反古,什么追求运行效率人人喊的朗朗上口......现在的计算机硬件算力早就过剩了好么,程序慢点又怎么了?换来的是易用啊。。。。 当然我相信绝大多数程序员的思维跟手动挡车爱好者一样的,自己亲手解决一个已经有现成解决方案的问题,会非常有快感的...... |
48
cmdOptionKana 2021-03-19 12:40:27 +08:00
@chenqh kotlin 也能编译成二进制 https://kotlinlang.org/docs/native-overview.html
另外,Go 有 GC 也能编译成二进制。C#好像也可以或者有计划,这个我不太确定。 |
49
SuperMild 2021-03-19 12:45:22 +08:00 1
@gggxxxx 不是,你想想浏览器的渲染引擎,linux/Mac/Win 这些系统的底层,还有量化交易要求的超低 IO 延时,还有数据库,复杂的 office 文档,科幻电影场景渲染……慢了真的可以忍受吗?
|
55
Jirajine 2021-03-19 13:26:30 +08:00 via Android
@Justin13 lifetime 就是一种泛型啊,你在函数签名上声明了一个泛型'a,并提供给引用类型。
类似于这样: fn longer<T>(s1:Ref<T,String>,s2:Ref<T,String>)->Ref<T,String> |
58
ppphp 2021-03-19 13:39:35 +08:00
我写个链表题搞了快三天了,心态是完全爆炸的
|
59
pancl 2021-03-19 13:43:11 +08:00 via Android
rust 降低语法复杂的话,还可以扩大适用范围
|
60
Jirajine 2021-03-19 13:44:59 +08:00 via Android
@Justin13 那就再加啊,生命周期就是通过泛型实现的,func<'a,'b,C,D> 凡是'开头的都是生命周期的泛型参数,其他的都是普通的泛型参数。
除了命名方式不一样,别的没有区别。 |
62
Nugine0 2021-03-19 13:48:37 +08:00 via Android
最近完成了一个基于 io_uring 的 proactor,几百行一次过,刚写完就能跑起来
|
63
litchinn 2021-03-19 13:51:22 +08:00
我比较期待 rust 在游戏开发领域的使用
|
65
zsl199512101234 2021-03-19 14:03:08 +08:00
rust 更适合系统编程(数据库,操作系统),其它感觉 java 或者 C#
https://github.com/mit-pdos/noria https://github.com/redox-os/redox |
66
gBurnX 2021-03-19 14:12:24 +08:00
如果有时间,可以试试从底层一步一步往上,这样什么语言都不难。
|
67
gggxxxx 2021-03-19 14:13:46 +08:00
@SuperMild 我的意思是,慢的话提升硬件啊。
等你花时间去优化代码重新发明更高效的编程语言......还不如等新硬件上市...... |
68
sillydaddy 2021-03-19 14:19:00 +08:00
看了回复,决定给 Rust 种颗草。
|
69
junkun 2021-03-19 14:19:35 +08:00
@gggxxxx 不是效率的问题,你总得有个东西把底层的脏活干了。不然 java 这样的 gc 语言能自举自己吗,还不是要靠 c++来做解释器。而且像嵌入式、系统内核这种环境根本不可能用 gc 。
|
71
nickyang897897 OP @HiShan 搞大数据的,不会 scala 说不过去吧
|
72
Nugine0 2021-03-19 14:40:50 +08:00 via Android 1
@wellsc 目前只有最简单的功能,但塞了不少优化。
一般情况下,进行一次 IO 无需任何额外的堆分配。未来用上 io_uring 的最新特性后,可以做到进行一次 IO 连系统调用也不需要。 有线程、协程、原子指令、互斥锁、信号量、对象池、状态机、小对象优化、自定义虚函数表等知识点,unsafe 自然也没少用。 https://github.com/datenlord/datenlord/pull/193 |
73
DonkeyBenjamin 2021-03-19 14:44:18 +08:00
1. rust 不是给大部分人用的,它的目标是 performance and safety, 不是 productivity; 适合大佬用来做系统编程或做底层的东西
2. 我觉得就 rust 的目标而言,它的设计已经是尽力做到博采众长了 |
74
zjsxwc 2021-03-19 14:52:27 +08:00
写 rust 怎么简单怎么来呗,
28 原则大部分特性我不用, 'static 一把梭 逃 |
75
liuxey 2021-03-19 15:02:10 +08:00
|
76
cmdOptionKana 2021-03-19 15:10:01 +08:00 via Android
@gggxxxx 市场不等人,你用舒服的语言做个浏览器出来,卡顿。别人用糟糕的语言做个浏览器出来,明显更流畅。
这个世界是有竞争的,因此才有人愿意干脏活。有的人为啥凌晨四五点起来卖早餐,他不想睡觉吗,假如全世界一起等八九点的早餐,那大家都可以舒服。可惜有竞争啊。 |
77
AX5N 2021-03-19 15:37:39 +08:00
@cmdOptionKana 你这个卖早餐的例子有点想当然,凌晨四五点起来不代表睡得少。
|
78
Leviathann 2021-03-19 15:38:06 +08:00 via iPhone
@silentt 好像的确没人关心 javac 是什么语言写的,都关注 jvm 了哈哈🐶
|
79
Leviathann 2021-03-19 15:46:09 +08:00
@AX5N 换个例子吧,webpack vs esbuild
这种性能差距可以填平多少年的硬件发展了 |
80
no1xsyzy 2021-03-19 15:47:59 +08:00
@gggxxxx 不是说硬件水平已经接近物理瓶颈了么 —— 虽然上几次也是这么说的,一次用 FinFET 解决的发热极限,还有一次不清楚,但是你不能指望新技术的必然出现啊。
Intel 的制程加号再多,性能没有被甩一整个时代…… 到 AMD 5000 系 CPU 才终于是桌面 CPU 头牌换位。 而且也不环保。 |
81
libook 2021-03-19 16:32:39 +08:00
越简单的语言对开发者要求越高,比如 C 、JavaScript,稍不注意就可能写出有缺陷的代码,而且这些代码中大部分是可以运行的。
可以去 benchmarksgame 看看 Rust 的压测表现,性能和 C/C++相当,到这种程度又要规避很多 C/C++常见的开发痛点,于是就设计出了一些复杂的开发模式,以至于让 Rust 的学习曲线变得陡峭。 可能习惯了就好了,特别是现在还带着很多其他语言的思维定式,比如 Rust 里的 Ownership 和 C 里的指针操作乍一看长得差不多,但实际上是完全不同的理念。 当然看代码看不懂也不一定是自己的问题,代码是有可读性好坏之分的。 作为一个大学英语四级都没过的人,原版 Book 已经看了一半了,打算看完后再看 Rust by Example,以及去 GitHub 上找找 coreutils_rs 之类的简单项目看看。 |
83
HeapOverflow 2021-03-19 17:00:46 +08:00
nim 跟 vlang 了解一下
|
84
industryhive 2021-03-19 17:10:07 +08:00
@junkun 自举不是不可以,是没多大意义。不过像 java 这么庞大的用户群,虽然自举这个事没太有必要,但早晚还是会有人做的,比如 GraalVM,性能上相比于 Hotspot 还是有提升的,GraalVM 运行 java 应用性能提升 4%-10%,运行 Scala 应用性能提升 20%。以后 Oracle 的优化重点估计会越来越向 GraalVM 倾斜了。
|
85
industryhive 2021-03-19 17:12:58 +08:00
@liuxey JVM 也是可以举的,比如 GraalVM,100%java 代码,估计以后某个版本会用 GraalVM 把 Hotspot 替换掉。
|
86
fengjianxinghun 2021-03-19 17:16:11 +08:00
@Nugine0 tokio 有 io_uring 的实现包装
|
87
maomaorun 2021-03-19 18:11:08 +08:00
你如果用 Rust 的思路写 C++,会发现还是 C++简单
|
88
Nugine0 2021-03-19 18:48:18 +08:00 via Android
@fengjianxinghun 那个是低层封装,实际要用还得再封一个高层的 proactor 出来。
io_uring 也提供了多种用户空间 API 的可能,完全可以拿 rust 重写 c 库,换一条路去尝试。 |
89
HeliumTang 2021-03-19 18:56:10 +08:00
@ppphp 有个外国大佬专门写了一个怎么用 rust 写链表的教程
|
91
KeepPro 2021-03-19 19:15:38 +08:00
从 15 年就开始关注了,至今还不没学会的,感觉没救了。
|
93
impl 2021-03-19 21:13:15 +08:00 via Android
用 go 就行,简单性能也不错。除非你写浏览器,数据库这种,就需要学 rust
|
94
FightPig 2021-03-19 21:14:24 +08:00
我学了五遍,这才感觉有点豁然开朗
|
95
Wincer 2021-03-19 22:16:38 +08:00
学的语言越多,之前所具备的思维定势反而会误导你,就比如 Rust,变量的生命周期包括 Rust 的内存管理和其他的语言都不一样,如果带着其他语言的思维来尝试理解具备完全不同特性的编程语言,那还不如把自己当成一个编程新手,抛弃所有的思维定势。
至于楼里大多数吐槽不写分号返回值的这点我倒是觉得还好,这一点明显是脱胎于函数式编程语言:以函数最后一个表达式作为函数的返回值,不过 Rust 还保留了 return 关键字。还有 async 生态问题,如果是 IO 敏感方面的需求我不会选择 Rust 的,Go 不香吗,Rust 就应该写底层、性能敏感型的程序。 |
96
orannge 2021-03-19 22:52:55 +08:00
1. Rust/C/C++性能一个梯队,难度也一个梯队
2. 如果归类,Rust 一类,其它语言(C++/Golang/Java/Python/JavaScript 等)一类,其它语言纵使差距大,但起码概念是相通的 3. 不追求极致性能、非 CPU 密集,用 Go 就行了,上手简单、编译快、容易出成果,各方面相对均衡 |
97
jones2000 2021-03-19 22:58:25 +08:00
把你原来做的 java 项目全部移植到 Rust, 等你完成, 你就了解 Rust 了, 光看有什么用, 这有不是看小说, 实际运用才行.
|
98
naoh1000 2021-03-19 23:31:21 +08:00
你学了吗,学了才知道其实也就那样。
|
99
icylogic 2021-03-20 02:16:43 +08:00 via iPhone 3
rust 是 c 艹用户想脱离苦海的一种愿景,没被 c 艹艹过可能感受不深,
✓没有头文件,直接就是 module 。 ✓一个工具解决依赖,构建,测试,干翻 cmake ✓默认 const auto,以及把一大坨所谓 c++ best practice 直接做进语言 ,你不需要特别注意就会默认写成那样 ✓trait 把 sfinae (的一部分)和 concept 以及多继承接口等 dynamic/static dispatch 手段统统干掉 ✓把函数式编程以不那么恶心啰嗦的方式引入进来 ✓宏比 c/c++ 的更安全和易用 |
100
lqf96 2021-03-20 04:12:23 +08:00 1
@icylogic 等 GAT, specialization 和 const generics 都做完基本上就比 sfiane 更强大了(虽然是有生之年系列),另外我觉得 Haskell 和 OCaml 对 Rust 的深刻影响是不能忽视的,trait 和 typeclass 简直不要太像...
|