Pony 編程語言介紹

在 Wallaroo Labs,我是工程副總裁,我們正在構建一個用 Pony 編程語言編寫的 高性能分佈式流處理器。大多數人沒有聽說過 Pony,但它一直是 Wallaroo 的最佳選擇,它也可能成爲你的下一個項目的最佳選擇。
我是 Pony 項目的貢獻者,但在這裏我要談談爲什麼 Pony 對於像 Wallaroo 這樣的應用是個好選擇,並分享我使用 Pony 的方式。如果你對我們爲什麼使用 Pony 來編寫 Wallaroo 甚感興趣,我們有一篇關於它的 博文。
Pony 編程語言介紹

Pony 是什麼?

你可以把 Pony 想象成某種“Rust 遇上 Erlang”的東西。Pony 有着最引人注目的特性,它們是:

類型安全
存儲安全
異常安全
無數據競爭
無死鎖
此外,它可以被編譯爲高效的本地代碼,它是在開放的情況下開發的,在兩句版 BSD 許可證下發布。

以上說的功能不少,但在這裏我將重點關注那些對我們公司來說採用 Pony 至關重要的功能。

爲什麼使用 Pony?

使用大多數我們現有的工具編寫快速、安全、高效、高併發的程序並非易事。“快速、高效、高併發”是可實現的目標,但加入“安全”之後,就困難了許多。對於 Wallaroo,我們希望同時實現四個目標,而 Pony 讓實現它們更加簡單。

高併發

Pony 讓併發變得簡單。部分是通過提供一個固執的併發方式實現的。在 Pony 語言中,所有的併發都是通過 Actor 模型 進行的。

Actor 模型以在 Erlang 和 Akka 中的實現最爲著名。Actor 模型出現於上世紀 70 年代,細節因實現方式而異。不變的是,所有計算都由通過異步消息進行通信的 actor 來執行。

你可以用這種方式來看待 Actor 模型:面向對象中的對象是狀態 + 同步方法,而 actor 是狀態 + 異步方法。

當一個 actor 收到一個消息時,它執行相應的方法。該方法可以在只有該 actor 可訪問的狀態下運行。Actor 模型允許我們以併發安全的方式使用可變狀態。每個 actor 都是單線程的。一個 actor 中的兩個方法絕不會併發運行。這意味着,在給定的 actor 中,數據更新不會引起數據競爭或通常與線程和可變狀態相關的其他問題。

快速高效

Pony actor 通過一個高效的工作竊取調度程序來調度。每個可用的 CPU 都有一個單獨 Pony 調度程序。這種每個核心一個線程的併發模型是 Pony 嘗試與 CPU 協同工作以儘可能高效運行的一部分。Pony 運行時嘗試儘可能利用 CPU 緩存。代碼越少干擾緩存,運行得越好。Pony 意在幫你的代碼與 CPU 緩存友好相處。

Pony 的運行時還會有每個 actor 的堆,因此在垃圾收集期間,沒有 “停止一切” 的垃圾收集步驟。這意味着你的程序總是至少能做一點工作。因此 Pony 程序最終具有非常一致的性能和可預測的延遲。

安全

Pony 類型系統引入了一個新概念:引用能力,它使得數據安全成爲類型系統的一部分。Pony 語言中每種變量的類型都包含了有關如何在 actor 之間分享數據的信息。Pony 編譯器用這些信息來確認,在編譯時,你的代碼是無數據競爭和無死鎖的。

如果這聽起來有點像 Rust,那是因爲本來就是這樣的。Pony 的引用功能和 Rust 的借用檢查器都提供數據安全性;它們只是以不同的方式來接近這個目標,並有不同的權衡。

Pony 適合你嗎?

決定是否要在一個非業餘愛好的項目上使用一門新的編程語言是困難的。與其他方法想比,你必須權衡工具的適當性和不成熟度。那麼,Pony 和你搭不搭呢?

如果你有一個困難的併發問題需要解決,那麼 Pony 可能是一個好選擇。解決併發應用問題是 Pony 之所以存在的理由。如果你能用一個單線程的 Python 腳本就完成所需操作,那你大概不需要它。如果你有一個困難的併發問題,你應該考慮 Pony 及其強大的無數據競爭、併發感知類型系統。

你將獲得一個這樣的編譯器,它將阻止你引入許多與併發相關的錯誤,並在運行時爲你提供出色的性能特徵。

開始使用 Pony

如果你準備好開始使用 Pony,你需要先在 Pony 的網站上訪問 學習部分。在這裏你會找到安裝 Pony 編譯器的步驟和學習這門語言的資源。

如果你願意爲你正在使用的這個語言做出貢獻,我們會在 GitHub 上爲你提供一些 初學者友好的問題。

同時,我迫不及待地想在 我們的 IRC 頻道 和 Pony 郵件列表 上與你交談。

要了解更多有關 Pony 的消息,請參閱 Sean Allen 2018 年 7 月 16 日至 19 日在俄勒岡州波特蘭舉行的 第 20 屆 OSCON 會議 上的演講: Pony,我如何學會停止擔心並擁抱未經證實的技術。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章