单一任务的目的是啥?

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】:

让变量保持其值可以更容易地理解和调试代码。对于并发进程,无论如何您都会遇到同样的问题,因此无论如何都会有足够的复杂性,而没有任何变量可能随时改变其值。将其视为仅在显式时允许它们来封装副作用。

【讨论】:

以上是关于单一任务的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

task是啥意思

进程调度是的任务是啥

简单的开源任务管理器[关闭]

LINUX基础知识

JAVA随想:单一任务与多线程关系

Python多线程是啥意思?