我的雲端生活網 - Life+

Thursday, June 11, 2009

(翻譯) Erlang 程式設計第七章:並行風格

Joe Armstrong 在 Erlang Programming 書中有一段提到「平行程式設計」 (Concurrent-oriented programming, COP) 的概念。以下翻譯那一段文章,提供許多人即使在用非平行程式設計方式開發平行系統架構時,也可以引用這些概念。



並行風格

人都知道何謂並行 對並行的深入認知,直接連通到我們腦內。我們能極速地對刺激做反射動作,是用到腦的一部份,稱為杏仁體。若少了這樣的反應,我們可能會死。有意識的思考動作太慢。而用到思考「快拉煞車桿」耗掉的時間,我們早就做了那個動作了。

行駛在幹道上的時候,我們心裡會打量十幾輛或百來輛車。這不經過意識思考。如果我們沒本事做到這種事,可能就會死。

世界是平行的 假如我們要寫一些程式,表現如同在真正世界中表現著的其他物件,這些程式會有個並行的組織方式。這是何以我們該用「並行程式語言」來寫程式。

然而我們很常用「循序程式語言」寫真實世界的程式。真是多餘的難。

用我們設計來寫並行應用程式的語言吧!並行程式開發會變得超容易。

Erlang 程式建構我們思考及感興趣的模型 我們不共用記憶。我有我的記憶,你有你的記憶。咱們是兩個腦袋,一人一個。兩個腦袋不會融合成一個。要改變你的記憶,我要對你送訊息,或者說,我要揮揮手。你聽到了,或瞧見了,你的記憶就會改變。不過,如果沒問你問題並看看你的反應,我不知道你有沒有收到我的訊息。

這是有 Erlang 程序的情況該是的樣子。 Erlang 程序沒有共用記憶體,每個程序有自己的記憶體。要改變其他程序的記憶體,你必須送個訊息,期望對方收到並了解訊息。要確定別的程序已經收到你的訊息,並且改變他的記憶體了,你必須問問他 (也送個訊息) 。這完全是我們都怎麼互動的模式。

煦:嗨,比爾,我的電話號碼是 45-67-89-12 。
煦:你聽到了嗎?
比爾:有,你的號碼是 45-67-89-12 。

這些互動模式是我們如此熟悉,從小到大我們都和這世界這樣互動,觀察它,對它送送訊息,然後看看反應。

人們發揮功用,如獨立個體般送訊息做溝通 這是 Erlang 程式做事的辦法,也是人們做事的辦法。所以,很容易學懂一份 Erlang 程式。

一份 Erlang 程式用許多成千或上百千的小程序構成。這些小程序獨立運作。它們彼此送訊息溝通。每個程序有自己的記憶體。它們表現得像一大房間的人群彼此在饒舌交談。

這讓 Erlang 天生就是簡單,容易維護並擴充。假定我們有十個人 (或程序) ,他們要做太多工作。可以怎麼做呢?找更多人來。而我們怎麼管理這些人呢?很簡單,就對他們喊口令 (或叫廣播) 。

Erlang 程序沒有共用記憶體,所以記憶體使用時不需要鎖定。有鎖的地方就有會有鑰匙,而有鑰匙就可能會遺失鑰匙。當你鑰匙掉了會怎麼樣呢?你會驚慌得不知道怎麼辦。在軟體發生的,則是當你丟掉了鑰匙,鎖定就造成錯誤。分散式軟體系統如果有鑰匙和鎖,都會出錯。

而 Erlang 可沒有鎖和鑰匙。

有人死掉,其他人一定會注意到 假如我在一個房間裏突然傾覆而死,有人可能會注意到。 Erlang 程序就像人們,他們有時可能死掉。但不像人們的是,人們死掉會用盡力氣叫出聲,而叫聲與他們的死因有關。

想想滿滿一整房間的人,有人突然倒斃了。像他們死的時候,會叫說「我的心臟──我要死了」或是「我的胃抽搐」。這就是 Erlang 程序所做的。一條程序可能死前說:「我死於除以零。」另一條程序可能說:「我死於向空串列要最後一項串列資料。」

現在在我們滿是人的房間裏,假想有位特定的仁兄,他的任務是清除遺體。假定有珍和尚二人,如果珍死掉,尚會修正對珍的死亡所有的錯誤。如果尚死亡,珍會修定那些錯誤。珍和尚是被無形的契約連成一體,約定若有一方死亡,另一方會修正所有造成其死亡的錯誤。

這就是 Erlang 怎麼處理錯誤偵測的方法。程序可以連成一體。如果一條程序死掉,另一條程序獲得一則錯誤訊息,指出前一條程序為什麼死掉。

基本是這樣。 Erlang 怎麼做事如以上所述。

現在我們學到的東西有:
  1. Erlang 程式由一大堆程序構成。這些程序可以彼此送訊息。
  2. 這些程序可能會接收訊息並瞭解訊息,也可能不會。如果你要知道訊息有沒有收到並解讀,你必須向程序送訊息,並等它回應。
  3. 成對的程序可以被連成一體。如果其中之一死掉,錯誤訊息會送給另一個程序,訊息中包含前一程序為什麼死掉的理由。
這種簡單的程式設計模型,是我稱為「並行程式設計」 (COP, Concurrency-Oriented Programming) 的模型一部份。

下一章我們開始寫並行程式。我們需要學三種基本項: spawnsend (這用到 ! 運算子) 和 receive 。然後寫一點簡單的並行程式。

當程序死掉的時候,如果有其他程序跟它連成一體,其他程序就會注意到。這是第九章的主題,「並行程式的錯誤」。

在你讀下兩章的時候,想著房間裏有一群人。人們是程序。在房間裏的人們有自己私有記憶,這記憶就是程序的狀態。要改變你的記憶,我就跟你講話,而你就聽,這是送訊息和收訊息。我們會有兒女,這是 spawn (生產) 。我們死掉,就是一條程序結束了。

No comments:

Blog Archive