Go 語言和 Scala 語言對比
我在Google寫過Go(自己的業余時間),也在LinkedIn寫過Scala。兩者都是具有一流的並發特性的現代語言。
下面的回答是基於我編寫大規模的軟件的經驗得出。
Go是一種開發模式嚴格固定,並且以最小代碼量編譯成機器代碼的語言。
Scala是一種擁有多種特性並運行在JVM上的,復雜的、學術性的、功能性的、面向對象的沙箱語言。
對於絕大多數開發者的任何一個項目,我每次更願意選擇Go而不是Scala的一個原因是:簡單。
在我開始回答問題之前,我要進行一些基本的觀察:
- 一般來說,代碼越少越容易理解;然而,有一點是代碼非常密集,以至於很難讀懂。
- 代碼讀起來要比寫得多。
- 代碼的壽命比我們想要的要長。
- 測試或維護一段代碼的人常常不是原作者。
- 在規模上,讀取/寫入/維護/測試代碼的開發人員的技能水平將會是“非專家”意義上的正常分布。
編寫代碼是一種通信行為,不僅是作者和編譯器(或運行時)之間的通信,而且也是作者與未知技能水平的未來讀者之間的交流。
語言的復雜性
Java 8語言規範是780頁的PDF。
http://docs.oracle.com/javase/sp...
Scala語言規範是一個191頁的PDF。
http://www.scala-lang.org/docu/f...
Go語言規範是一個網頁,打印為51頁的PDF。
http://golang.org/ref/spec
定義一門語言與學習如何使用一門語言是不一樣的,但它代表了學習的內容(或者在閱讀別人的代碼時,有多少東西會讓你感到困惑)。
精簡指令集計算機vs 復雜指令集計算機
Go提供了一組小的正交原語,它們以清晰的預期方式相互作用。學習少量的原語,並與Scala相比,用更多的代碼行構建所需的內容。
Scala提供了大量類型和語法的工具箱。學習大量的原語,知道什麽時候使用每一個,並且與Go相比,您將能夠編寫更少的代碼行。
文件
我找到了更容易學習的方法,都是因為它是一種更簡單的語言,而且是主觀的因為我覺得文檔更好。
http://docs.scala-lang.org/tutor...
vs
http://tour.golang.org/#1
http://golang.org/doc/effective_...
常見問題解答:
http://docs.scala-lang.org/tutor...
vs
http://golang.org/doc/faq
Standard library:
http://www.scala-lang.org/api/cu...
vs
http://golang.org/pkg/
表現能力
考慮到語言規範,Scala有比Go更多的特性也就不足為奇了。
Go的一個特點是它沒有多余的功能,老實說,我認為它的功能被低估了。
http://golang.org/doc/faq#Why_do...
這是否意味著Go比Scala更缺乏表現力?
不。
表達性是指“有效傳達思想或感覺”;這並不意味著“哪種語言最具特色”。在實踐中,代碼的表現力更多地取決於作者而不是使用的語言。
代碼密度可能會對表達性產生反作用。
模擬城市效果
別用谷歌搜索,我只是編出來的。你知道模擬城市,對吧?
SimCity Official Website
如果兩個人在同一張地圖上建立一個新城市,再經營幾個小時,他們就會生產出截然不同的城市。
這是為什麽呢?
因為模擬城市像是一個沙箱,有太多的選擇,所以任何兩個人都會做出同樣的決定,這是非常不可能的事情。
Scala也是一個沙箱。
除了Scala附帶的大量特性(函數式編程特性、OO編程特性等)之外,Scala還公開了允許開發人員添加新特性的功能。
這一切都很好,除非你和別人分享你的沙盒,否則他們不知道你腦子裏在想什麽。
代碼的一致性
Go是我所知道的唯一一種通過提供一種工具以規範格式對代碼進行格式化的方法,從而規避了整個代碼風格的爭論。
http://golang.org/cmd/gofmt/
代碼密度
在學習的早期階段,Scala代碼可能會非常的密集和困難。我想說的是,在Scala中盡可能地密集是很有經驗的,或者至少是經驗豐富的Scala開發人員有一種簡潔的傾向。
例如
考慮從cookie獲取用戶ID。 你需要多少語言知識來回答如何實現下列問題?
- 如果cookie不存在會發生什麽?
- 如果cookie值不是格式化好的數字會發生什麽?
- 如果cookie值是負數會發生什麽?
Scala
import play.api.mvc.RequestHeader
def getUserId()(implicit request: RequestHeader) = {
request.cookies.get("uid").map(_.value.toLong).filter(_ > 0)
}
Go
import (
"fmt"
"http"
"strconv"
)
func getUserId(r *http.Request) (int64, error) {
c, err := r.Cookie("uid")
if err != nil {
return 0, err
}
i, err := strconv.ParseInt(c.Value, 10, 64)
if err != nil {
return 0, err
}
if i <= 0 {
return 0, fmt.Errorf("invalid user id")
}
return i, nil
}
第 3 段(可獲 0.7 積分)
0墨鏡大頭1年前
在這種特殊情況下, Scala代碼很短也許更有說服力, 但有一點我想說明一般來說 Go的代碼是顯式的而Scala的代碼需要上下文來理解。
顯示的$#%!ing
根據我的經驗,顯式代碼有很多好處。
- 顯式代碼更易於讓新手和非作者精神交流。
- 顯式代碼更易於編輯小的變更。
- 顯式代碼使錯誤情況更清晰。
- 顯式代碼使測試用例清晰。
- 顯式代碼更容易調試 (嘗試在之前Scala代碼中設置斷點 ).
我發現Go的代碼比Scala清晰的多。
性能
作為一名開發者,性能是我在開發周期中唯一所關心的, 因為我不想遇到一個在我想做到什麽的時候而不夠快的運行時。無論如何開發者的時間比電腦的時間更有價值。
根據我的經驗, Go編譯非常塊, Scala則相對慢些。因人而異。
說句公道話
我在學Scala之前先學習的Go,所以我承認我更傾向GO。我對Go第一反應是它的語法很難看 (像C++) 但是學習Go的感覺像這樣:
我是出於必要學習的Scala並且已經習慣了它;我現在甚至喜歡上它的一部分, 但學習Scala是這種感覺:
Go 語言和 Scala 語言對比