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