1. 程式人生 > >P語言: 為非同步、容錯和不確定性而生的程式語言

P語言: 為非同步、容錯和不確定性而生的程式語言

cover

譯者注:P語言是一款由微軟、加州大學伯克利分校和倫敦帝國學院共同研發完成的程式語言,它在處理併發、故障切換等方面具有很強的優勢。本文介紹了P語言的起源、特性及其使用場景。以下是譯文。

新興應用程式的複雜性需要使用新興的方式去理解,然後才能高效地去構建、測試和除錯。現在的應用程式常常會使用雲資源,採用人工智慧技術,並嵌入到物理裝置中。這三個因素的結合使得軟體開發變得非常困難。

通常來說,這些現代應用程式都具有非同步性,主要表現在:為了提高效能,請求者在當前操作完成之前可繼續執行後面的操作。非同步不可避免地會產生併發,並帶來一些臭名昭著的坑,例如競態條件和海森堡bug(軟體錯誤,通常與時序相關,但在調查其原因的時候該錯誤可能會消失,這是因為當前環境已經產生了變化)。為了應對非同步計算帶來的挑戰,我們開發了P,一種用於在非同步事件驅動應用程式中建模和制定協議的程式語言。該專案是微軟研發人員以及

加州大學伯克利分校倫敦帝國學院的學術研究人員之間通力合作的結果。

A flowchart of the P programming language tool chain

P語言工具鏈流程圖

P的程式設計師在上層編寫協議及其規範。P編譯器提供針對競態條件的自動化測試和承載了指定協議的可執行程式。P在如下這幾個方面提供了一流的支援,包括:對併發進行建模、指定安全和活性屬性​、系統性的搜尋並檢查程式是否滿足其規範。對於這些功能來說,P與Leslie Lamport的TLA+Gerard Holzmann的SPIN相似。但與TLA+和SPIN不同的是,P程式也可以編譯成可執行的C程式碼。這種能力在高階模型和低階實現之間起到了橋樑的作用,也讓程式設計師可以更容易地接受正式的建模模型和規範。

P: programming language communicating state machines

通訊狀態機

在P中,程式設計模型的基礎是依賴事件進行通訊的併發執行狀態機,而每個事件包含了型別化的有效負載值。基於線性輸入和獨特指標的記憶體管理系統提供了安全的記憶體管理和data-race-free併發執行機制。在這方面,P類似於現代程式語言,比如

Rust

P在微軟軟體開發中的首次應用是在Windows 8.1和Windows Phone中承載USB 3.0驅動程式。這些驅動程式管理了Windows生態系統中的一個最重要的外圍裝置,並在當前數億臺裝置上執行。P在驅動程式的設計早期啟用了數百種競態條件和海森堡bug的檢測和除錯,並在當前廣泛應用於Windows的驅動程式開發之中。P在Windows核心中的早期的積極經驗推動了P#的出現,P#是一個使用C#擴充套件來提供狀態機和系統測試的框架。與P相比,P#採用了最小化的語法集合,並最大限度地利用外部庫來提供建模、制定規範和測試等功能。

P正在改變Azure雲基礎架構的開發。Azure與其他雲提供商一樣,面臨著由意想不到的競態條件和軟硬體故障引起的海森堡bug所帶來的挑戰。這些錯誤會導致實時服務的中斷,這是雲服務提供商及其客戶需面對的巨大問題。P和P#目前已經在已部署的服務中查詢和調​​試海森堡bug,並在系統部署前進行設計和驗證服務。P允許工程師在大型Azure服務的元件之間精確地模擬非同步介面。它還能協助工程師發現並除錯他們當前桌面上的問題,否則在部署服務後這些問題可能需要耗費幾個月甚至幾年的時間來解決。

P能夠進行充分的故障切換測試,這使其特別適合於進行容錯分散式服務驗證,也就是說,在意外故障發生時驗證服務是否能恢復並繼續執行。網路訊息的丟失和單個狀態機的故障都會被建模為事件。P將故障建模為事件使得故障注入變得更加地自動化,並可以在存在大量事件和錯誤的情況下對故障切換進行系統性的測試,而這幾乎無需程式設計師出力。

P在系統測試方面的能力使其能夠徹底搜查由於併發傳送事件的順序不確定性而引起的所有可能。然而,該能力在處理顯式資料輸入方面存在一定的限制,特別是當該輸入的多樣性異常龐大的時候。 這種限制使得難以將P應用於諸如機器人技術之類的應用,該類應用的複雜性主要源於不確定輸入下的決策。處理大量不確定的輸入目前正在研究之中。我們正在研究符號和概率技術來應對這一挑戰。

下載P語言

Reddit上的精彩相關評論:

  1. 所有的程式語言設計者在對語言進行命名的時候都應該考略到可搜尋性。C這個名字就起的很不好。為什麼現在的程式語言在搜尋引擎上都那麼難搜尋呢,比如“go”和“p”。
  2. 對於go來說,我們還能使用golang。
  3. 這個好像跟Erlang挺像的?希望它的語法更好用。
  4. 微軟再一次證明了他們很不擅長起名。
  5. 明年將釋出 P 360,然後再發布 P 1。
  6. 以後你就可以說:我在用P寫程式碼,我需要用P來工作,請安裝P。