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)