併發神器CSP的前世此生

程序架構的研究在上世紀七八十年代還處於原始階段,當時的大部分研究都在研究如何編寫順序代碼,而如今所熟知的goto語句那時也正在被討論,尚未正式引入。而面向對象的範式正在悄悄的變成編程的基石。


一切都顯得風平浪靜,好像一切都在隨着預想的慢慢發展。這時C.A.R Hoare (簡稱Tony Hoare發現了一個問題,那就是併發沒有獲得太多的關注,因而他開始着手解決這個問題。

Tony Hoarehtml



提及Tony Hoare,初聽比較陌生。可是他的另外一項研究不少程序員不會陌生,那就是排序算法中的快速排序算法(Quick Sort)。而這個聞名於世的算法是他26歲時發明的,固然除了這些,Tony Hoare在程序設計語言的定義、設計、數據結構、算法和操做系統等許多方面都有不少影響深遠的成果。並由於「對程序設計語言的定義和設計方面的基礎性貢獻」在1980年得到圖靈獎。


Hoare在發明快速排序後的第二年,接到了新的任務,爲公司的新機器設計一個新的高級語言,而當時他正好搞到一份Algol 60報告的複印件,並參加了Dijkstra(學算法的時候大部分人都聽過Dijkstra算法,沒錯,就是這我的發明的)等人舉辦的Algol 60培訓班。

當時Hoare學着學着就想,不如直接把Algol 60在公司的新機器上進行實現。因而Hoare把這個想法提交給公司,在公司贊成後,開始設計和實現Algol 60的一個本身版本。Hoare在一開始就制定了明確的目標,即系統要安全可靠,生成的目標碼要簡潔,工做區數據要緊湊,過程和函數的人口和出口要清晰、嚴密等,還明確了整個編譯過程採用一次掃描等原則。


而此次實現不只十分順利,而且大受歡迎,在世界各國開發的Algol 60版本中效率、可靠性和方便性都很是出色。所以獲得了國際學術界的重視。國際信息處理聯盟因而任命霍爾爲2.1工做組(Working Group 2.1)的負責人,這個工做組的任務是維護和發展Algol。霍爾果真不負衆望,主持設計了Algol X以繼承與發展Algol 60。正是在Algol X的設計中,霍爾發明了CASE語句


Hoare還有不少重要的研究和成果。而咱們今天要說的CSP理論就是其中很是重要的一點。


CSP程序員



Hoare在發現併發操做沒有引發過多的關注後,開始着手進行解決。終於在1978年,Hoare在ACM中發表了經典的「Communicating Sequential Processes」論文。在這篇論文中,Hoare認爲輸入和輸出是兩個被忽略的編程原語,尤爲在併發代碼中。因而Hoare在CSP論文中展現瞭如何應用通訊來建模輸入和輸出,並提供瞭如何用CSP來解決一些併發問題,好比尋找10000之內的素數。經過這種方式最終達到「在進程間正確的通訊」。固然這個思想在當時是很是超前的,

事實上,1978年的論文中,CSP只是一個用來展現通訊順序進程的能力的一個簡單的編程語言。連Hoare自己都以爲這個想法過於超前而有些不切實際,他直接在論文中悲觀的寫道:

Thus the concepts and notations introduced in this paper (although described in the next section in the form of a programming language fragment) should not be regarded as suitable for use as a programming language, either for abstract or for concrete programming. They are at best only a partial solution to the problems tackled.算法


本文介紹的概念和符號應該不被認爲適合做爲一種編程語言,不管是抽象的仍是具體的編程。他們最多隻是一種解決問題的方式。


Hoare擔憂本身所展現的技術對於將來的併發編程的研究並無任何做用,這種技術或許沒有語言可以按照他的想法來實現。可是接下來的6年裏,關於CSP的想法被提煉成對併發系統進行數學建模的方法--進程微積分。並提供了代數規則來對系統進行變化來分析它們的併發和效率。而這正式將CSP的想法投入到併發編程的實踐中。


Go語言編程





在CSP提出後,有些語言嘗試將Hoare提出的輸入和輸出做爲原語歸入到本身的語言體系中,好比OCCAM併發處理語言。和傳統的加鎖方式不一樣,CSP理論中不容許進程對其餘進程的變量賦值,進程之間只能經過通訊原語來實現數據交換和協做。可是這些語言都沒能真正地爲這些原語提供支持。大多數流行語言都支持共享和內存訪問同步到CSP的消息傳遞樣式。而採用CSP理論的語言也有,可是基本都沒有獲得普遍的採用。


直到Go語言出現,正式將CSP的原則歸入到核心原則,並提供了通訊的原語支持channel。正由於如此,併發被認爲是Go語言的優點之一。並讓Go語言在分佈式系統、雲原生系統和系統中間件中迅速佔領了市場。而其餘語言基於共享內存的併發模型,在大型和複雜系統中變得很難正確使用。


固然Go還有其侷限性,由於CSP的理解成本問題,Go同時也支持傳統的加鎖方式,也支持共享內存的方式。不過Go已經向其餘語言證實CSP的可行性和優越處。而且提出了經典的CSP核心概念:

Do not communicate by sharing memory; instead, share memory by communicating.安全


「不要以共享內存的方式來通訊,相反,要經過通訊來共享內存。」微信


而因爲Go語言的推廣和效果,使得CSP的概念變得流行起來,目前不少語言在嘗試將CSP歸入到語言體系中並提供對Hoare提出原語的支持。


參考連接數據結構


  • 計算機科學名人堂:Charles Antony Richard Hoare:架構

    http://wap.sciencenet.cn/blog-1225851-839515.html併發

  • Go語言CSP:通訊順序進程簡述:編程語言

    https://tsov.net/uupee/17044/

  • CSP 1978論文:

    https://spinroot.com/courses/summer/Papers/hoare_1978.pdf?__cf_chl_captcha_tk__=637000f92bddaa467d97d4404b8c86d40e787bda-1590473325-0-AfwfleSjOLTLNc9NlYQOaERH30eugvvD_pZCpJQp1BuLY7h8FMzdU-1g6gibzt0oPufEBr6ny7EMfaDuavQM9RoUnT5c1kqmUsycipyMJOPCp7-be5mLk7qFSZZm0dWcHb2HuOTkKQpAdCMgqSC4mBSfZ8UvZWjJ3v6kFE6MfP3BnQBtubXk88o3Twg3k8pd8W7xECjsYgSeyLB3xxq9y4-cpagfl0piK4i9QA00A2-Vm5usNU_WVevL5u-tepVkPdZpm8WQITYmKVeU_dTsBWv7Gpal-a1qATffyGGhAweQWYoDSpoO6uj8get5D_7cGe6jkzJEXaq04kHOABe9Us9BKs6qNOV7lE-Xdk7q1EKV



本文分享自微信公衆號 - 雨夜隨筆(yuye_suibi)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索