掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
介紹

自從我參與DevOps和大數(shù)據(jù)以來,我一直在使用兩種出色的但完全不同的編程語言:Go和Scala。
Scala是一種較舊且更成熟的編程語言,已在并發(fā)編程和大數(shù)據(jù)處理等領(lǐng)域找到了自己的定位。 另一方面,Go是Google為克服C ++的批評而創(chuàng)建的一種更新,更簡單的語言。 設(shè)計考慮多核處理器的語言。
兩者都是出色的語言,可以為并發(fā)應(yīng)用程序和流處理實現(xiàn)出色的性能,但是它們的設(shè)計卻大不相同。在本文中,我將嘗試為您簡要介紹這兩種語言,它們的優(yōu)缺點,并回顧一些實際的用詞情況,在這些情況下,我們將推薦一種語言而不是另一種語言。
簡而言之Scala
Scala是一種由學(xué)者創(chuàng)建的編程語言,它是在JVM上運行的Java的第一種替代方法。 它定義為:
Scala是一種現(xiàn)代的多范式編程語言,旨在以簡潔,優(yōu)雅且類型安全的方式表達常見的編程模式。[1]
Scala既面向功能又面向?qū)ο?,提供了兩全其美的?yōu)勢。 它具有定義程序的靈活方式,并且由您決定如何描述它們:從純函數(shù)式編程到純面向?qū)ο蟮木幊獭?/p>
像Java一樣,Scala是面向?qū)ο蟮模?/p>
從每個值都是對象的意義上講,Scala是一種純面向?qū)ο蟮恼Z言。對象的類型和行為通過類和特征來描述。[1]
它還為功能編程和強大的靜態(tài)類型系統(tǒng)提供支持。 與Java不同,Scala具有功能編程語言的許多功能,例如Scheme,Standard ML和Haskell,包括currying,類型推斷,不變性,惰性評估和模式匹配。 它還具有一個高級類型系統(tǒng),該系統(tǒng)支持代數(shù)數(shù)據(jù)類型,協(xié)方差和對數(shù),高階類型(但不包括高階類型)和匿名類型。
從每個功能都是一個值的意義上講,Scala也是一種功能語言。 Scala提供了用于定義匿名函數(shù)的輕量級語法,它支持高階函數(shù),它允許嵌套函數(shù),并支持currying。[1]
Java中不存在的Scala的其他功能包括運算符重載,可選參數(shù),命名參數(shù)和原始字符串。 相反,Scala中沒有的Java功能就是檢查異常,事實證明這是有爭議的。
在其他用例中,Scala在大數(shù)據(jù)中被大量使用。 諸如Twitter之類的公司轉(zhuǎn)移到Scala,特別是因為更好的并發(fā)支持。 Scala功能強大,但很難學(xué)習(xí),并且仍然存在與Java的兼容性問題。
Scala使用的兩個關(guān)鍵驅(qū)動因素是基于用于并行編程的actor系統(tǒng)的Akka框架和用于大數(shù)據(jù)的Spark處理引擎。 由于其學(xué)術(shù)性質(zhì),與Akka或Spark以外的其他語言相比,Scala在實際單詞中沒有發(fā)現(xiàn)太多用法。 盡管它在金融機構(gòu)中大量使用。
Scala 的優(yōu)點
Scala 的缺點
用例
簡而言之
Go是另一種野獸。與Scala相比,它不那么優(yōu)雅,功能強大或簡潔,但它是為特定目的而構(gòu)建的,并且做得非常好。
Go由Google創(chuàng)建,并且在語法上與C類似。它的目標是通過添加內(nèi)存安全性,垃圾回收,結(jié)構(gòu)化類型來克服C ++中存在的不安全操作。它非常容易學(xué)習(xí)和使用。它是為多核計算機而構(gòu)建的,以最大程度地提高并發(fā)程序的并行性。它使用稱為Go Routines的非常輕量級的綠色線程進行并發(fā)編程。
Go可以快速編譯為機器代碼,但具有垃圾回收的便利性和運行時反射的功能。這是一種快速的,靜態(tài)類型的編譯語言,感覺就像是一種動態(tài)類型的解釋語言。[2]
Go很小,但是它涵蓋了許多用例,例如微服務(wù),流處理,CLI等。 Golang為在不同平臺上生成二進制文件提供了出色的支持,而無需在目標上安裝Go。 由于二進制文件小而有效,因此非常適合使用Containers打包的云本機應(yīng)用程序。 您的應(yīng)用程序容器可以打包到一個很小的容器(?5–10MB)中,只需幾秒鐘即可部署,這使其成為比JVM語言更好的微服務(wù)選擇。 有關(guān)更多信息,請查看我有關(guān)在Kubernetes中部署Go Microservices的文章。
Go 的優(yōu)點
Go 的缺點
用例
Scala vs Go
Scala 編程語言是強類型,具有垃圾回收器,它們安全,高度并發(fā),并且每秒可以處理數(shù)百萬條記錄。
對于流處理,Go更易于使用,但依賴于發(fā)布/訂閱系統(tǒng)(例如Kafka)和NoSQL數(shù)據(jù)庫(例如Cassandra)。 Akka本身就是一頭野獸,可以自己管理大量請求而沒有任何依賴關(guān)系,它還提供了更多這樣的背壓。
對于Web應(yīng)用程序,Play框架更適合有狀態(tài)的Web應(yīng)用程序或壽命長的應(yīng)用程序,在這些應(yīng)用程序中,JVM有足夠的時間來優(yōu)化應(yīng)用程序。 Scala非常適合迷你服務(wù)或整體應(yīng)用。 如果您需要與Akka集成,這也是一個不錯的選擇。 另一方面,GO更適合微服務(wù),云本機應(yīng)用程序和無服務(wù)器功能。 對于云中的無狀態(tài)API,我會使用GO,因為它更便宜,更容易。
Go提供了強大的支持gRPC為內(nèi)部微服務(wù)提供了絕佳的選擇,這些微服務(wù)可以以流的方式快速使用。
對于大數(shù)據(jù),Scala或Python是最佳選擇。 GO在大數(shù)據(jù)世界中仍處于起步階段。
通常,Go的運行和租賃成本較低。 因此,如果成本是一個問題,請研究GO。 另一方面,Scala開發(fā)人員往往是非常好的工程師,這也為組織帶來了價值。
隨著應(yīng)用程序的增長,GO源代碼將變得越來越難以維護,因此我不建議將其作為整體使用,對于更穩(wěn)定,規(guī)模更大的項目,Scala是更好的選擇,尤其是對于更傳統(tǒng)的企業(yè)。
性能
這是一個棘手的問題,如果您在Google vs GO的性能方面會找到幾篇文章,并且根據(jù)測試結(jié)果會有所不同。 剛開始,GO似乎在簡單的用例上表現(xiàn)更好,但在實際情況下,Scala以及特別是Play Framework確實趕上了JIT JVM優(yōu)化,該優(yōu)化在運行時會調(diào)整字節(jié)碼添加優(yōu)化。
對于微服務(wù),無狀態(tài)應(yīng)用程序和容器化應(yīng)用程序,GO將更快,更輕量,這是一個巨大的優(yōu)勢。 通常,如果成本對您來說很重要,那么GO將占上風(fēng)。 對于復(fù)雜的應(yīng)用程序,整體式狀態(tài)處理,Scala是更好的選擇。
> GO vs Play REST Get Performance, source: https://medium.com/ymedialabs-innovation/rest-api-performance-comparison-between-golang-and-play-991a8f4040de
對于流處理,這是相同的故事。 Akka功能強大且優(yōu)雅,具有龐大的生態(tài)系統(tǒng)并具有更多功能,但使用,開發(fā)和優(yōu)化都很復(fù)雜。 如果您有一支由Akka開發(fā)人員組成的優(yōu)秀團隊,他們可以編寫一個單例文件,比GO更快地處理事件。 但是,GO擴展非常簡單。
推薦建議
如果您是開發(fā)人員…
簡而言之,GO既有趣又酷,易于學(xué)習(xí)且簡單。在3個月內(nèi),您可以編寫可用于實際用途的生產(chǎn)就緒應(yīng)用程序。Scala既有趣,復(fù)雜又具有挑戰(zhàn)性,但回報頗豐,它的薪酬很高,而且聲望更高,特別是在大數(shù)據(jù)世界中。
如果您是技術(shù)主管…
總而言之,GO是一種消耗很少且易于采用的二進制語言,對于您的工具帶來說它是一個不錯的工具,但是我不會將它用作大型組織的唯一編程語言,因為它不那么通用和其他語言一樣。Scala更加困難,但是如果您已經(jīng)在使用Java,那么這是一個很好的下一步。
如果您是經(jīng)理…
總而言之,GO的運行和雇用人才便宜。 它易于使用,可以在廣泛的用例中采用。 當您仍然是核心應(yīng)用程序的另一種語言時,它也可以用作補充語言。 Scala非常適合大型項目和大數(shù)據(jù)。 如果您在JVM上投入了大量資金,則Scala是常見的下一步。
結(jié)論
在過去的幾年中,我一直在使用Go和Scala,兩者都有其優(yōu)點和缺點。作為開發(fā)人員,我喜歡在Scala中解決問題,它非常優(yōu)雅,簡潔,強大。和使用的喜悅;但是在現(xiàn)實世界中,我傾向于更頻繁地使用GO,因為我可以更快,更便宜地完成工作。當您在需要賺錢的公司工作時,這就是這種方式。由于快速的編譯時間和部署時間以及極低的資源使用率,GO是用于云原生應(yīng)用程序的最具成本效益的語言。盡管如此,對于大數(shù)據(jù)和高度并發(fā)的關(guān)鍵系統(tǒng)來說,Scala是最佳選擇,它也比GO更成熟。對于更大,更傳統(tǒng)的企業(yè),Scala往往更適合。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流