Erlang 程式設計/概述
軟體技術通常使用特定的組織原則。在 Linux 中,一切都是檔案。在 Ruby 中,一切都是物件。在 lisp 中,一切(程式或資料)都是列表。在 Erlang 中,最重要的組織單位是程序。每個程序都有一個 ID 和至少一個啟動它的函式(一個入口點)。理論上,一個程序可以有多個入口點函式。每個程序在執行時不限於一個函式。相反,一個程序可以擁有一個完整的函式桶,它們遞迴地相互呼叫並作為一個程序協同工作。基於 GS 的 Erlang 圖形程式經常使用每個程序的函式桶技術來處理 GUI 事件。CPU 時間以輪詢方式排程,每個程序分配相同的時間片。
程序之間相互發送和接收訊息。訊息使用模式匹配讀取。訊息以 FIFO(先進先出)的方式匹配。
為了實現序列安全,我們需要控制副作用。作為解決方案,我們首先發明瞭結構化程式設計,然後是面向物件程式設計。每次的目標都是隔離狀態和變數以減少副作用。在相同的傳統中,Erlang 中的副作用更加受限制。如果一個函式沒有狀態,那麼它每次的行為都將相同。如果一個函式沒有副作用,那麼它就不會導致其他函式崩潰。
純函式是指一個函式,無論函式呼叫的上下文如何,只要給定相同的引數,它總是返回相同的值。這就是我們通常對數學函式的期望。不純的函式被稱為有副作用。
副作用通常發生在函式
a) 傳送訊息
b) 接收訊息
c) 呼叫退出
d) 呼叫任何更改程序環境或操作模式的 BIF*(例如 get/1、put/2、erase/1、process_flag/2 等)。
—摘自 Erlang 程式設計規則(參見參考文獻)
* 注意:"BIF" 代表 "內建函式"
一般來說,Erlang 函式會忘記狀態。迭代透過遞迴模擬。在每次函式呼叫期間,變數只能分配一次。狀態由函式引數攜帶,或者如果絕對必要,狀態被放入資料庫。避免狀態可以保護並行處理的完整性。可以將每次函式呼叫視為建立一個口袋宇宙,該宇宙有一組在呼叫範圍內成立的方程式。或者,人們可以將 erlang 視為一種用某種時間邏輯進行程式設計的系統。有人說 Erlang 甚至沒有變數賦值,它只有模式匹配。
[ Head | Tail ] = [ 1, 2, 3 ], Head = 1. ok
頭必須始終以一致的方式匹配,否則包含的程序將失敗。
Head = 2.
Error in process <0.29.0> with exit value: {{badmatch,2},[{erl_eval,expr,3}]}
模式匹配可以被認為是一系列必須為真的斷言。
簡單的面向物件程式設計可以透過使用程序作為物件和訊息作為方法來在 erlang 中模擬。
2003 年,摩爾定律發生了急劇轉變。過熱導致微處理器將其速度限制為 4 GHz。解決方案是建立多核處理器。這使得摩爾定律得以繼續,但只是以並行的方式。多核計算引發了新的軟體危機,即 MIMD(多指令多資料)軟體危機。SIMD(單指令多資料)相對容易,而 MIMD 則很難。(參考文獻:免費午餐結束了)。為了利用新的多核計算機,需要 MIMD 程式,否則摩爾定律就會失效。
Erlang 很適合解決新的 MIMD 軟體危機。由於並行程序和訊息傳遞,Erlang 可用於代理程式設計。Erlang 是一種符號語言,因此可用於經典的 AI 程式設計。由於極端的程序隔離,它應該適用於遺傳/進化程式設計。
[1] - 免費午餐結束了,Dr Dobbs 雜誌,2005 年 3 月。(html)
[2] - 來自 erlang.se 的 Erlang 程式設計規則(html)
[3] - Joe Armstrong(2003)。“在存在軟體錯誤的情況下構建可靠的分散式系統”。博士論文。(pdf)