為什麼選擇Rust作為物聯網的程式語言? - Ash Moosa

banq發表於2019-06-21

為新產品選擇程式語言是一項重要的戰略決策。它影響很多事情,對招聘,培養甚至產品的可行性都有長期影響。
首先要考慮的是語言是否適用於您要解決的特定問題陳述。重要的問題是:
  • 您的特定用例的語言是否合適?
  • 它會效能表現嗎?
  • 它會在目標平臺上執行嗎?

這些應該是主要問題。但是還有其他因素可能影響您的決定,例如:
  • 如何選擇特定語言會影響您從理念到現實的週轉時間?
  • 使用特定語言有哪些成本優勢?
  • 解決你可能偶然發現的新問題有多容易?

牢記這些問題,本文將嘗試解釋我們為新產品選擇Rust的原因。

用例
我們正在建立一種裝置,用於使用來自各種感測器的資料,並透過Web和移動應用程式提供實時分析和智慧幫助。我們需要一種語言,其速度足以允許最小的實時延遲並使用SoC裝置的有限資源。

以下是我們評估專案程式語言的方法。
1.效能
比較實際應用程式的跨語言效能是棘手的。我們通常沒有對多種語言擁有相同的專業知識,並且效能受到程式設計師選擇使用的演算法和資料結構的影響。但人們普遍認為Rust的表現與C ++相當。並且比其他直譯器或基於JIT的語言(如Lua或Python)執行得更好。資源

2.併發
如上面的用例所述,我們希望從多個感測器實時處理資料。我們的目標平臺SoC裝置使用基於ARM的CPU,通常有4個以上的核心。我們想要利用所有CPU核心,這意味著擁有多執行緒支援非常重要。

Lua沒有本機多執行緒支援。雖然有第三方解決方法,但這些方法的效能和可靠性值得懷疑。另一方面,Rust內建了對多執行緒的支援,它的所有權和借用規則幫助我們編寫非常安全的併發程式碼。

3.記憶安全
動態型別語言為您提供了很大的靈活性。型別更改不需要透過程式手動傳播。它還為您提供了更多的心理靈活性,因為您可以在轉換,操作和演算法方面進行更多思考。靈活性使您可以更快地移動,快速更改內容,並以更快的速度進行迭代。但它需要付出代價。錯過潛在問題要容易得多,這些問題通常很難除錯。此外,這些功能通常會帶來效能損失。

另一方面,在靜態型別語言中,在開發過程的早期階段捕獲了大量錯誤,靜態型別通常會導致編譯程式碼執行得更快,因為當編譯器知道正在使用的確切資料型別時,它可以生成最佳化的機器程式碼。靜態型別也可用作文件。

Rust超越了這些點。Rust非常嚴格且迂腐的編譯器會檢查您使用的每個變數以及您引用的每個記憶體地址。它避免了可能的資料競爭條件,並通知您未定義的行為。

下圖右側部分顯示了併發和記憶體安全問題。這些是最複雜和不可預測的錯誤類,從根本上不可能進入Rust的安全子集。此外,所有這些型別相關的錯誤都是危險的,並導致各種安全漏洞。

為什麼選擇Rust作為物聯網的程式語言? - Ash Moosa
型別安全是Rust最大的賣點之一,也是Rust在StackOverflow調查中連續3年成為最受歡迎的語言的原因

Rust實現這一壯舉的方式是使用變數所有權的概念。在Rust中,每個值都具有“擁有作用域”,並且傳遞或返回值意味著將所有權轉移到新作用域。您可以訪問您呼叫的函式,這稱為“借用”。Rust確保這些租約不會超過借來的物件。這不僅使它非常安全,而且還可以幫助您正面解決併發問題,因為記憶體安全和併發錯誤通常會導致程式碼訪問資料時不應該這樣做。

4. 開發經驗
Rust有一個陡峭的學習曲線。其中大部分是由於我們上面討論過的“所有權”和“借用”概念。與使用Lua或Python等語言相比,這使得Rust難以學習並且更耗時。它需要人們非常瞭解有關記憶體分配和併發性的基本計算原則,並且它要求您在實現時牢記這些原則。這應該是任何語言的情況,但特別是在Rust中,編譯器明確強制您編寫最佳的記憶體安全程式碼。

儘管您正在使用C ++進行手動記憶體管理,但Rust有許多功能和便利,幾乎讓它感覺像是一種高階語言。而且Rust有很多抽象,不再讓它感覺像是手動記憶體管理。
低階別控制和高階別安全性使開發人員能夠更好地控制效能,而無需承擔學習C / C ++的負擔,或承擔錯誤的風險。 
Rust還透過其強大的庫(如貨物測試)促進在程式內編寫測試。與Bitbucket Pipelines相結合,可以非常輕鬆地設定持續整合和發貨程式碼。

結論
基於以上所述,Rust是我們專案的不錯選擇。當您想要實現資源佔用較少的高效能併發系統時,程式語言的選擇是有限的。基於直譯器的語言往往在高併發和低資源環境中表現不佳。系統程式語言是此類用例的理想候選者。

但是,當您沒有資源約束並且不需要高併發性或使用其他機制(如事件迴圈)實現時,基於直譯器的語言可能會更好。 
C / C ++是系統程式語言的聖盃。但是,在StackOverflow Surveys中, C&C ++也是最可怕的語言之一。對於來自其他更高階語言的新程式設計師來說,接近C / C ++很難。學習曲線非常陡峭。大約有74種不同的構建系統和28個不同包管理器的拼湊框架,其中大多數只支援某個平臺/環境,並且在它之外是無用的。經過30多年的發展,新的程式設計師對他們投入太多了。

另一方面,Rust相對容易接近,擁有相當大的社群,沒有數十年的技術債務,但卻提供了相對的表現。記憶體安全性和簡單的併發性只是增加了好處。

相關文章