1、众说纷纭的变量不可变
近期在论坛中有一个很有意思的讨论,erlang中的变量不可变原则的原因到底是什么,似乎各个二郎君还没有一个统一的看法,主要的观点有两个:1、出于并发的需求,防止变量被二次赋值而导致各种并发问题;2、erlang的模式匹配导致,因为本身并不存在赋值操作,而模式匹配的规则就是不可对变量二次绑定值。
在我刚学erlang的时候,我曾经对第一种说法深信不疑,erlang变量不可变原则,感觉上确实可以很巧妙的解决并发编程中对共享数据并发访问的问题,因为数据不再被二次赋值,也就没有了脏数据问题。后来随着学习erlang越久,渐渐发现了这种说法的荒谬之处,最基本的,erlang本身在用户(程序员)角度,理论上并不存在共享内存的问题,每个进程的变量是属于进程私有空间的,也就是说即使变量可以二次赋值,也只能在单个进程中执行,所以根本不需要用变量不可变这点来保证并发性。在否认了第一种说法后,我开始倾向于第二种说法,变量不可变是erlang本身的模式匹配机制所决定,但是随着阅历增加,我接触了大量其他函数式编程语言,诸如haskshell、schema、lisp等等,我发现在不少的函数式编程语言中,都存在变量不可变机制,也就是说,这个规则并非erlang专有,所以第二种说法也不能解释。<