作者Neisseria (Neisseria)
看板C_and_CPP
标题[闲聊] Rust 的实用性?
时间Sun Dec 25 20:17:13 2016
这篇是聊 Rust,但是放在 C/C++ 版是因为 Rust 的特性
如果版主觉得不适合就删文吧 XD
最近利用空闲时间在学 Rust
发现到 Rust 和其他语言结合得蛮好的,像是和 C 结合:
Rust --> Rust FFI --> C library
或是和 Python 或 Ruby 等高阶语言合作:
高阶语言 --> 高阶语言 FFI --> Rust (as C library)
当然,也可以直接做成执行档
其时,Rust 有点像 C++ 的角色
需要编译语言,但是又不想写 C 时,就用 Rust 写
反正编成机械码後,从电脑的角度来存取都一样
根据小弟摸一小段时间 Rust,感受到的一些优缺点:
Pros:
- 语言体质佳:支援 OOP、generics、functional programming 等
写起来有某些部分像高阶语言
- 平台支援好:同一套程式码可直接用,不用根据平台写 #if 条件句,交叉编译也很方便
有点像高阶语言的程式环境,只是 Rust 是编译语言
- 编译检查严格:能通过编译的程式相对发生问题的机会少
- 可做系统语言:不使用 GC,允许 stack allocation 也允许在 unsafe block 中
进行指标操作,可以达到 C/C++ 等级的效能 (感谢 littleshan 说明)
Cons:
- 社群资源少:和 C/C++/Java 相比差非常多,新的语言多多少少都有这个问题
如果要拉 C 函式库,要自行处理,跨平台的优点就消失一半
- 学习资源少:目前大部分都要靠官方文件,目前市面上只有一本 Rust 书籍
明年二月到四月,会再陆续出两三本,总体上还是很少
- 语言不稳定:Rust 经历过一些改动,在 1.0 版以前某些特性实作後又放弃掉
使得网路上一些 Rust 相关的资讯变成错的
另外,目前 Rust 分为 stable, beta, nightly 三个版本
某些函式库作者会偷用 nightly 的版本,使得函式库不稳定
- 上手不易:也是因为编译检查严格,学习 Rust 总是要和 Rust 编译器奋战一阵子 Orz
其中有些东西和指标有关,如果 C/C++ 学得好,撞墙期会比较短
Rust 底层用到 LLVM,但 Rust 包装得很好,使用者不会碰到 LLVM
虽然小弟时常和 Rust 编译器角力 = =|||,基本上还算欣赏这个语言
但是毕竟还很新,若要引入专案可能还是要考虑一下
不知道各位大大会将 Rust 用在自己的专案吗?side project 也可以
就当成闲聊吧,听听看大家的看法
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 175.182.166.115
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1482668235.A.3D0.html
1F:推 wtchen: 只要跟C/C++相关,准你发。 12/25 20:39
2F:推 damody: 语言不稳定是硬伤,又不像swift有apple在推 12/25 21:11
3F:推 wtchen: 听说有用Rust开发的作业系统,是真的吗? 12/25 21:39
http://www.redox-os.org/ 可参考
4F:推 eye5002003: Rust是直接建立C lib还是先创造C程式码再编译? 12/25 23:41
Rust 没有建立 C 程式码,会直接编译成 C lib
5F:推 CoNsTaR: 不想要 functional 的麻烦又想要 functional 的严谨推 Ru 12/26 03:22
6F:→ CoNsTaR: st 12/26 03:22
7F:推 CaptainH: rust的lifetime syntax丑得可怕 12/26 07:51
8F:推 lc85301: lifetime syntax 很丑是定番了,所有批评都会看到这条XD 12/26 17:32
9F:→ lc85301: 然後还有编译器很GY,这也是定番XD 12/26 17:33
Rust 的某些语法的确不太美观,再加上那个 GY 的编译器...
只能靠多练习来克服 冏rz
10F:推 lc85301: swift-apple, golang-google, rust-mozilla 12/26 17:35
11F:→ lc85301: rust 比较没大公司撑腰也是真的 12/26 17:36
12F:推 shadow0326: 'a 'b 'c 'd 'wtf 12/26 19:04
13F:推 makeman: 'w 't 'f 12/26 20:27
14F:→ descent: 什麽时候不想用 c/c++ 而想用 rust 呢? 12/27 00:42
小弟没有维护 C/C++ 专案的包袱,可以自由使用新的语言
目前还在学习阶段,都是拿来写简单的 sample code 而已
其实也没有非用 Rust 不可,主要是欣赏 Rust 的一些设计
学一阵子 Rust 在回头学 C++,会增进对 C++ 的了解,蛮有趣的
15F:推 stupid0319: 主要是钱景吧,钱景大概swift>java>C#>>>>>>>Rust 12/27 01:15
※ 编辑: Neisseria (175.180.97.96), 12/27/2016 06:17:22
16F:推 ronin728: 如果它有GC又去掉Ownership的话,我也许会考虑。 12/27 11:01
17F:→ ronin728: 但他目前这种特性来说,即便它更高阶,我还是宁愿用C++ 12/27 11:04
18F:→ ronin728: Swift有ARC(自动插入reference counter, 并解决循环引用 12/27 11:06
19F:→ ronin728: ),我觉得这就很不错 12/27 11:06
20F:推 Klauhal: 版标XD 12/27 14:59
21F:→ uranusjr: ARC 哪里有解决循环引用, 幻想的吗... 12/27 15:07
22F:推 lc85301: 版标XDD 12/27 15:43
23F:推 yoco315: 小妹我也在学 rust ^^~* 大家一起唷~~~ 12/27 18:13
24F:推 littleshan: rust 明明就有 smart pointer 12/27 18:48
25F:→ littleshan: 你用 smart pointer 存指标就不需要处理 lifetime 12/27 18:53
26F:→ littleshan: 不想负担smart pointer的额外成本时就要处理lifetime 12/27 18:54
27F:→ littleshan: rust 是给你选择权的,和 C++ 的理念并无太大差异 12/27 18:55
28F:推 CaptainH: rust的卖点就是不必手动管理记忆体吗?结果还是要用smar 12/27 19:03
29F:→ CaptainH: t ptr这种半自动的东西? 12/27 19:03
30F:→ uranusjr: Rust 现在已经没有 smart pointers 了 12/28 00:01
31F:→ littleshan: 呃,perl 的 reference 其实也是 smart pointer 12/28 01:25
32F:→ littleshan: 所以 perl 不算自动管理记忆体? 12/28 01:25
33F:→ littleshan: 然後,rust 的 Box/Rc/Arc 不就是 smart pointer 吗? 12/28 01:28
34F:推 CaptainH: Perl本来就是很糟糕的语言啊 rust是要跟perl比? 12/28 08:38
35F:→ littleshan: perl 的问题与它使用 reference counting 无关 12/28 10:35
36F:→ littleshan: 没有人会否认 perl 有自动化的记忆体管理 12/28 10:40
37F:→ ronin728: 对不起,我错了,我误会了 Swift Orz 12/28 12:05
38F:→ uranusjr: @littleshan 原来你说的是广义的 smart pointer, 误会了 12/28 17:30
39F:→ uranusjr: 因为 Rust 早期就有一种东西叫做 smart pointer 12/28 17:31
40F:→ uranusjr: @CaptainH 好嘛那不提 Perl, Python Objective-C Swift 12/28 17:31
41F:→ uranusjr: 也都是用 ref counting, 你讲的根本站不住脚 12/28 17:32
42F:→ uranusjr: 高阶如 Python 都有专门的 weakref 模组来处理循环引用 12/28 17:33
43F:推 makeman: 似乎没继承 也没多重继承 有个类似interface的东西? 12/28 18:12
Rust 的 trait 可以继承,也可以多重继承,是继承别的 trait
trait 本身不能实体化,只有 struct 可以实体化
但 trait 可做为 method 的参数来使用
struct 可以实作 trait 所定义的 method
但 struct 间不能继承,只能透过组成 (composition) 结合
可以想成 struct 是 class,trait 是 interface + abstract class
我以前以为 trait 只有 method 定义,而没有 method 实作
但其实 trait 可以有 method 的实作,例如 Rust 的 Iterator:
https://github.com/rust-lang/rust/blob/master/src/libcore/iter/iterator.rs
程式设计者也可以实作自己的 Iterator,只要实作 next 这个 method
其他所有的高阶函式,都由 Iterator 这个 trait 提供
有点像 Java 8 的 interface,可以实作 code 在 interface 里
44F:→ makeman: gui的话,好的framework大多偏oop的写法rust能胜任吗? 12/28 18:15
Rust 是有一些 GUI,大概都是 language binding
像是 GTK:
http://gtk-rs.org/
或是 QT:
https://github.com/cyndis/qmlrs (只是其中一个)
看起来,GTK 那边似乎比较活跃
目前来说,GUI 应该不算强项
如果要做的软体是以 GUI 为重,可能要选别的方案比较好
但我还没深入学 gtk-rs,可能有误,仅供参考
Rust 的 OOP 和 C++ 或 Java 不同,写的方式要调整一下
刚开始会不太习惯,後来就会自动调整成 Rusty way
※ 编辑: Neisseria (175.182.138.65), 12/28/2016 20:13:16
45F:推 littleshan: 真要做到 C++ 式继承可以用 composition+deref trait 12/29 02:47
46F:→ littleshan: 不过 OOP 原则上都是鼓励多用组合少用继承 12/29 02:51
47F:→ littleshan: 这样的设计我认为没什麽大碍,GoF 的 design pattern 12/29 02:54
48F:→ littleshan: 都可以实现,除了 singleton 以外 XD 12/29 02:54
其实可以做 singleten,用 lazy_static! + Mutex
本来我也不会做,但 stackoverflow 有强者解答这个问题:
http://bit.ly/2i99XvW (Stackoverflow 网址)
※ 编辑: Neisseria (175.180.171.62), 12/29/2016 07:33:36
49F:推 firejox: 那我也来推Crystal (′・ω・`) 12/29 17:38
如果大大有整理 Crystal 的心得,欢迎来 Ruby 版贴
有在用 Ruby 的人应该会对 Crystal 蛮有兴趣的
※ 编辑: Neisseria (175.180.171.62), 12/29/2016 19:54:25
50F:推 SLMT: 路过,看到版标写 Rust 进来看看 01/03 02:19
51F:→ SLMT: 小的半年前开始摸,以为台湾没什麽人在玩 Rust 01/03 02:20
52F:→ SLMT: 看到这麽多人对 Rust 有这麽深入的了解感觉台湾还是有众多 01/03 02:21
53F:→ SLMT: 高手的XD 01/03 02:21
54F:→ SLMT: 不过 Rust 的学习曲线真有点陡峭 01/03 02:22
55F:→ SLMT: Ownership 的观念要花点时间消化,严格的编译器也常让人沮 01/03 02:24
56F:→ SLMT: 丧 01/03 02:24