Immutability 是编程语言中的一个概念,它指的是在创建数据结构之后,不能对其进行修改。当需要对数据进行更改时,函数式编程要求创建一个新的数据结构,而保持原始数据结构不变。
我之前一直觉得 immutability 是吃饱了撑的,因为不可变性意味着会存在多份相似的数据,内存开销会急剧增大,而且如果是一个非常庞大的数据结构,那么每次小修改都会导致其完全拷贝。
但这种错误的观点,是我把“编程模型”和“硬件实现”搞混了。所谓的不可变性,只是在编程模型上,可能会导致数据的复制,而落实到具体硬件上面,可能还是同一份内存上数据内容的修改,只要不影响上层抽象就可以了。
说白了,不可变性是一种数据流的表达方式(见 Dataflow vs State),每个变量不再是一个“内存格子”,而是 DAG 图上的一个节点。
不过学了这么多系统知识后,我突然发现其实不可变性和 Optimistic Lock vs Pessimistic Lock 中的乐观锁很像,每一个版本都是不可变的,这样并发度就会提高,编程难度还会下降。
此外需要强调的是,不可变性并不意味着程序语言中的每个“变量”都是不可变的,这种语言里面的“引用”还是可以变化的,只是数据本身是不可变的。这是我之前模糊的点,因为数据本身可能就包含引用,所以如果数据是不可变的,那么引用也应该不可变啊。我到现在都没有思考清楚这个问题。