已經學了一段Python,喜歡他的風格。像庫概念,變數定義,編程風格都喜歡。
對指標概念不太理解,C++停留在大一上的VC6.0時代。
想再學一門快速編譯型的語言。哪位能比較一下Rust和Go,根據以上內容推薦一個。(比較內容詳細點更好)
回複內容:
自己花時間學下,就有能力比較了。
http://tour.golang.org/#1
和
The Rust Guide
rust沒有runtime,go有runtime,所以同樣的工作比如記憶體管理,rust傾向於在編譯期做,go傾向於在運行期做。這都是和他們最初的目的相符的,rust用於寫瀏覽器,需要效能,go用於寫網路服務的伺服器端,runtime強點線上調試起來也方便。雖然都是通用型語言,但是是有傾向有側重的。
這都是我個人的看法,其他人可能覺得這種區別沒什麼意義。花括弧能否獨立做一行,有沒有泛型,好不好學,庫多不多,他們可能認為這些比較重要。
所以比較兩個語言這種事,還是自己做功課吧。python和這兩個語言差別都很大,沒有參考性。利益相關:一年前就開始使用Go,Rust是從0.9-dev開始使用到現在0.13-dev。
Go本質上與C沒有太大的區別,它的Runtime實際上就是wrap了一下libc,然後在文法層面提供了各種文法糖。但是它寫起來比C舒服多了,類型推導、多傳回值、interface、GC等等的特性,會讓有Python經驗的人覺得異常的親切。不過話說回來,Go和Python是沒辦法拿來比較的,在長期使用之後會更加發現出兩者的不同。
Rust目前還在dev階段,據說年底beta,文法還在變動,下面所有的說法都基於0.13-dev。Rust如果與Go比較,可以類比成C++與C的比較(不嚴謹)。
1. Rust沒有Runtime,所有的記憶體管理都在編譯期完成。在Rust中比較突出的一個特性就是「Lifetime 生存期」,它就是編譯器用來管理某個Object從構造到析構整個過程,因此在編譯期就可以做到記憶體管理,避免開發人員手動管理記憶體,也避免了記憶體泄露。雖然這種方法聽起來覺得非常的完美,從0.9-dev到0.13-dev這段時期,生存期管理也變得更加智能和人性化,不過真的遇到編譯器無法推測對象的生存期需要你手動去指定的時候,老實說對不熟悉的人來說也是非常的傷腦筋。
2. Rust對代碼的安全性要求非常的高,從文法上規定了各種的約束(比如一個變數不能被borrow as mutable多於一次等),可以讓編譯器在編譯時間就幫你找出一些可能會出現Bug的點,然後編譯失敗逼你去把代碼改成更安全的寫法,編譯器的要求可謂非常的嚴格,初學者基本就是每寫一段代碼就跪著問rustc到底對不對,和跪著問Google到底我為什麼我寫錯了。在學Rust的這段時間裡,Rust編譯器糾正了我許多不好的編程習慣和教會了寫代碼要先全面地考慮(不然編譯不過)。這種特性也讓Rust實現了它宣傳語中的那句話:prevents almost all crashes*, and eliminates data races
3. Rust寫同樣的一段程式跑得比Go要快,甚至有測試顯示它的速度已經達到了Java的層級。(測試是在Hacker News上看到了,找到之後放上來)。
4. Rust編譯目前遠沒有Go那麼快。
5. Go有內建的goroutine,是輕量級的線程,而Rust在目前的版本已經從標準庫移去了rustuv,預設使用Native thread來實現非同步,使用起來和goroutine一樣方便,相關的討論可以在Hacker News上找到,The Rust standard library no longer has any scheduling baked into it
。兩者都有builtin的channel用於實現同步。(備忘:Rust從標準庫中移去了rustuv不代表它不支援green thread,而是選擇了把EventLoop的實現交給社區,標準庫只做介面,Scheduler rewrite with I/O event loop · Issue #4419 · rust-lang/rust · GitHub
,預設標準庫中的EventLoop不支援I/O)。
6. 講到Rust不得不提它的Pattern matching,實在太過強大難以言表,請有興趣的人去看一下Rust的文檔相關的部分。據說源自Haskell。
對比Go和Rust,我的選擇是Rust。但是它們和Python都相差挺大,Python的使用經驗在這兩門語言中的可複用性不算太大。
最近用Rust寫了一個shadowsocks-rust: zonyitoo/shadowsocks-rust · GitHub
,歡迎喜歡的同學一起來交流。學會一門需要 200 個小時,兩門總共需要 400 個小時,占你的總資產的(每天8小時,每年365天,70年,總計204400小時)的 0.2%
所以,買買買,兩門都學就好了。
好像是 PG 的《On Lisp》的說法,決定你是否學習一門語言要取決於這門語言能否教給你新的思維方式。從這個角度來說,對 Python 背景的人,Go 和 Rust 都是很好的選擇。
說一下題主提的這幾樣:
- 庫概念:Rust 合格,Go 合格。它們的模組管理方式都和 Python 類似,Go 更像 Python,Rust 的管理方式在清晰、易管理的同時更靈活。
- 變數定義:Rust 和 Go 都是靜態類型的,它們有各自的方法避免你被迫於強靜態類型的限制而打太多字。Go 的類型體系都是線條型的,靠類型推導就可以避開局部變數的顯式型別宣告,除非你要用 type assert 把 interface 類型轉為具體類型,或者把具體類型轉為 interface 類型。Rust 相比之下有一個豐富的類型系統,它需要更聰明的 HM 推導系統來確定變數的類型,這就導致一種風格是你先不指定具體類型,等編譯器提示某些值的類型它無法確定你再補上相應的型別宣告。總的來說它們的打字的強度是接近的(除非你想用泛型做高層次的抽象,那麼這些更泛用的代碼自然會比對應版本的完全沒有抽象的代碼的量多一些,不過這種情況下 Go 沒有對應物因為 Go 沒法做泛型程式設計)。
- 編程風格:Go 和 Rust 喜歡一定程度的透明性,要寫出高效的代碼而不要去做過度抽象。所以 Rust 和 Go 的抽象都是著手於概念。Go 是用 interface 表達概念,例如 io.Writer;Rust 用 trait 表達概念例如 std::iter::Iterator。除去概念,它們的手法都是編寫一些不同形式的用於操縱資料的函數。沒有類,只有裸的資料,而在思維上這些概念是和函數綁定的而不是和資料繫結的。資料封裝是利用庫之間的變數、類型、函數的可見度 。Rust 的 trait 有靜態派發和動態派發兩類場合,動態派發基於指標、虛函數表;靜態派發基於泛型。Go 的 interface 僅限於動態派發,它依賴於指標和反射。
這裡有個 C++、D、Rust、Go 放一起討論的娛樂向視頻:Panel: Systems Programming in 2014 and Beyond,討論者都是四種語言自己的主力設計者(BS、D的維護者、Niko、Pike)。
上面談到程式設計方面的風格,我說一下命名方面的風格:
- Go 沒有風格指南,但它都是用的是一種 CamelCase 駝峰風格來命名函數和類型。主要是按照 C 的習慣稱呼一些老概念,根據這些來適配成駝峰風格。由於沒有風格指南,凡事都有例外,比如 Go by Example: Structs 就採用全小寫不加底線的風格。
- Rust 有個風格指南,項目在這裡,可以從這裡瀏覽。類型名採用駝峰風格,函數採用傳統的 C 家族風格,snake_case。這個選擇剛好和 Python 的 PEP8 一致,相信會讓你感到愉快。
我們學習語言的目的是什嗎?解決項目的問題和解決生活的問題。
那麼我們從兩反面來看這個問題,第一項目的問題,Go和rust都是靜態編譯類型的語言,效能來說我之前看過對比,rust的更好一點,但是複雜度也是rust會更高,從我的角度來說,複雜度增加我是不能接受的,我需要一個簡單的文法,讓後面的維護變得容易,而這個效能的差距直接可以忽略,而且Go的版本發布穩定有序,Go目前最大的問題就是GC和泛型,泛型估計是不會解決了,GC的話目前來看已經解決的不錯了,1.5版本解決GC問題。當然兩個語言都學習一下也是不錯的,學習兩種語言的解決方案,就像 @李道兵說的兩個都學習一下也不會浪費你多少時間。
第二個生活的問題,golang和rust招聘崗位,可以去各大招聘網站看看,rust有招聘的嗎?golang有招聘的嗎?現有大型公司更加偏向golang還是rust,這個公開的資料你都可以搜尋的到,很顯然的是golang各大公司都在使用,主要是docker的成功,成為了golang語言的第一個killer應用,很多公司使用docker作為他們接下來的部署系統。同時各個公司也使用golang開發了很多成功的系統。我相信會越來越多的公司招聘golang工程師,話說我最近就在招聘,新加坡Go工程師,新加坡公司招聘Go工程師
歡迎各位有志之士來人肉翻牆啊我是從Java兩年轉python兩年轉go一年,用過Java的感覺是架構好多好難學,而且一種架構忽然有一天升完級後我傻眼了(和上一個版本完全變樣了),精力全耗在追逐架構上了。在Ruby如日中天的時候我也決定試一下動態語言,對比了Ruby和Python後,我喜歡上Python的中規中矩的文法和它超級豐富的庫,我覺得找到了真愛,她讓我和Java分手後有了很多驚喜:哇,文法超簡單,我以前和Java說十句,和她說一句就明白,溝通(開發)效率提升十倍誒;哇,學一周就可以做項目了,你太單純了;哇,web效率比Java快好多呀;我以為我們會相伴終身,可是相處久了越來越覺得對方的缺點不可容忍:營運部署好煩,Windows上開發完放到Linux上所有的關聯庫重新下載。滿世界的語言好多支援多核並發時,她因為 JIT鎖只能用multiprocessing處理,這個庫效率低又得又主進程式控制制,主一出問題全線崩。一年半前我遇到了go,她優雅的氣質一下就把我迷住了:哇,她可以把開發好的程式和關聯庫直接跨平台傳;哇,她竟然可以直接編譯機器碼傳到生產機執行;哇,她的文法和Python一樣簡單而且類似,我以前的代碼基本沒費多少功夫她就全部接管了;哇,她的指標可以讓我實現以前不能直接接觸的底層硬體;哇,並發好簡單,好高效;哇,她不用任何架構中介軟體就能把web和資料打理的井井有條。她的缺點就是年紀小,成熟可用的庫不多,但這正可以讓我更多的DIY。我們相伴至今一年多,我又一次覺得我找到了真愛。rust嘛,發育太慢至今未成年,追求成本太高,風險不可控呀。學Erlang吧…(逃)
首先你得先問自己,既然已經會了大蟒蛇,為什麼還要再去學其他得程式設計語言?
至於我,答案是為了拓展自己的編程思維。
出於這個目的,我推薦rust。它強迫我審視代碼的每一處,包括但不限於,變數的作用範圍,最小化需要使用的api依賴。
這些是我在理解borrowing,ownership時被迫要去想清楚的。當然rust還有其他很多東西。
我學到的只是皮毛。
這裡只是想強調它帶給我思維上的變化。
很多人都說這門語言給人感覺很複雜。
其實沒有,只是不習慣rust的編程方式罷了
對於Rust不熟悉,最近正在學習Go,個人感覺在syntax對於Pythonista有天然的親和性
1.不用打分號
2.核心資料結構近似,slice對應list,map對於dict,操作符的風格幾乎都是一樣的
3.Go雖說的靜態語言,但是由於有自動類型推導(:=)的存在,寫起來不費事兒
4.duck typing
當然以上是從syntax角度來談的,本質上Python和Go還是相當不同的語言,比如對待OOP的態度上面,兩者相差就非常遠。異常處理的風格也差別挺多的(不過這貌似是Go摒棄了一般意義上的基於繼承的類型樹的必然結果?)。Go在語言層面就內建一些concurrent feature對於Pythonista可能會比較新奇,比如channel/select等等。不過總的來說,有Python背景,Go的學習曲線會比較平穩。
延伸閱讀:
http://s3.amazonaws.com/golangweekly/go_for_pythonistas.pdf
題主自身的情況是:Python初學者,不理解指標概念,想再學一門快速編譯型的語言,並要求在Go和Rust兩者之間選擇一個。
我只能幫題主推薦Go語言。你要簡單,要編譯快,並且二選一,那隻能是Go語言。Rust語言相對而言要更複雜,更底層,不深刻理解指標概念顯然是不可能學會Rust的。
但是,我個人不喜歡Go語言,還曾經寫過一大篇《我為什麼放棄Go語言》。跟另一位答主 @鐘宇騰 一樣,我選擇Rust語言,我選擇我喜歡。對於在C/C++領域摸爬滾打十多年的人群而言,Rust實在是太有誘惑力了。(初學者往往體會不到這一層。)