[閒聊] Rust 的實用性?

看板C_and_CPP作者 (Neisseria)時間7年前 (2016/12/25 20:17), 7年前編輯推噓22(22034)
留言56則, 17人參與, 最新討論串1/2 (看更多)
這篇是聊 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://www.ptt.cc/bbs/C_and_CPP/M.1482668235.A.3D0.html

12/25 20:39, , 1F
只要跟C/C++相關,准你發。
12/25 20:39, 1F

12/25 21:11, , 2F
語言不穩定是硬傷,又不像swift有apple在推
12/25 21:11, 2F

12/25 21:39, , 3F
聽說有用Rust開發的作業系統,是真的嗎?
12/25 21:39, 3F

12/25 23:41, , 4F
Rust是直接建立C lib還是先創造C程式碼再編譯?
12/25 23:41, 4F
Rust 沒有建立 C 程式碼,會直接編譯成 C lib

12/26 03:22, , 5F
不想要 functional 的麻煩又想要 functional 的嚴謹推 Ru
12/26 03:22, 5F

12/26 03:22, , 6F
st
12/26 03:22, 6F

12/26 07:51, , 7F
rust的lifetime syntax醜得可怕
12/26 07:51, 7F

12/26 17:32, , 8F
lifetime syntax 很醜是定番了,所有批評都會看到這條XD
12/26 17:32, 8F

12/26 17:33, , 9F
然後還有編譯器很GY,這也是定番XD
12/26 17:33, 9F
Rust 的某些語法的確不太美觀,再加上那個 GY 的編譯器... 只能靠多練習來克服 冏rz

12/26 17:35, , 10F
swift-apple, golang-google, rust-mozilla
12/26 17:35, 10F

12/26 17:36, , 11F
rust 比較沒大公司撐腰也是真的
12/26 17:36, 11F

12/26 19:04, , 12F
'a 'b 'c 'd 'wtf
12/26 19:04, 12F

12/26 20:27, , 13F
'w 't 'f
12/26 20:27, 13F

12/27 00:42, , 14F
什麼時候不想用 c/c++ 而想用 rust 呢?
12/27 00:42, 14F
小弟沒有維護 C/C++ 專案的包袱,可以自由使用新的語言 目前還在學習階段,都是拿來寫簡單的 sample code 而已 其實也沒有非用 Rust 不可,主要是欣賞 Rust 的一些設計 學一陣子 Rust 在回頭學 C++,會增進對 C++ 的了解,蠻有趣的

12/27 01:15, , 15F
主要是錢景吧,錢景大概swift>java>C#>>>>>>>Rust
12/27 01:15, 15F
※ 編輯: Neisseria (175.180.97.96), 12/27/2016 06:17:22

12/27 11:01, , 16F
如果它有GC又去掉Ownership的話,我也許會考慮。
12/27 11:01, 16F

12/27 11:04, , 17F
但他目前這種特性來說,即便它更高階,我還是寧願用C++
12/27 11:04, 17F

12/27 11:06, , 18F
Swift有ARC(自動插入reference counter, 並解決循環引用
12/27 11:06, 18F

12/27 11:06, , 19F
),我覺得這就很不錯
12/27 11:06, 19F

12/27 14:59, , 20F
版標XD
12/27 14:59, 20F

12/27 15:07, , 21F
ARC 哪裡有解決循環引用, 幻想的嗎...
12/27 15:07, 21F

12/27 15:43, , 22F
版標XDD
12/27 15:43, 22F

12/27 18:13, , 23F
小妹我也在學 rust ^^~* 大家一起唷~~~
12/27 18:13, 23F

12/27 18:48, , 24F
rust 明明就有 smart pointer
12/27 18:48, 24F

12/27 18:53, , 25F
你用 smart pointer 存指標就不需要處理 lifetime
12/27 18:53, 25F

12/27 18:54, , 26F
不想負擔smart pointer的額外成本時就要處理lifetime
12/27 18:54, 26F

12/27 18:55, , 27F
rust 是給你選擇權的,和 C++ 的理念並無太大差異
12/27 18:55, 27F

12/27 19:03, , 28F
rust的賣點就是不必手動管理記憶體嗎?結果還是要用smar
12/27 19:03, 28F

12/27 19:03, , 29F
t ptr這種半自動的東西?
12/27 19:03, 29F

12/28 00:01, , 30F
Rust 現在已經沒有 smart pointers 了
12/28 00:01, 30F

12/28 01:25, , 31F
呃,perl 的 reference 其實也是 smart pointer
12/28 01:25, 31F

12/28 01:25, , 32F
所以 perl 不算自動管理記憶體?
12/28 01:25, 32F

12/28 01:28, , 33F
然後,rust 的 Box/Rc/Arc 不就是 smart pointer 嗎?
12/28 01:28, 33F

12/28 08:38, , 34F
Perl本來就是很糟糕的語言啊 rust是要跟perl比?
12/28 08:38, 34F

12/28 10:35, , 35F
perl 的問題與它使用 reference counting 無關
12/28 10:35, 35F

12/28 10:40, , 36F
沒有人會否認 perl 有自動化的記憶體管理
12/28 10:40, 36F

12/28 12:05, , 37F
對不起,我錯了,我誤會了 Swift Orz
12/28 12:05, 37F

12/28 17:30, , 38F
@littleshan 原來你說的是廣義的 smart pointer, 誤會了
12/28 17:30, 38F

12/28 17:31, , 39F
因為 Rust 早期就有一種東西叫做 smart pointer
12/28 17:31, 39F

12/28 17:31, , 40F
@CaptainH 好嘛那不提 Perl, Python Objective-C Swift
12/28 17:31, 40F

12/28 17:32, , 41F
也都是用 ref counting, 你講的根本站不住腳
12/28 17:32, 41F

12/28 17:33, , 42F
高階如 Python 都有專門的 weakref 模組來處理循環引用
12/28 17:33, 42F

12/28 18:12, , 43F
似乎沒繼承 也沒多重繼承 有個類似interface的東西?
12/28 18:12, 43F
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 裡

12/28 18:15, , 44F
gui的話,好的framework大多偏oop的寫法rust能勝任嗎?
12/28 18:15, 44F
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

12/29 02:47, , 45F
真要做到 C++ 式繼承可以用 composition+deref trait
12/29 02:47, 45F

12/29 02:51, , 46F
不過 OOP 原則上都是鼓勵多用組合少用繼承
12/29 02:51, 46F

12/29 02:54, , 47F
這樣的設計我認為沒什麼大礙,GoF 的 design pattern
12/29 02:54, 47F

12/29 02:54, , 48F
都可以實現,除了 singleton 以外 XD
12/29 02:54, 48F
其實可以做 singleten,用 lazy_static! + Mutex 本來我也不會做,但 stackoverflow 有強者解答這個問題: http://bit.ly/2i99XvW (Stackoverflow 網址) ※ 編輯: Neisseria (175.180.171.62), 12/29/2016 07:33:36

12/29 17:38, , 49F
那我也來推Crystal (′・ω・`)
12/29 17:38, 49F
如果大大有整理 Crystal 的心得,歡迎來 Ruby 版貼 有在用 Ruby 的人應該會對 Crystal 蠻有興趣的 ※ 編輯: Neisseria (175.180.171.62), 12/29/2016 19:54:25

01/03 02:19, , 50F
路過,看到版標寫 Rust 進來看看
01/03 02:19, 50F

01/03 02:20, , 51F
小的半年前開始摸,以為台灣沒什麼人在玩 Rust
01/03 02:20, 51F

01/03 02:21, , 52F
看到這麼多人對 Rust 有這麼深入的了解感覺台灣還是有眾多
01/03 02:21, 52F

01/03 02:21, , 53F
高手的XD
01/03 02:21, 53F

01/03 02:22, , 54F
不過 Rust 的學習曲線真有點陡峭
01/03 02:22, 54F

01/03 02:24, , 55F
Ownership 的觀念要花點時間消化,嚴格的編譯器也常讓人沮
01/03 02:24, 55F

01/03 02:24, , 56F
01/03 02:24, 56F
文章代碼(AID): #1ONxZBFG (C_and_CPP)
文章代碼(AID): #1ONxZBFG (C_and_CPP)