单一任务的目的是啥?
Posted
技术标签:
【中文标题】单一任务的目的是啥?【英文标题】:What is the purpose of single assignment?单一任务的目的是什么? 【发布时间】:2012-06-30 14:55:31 【问题描述】:我目前正在尝试掌握 Erlang。这是我研究的第一种函数式编程语言,我注意到在 Erlang 中,您所做的每个作业都是一个作业。显然,不仅在 Erlang 中,在许多其他函数式编程语言中,赋值都是通过单个赋值完成的。
我真的很困惑他们为什么会这样。单次分配的目的究竟是什么?我们可以从中获得什么好处?
【问题讨论】:
我建议检查this answer。简而言之,这不是一个任务。这是一个名称绑定过程。 可能更适合Software Engineering。 this question 的答案可能更重要。 【参考方案1】:不变性(你称之为单一赋值)简化了很多事情,因为它从你的程序中取出了“时间”变量。
例如,在数学中,如果你说
x = y
您可以在任何地方将x
替换为y
。在操作编程语言中,您无法确保这种等式成立:每一行代码都有一个“时间”(状态)。这个时间状态也为不受欢迎的side effects 敞开了大门,这是模块化和并发性的头号敌人。
欲了解更多信息,请参阅this.
【讨论】:
【参考方案2】:因为Single Assignment,副作用非常小。事实上,在 Erlang 中编写具有竞争条件或任何副作用的代码非常困难。这是因为,编译器很容易告诉未使用的变量、未使用的已创建术语、阴影变量(尤其是在 funs
内部)等 Erlang 在这方面获得的另一个优势是 Referential Transparency。 Erlang 中的函数将仅依赖于传递给它的变量,而不依赖于全局变量,MACROS
除外(并且宏不能在运行时更改,它们是常量。)。 最后,如果你看了Erlang Movie,Erlang 中内置的Sophisticated Error Detection Mechanism
很大程度上取决于在Erlang 中,变量被分配一次。
【讨论】:
但是请注意,Erlang 中的函数并不是完全透明的:向另一个进程发送消息可能会导致副作用,从而改变未来调用函数的值。至于全局变量,有流程字典、ETS表等。 是的,Erlang 完全不是引用透明的,不变性只消除了一个副作用(即编辑可能改变世界状态的内存),但一般不会限制副作用。 【参考方案3】:让变量保持其值可以更容易地理解和调试代码。对于并发进程,无论如何您都会遇到同样的问题,因此无论如何都会有足够的复杂性,而没有任何变量可能随时改变其值。将其视为仅在显式时允许它们来封装副作用。
【讨论】:
以上是关于单一任务的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章