【问题标题】:Why do most object oriented languages not support coroutines?为什么大多数面向对象的语言不支持协程?
【发布时间】:2010-07-06 16:17:55
【问题描述】:

我目前正在准备考试。我在旧考试中发现的一个问题是:
“为什么大多数面向对象语言不支持协程?(提示:不是因为它们支持线程)”

问题是,我找不到一个好的答案。当然,如果你有面向对象,你就不需要协程,但在某些情况下拥有它们仍然非常有用。

【问题讨论】:

  • 如果你有面向对象,当然你不需要协程。 错误。对象只是将数据与功能捆绑在一起。

标签: oop coroutine


【解决方案1】:

我认为是因为意识形态的原因。在 OOP 中,表示 状态 的主要实体是对象。没有其他东西应该有状态。在协程的世界中,它们成为状态的更多载体,这与 OOP 略有矛盾。在 C# 中有一个小版本的协程:yield 语句,但它纯粹是 C# 的特性,而不是 CLR 和 .net 本身,而编译的所有状态变量都成为隐藏类的字段。这是因为在 .net 中除了对象之外没有任何东西可以有状态。

【讨论】:

  • ...除非协程本身是一个对象。
【解决方案2】:

考试中这样的问题的目的不是看你是否知道答案。 (不一定是正确的答案。) 而是要确定学生是否已经发展了在学科领域内思考和推理的能力。

如果我要回答这个问题,我会观察到:a) 演员模型在很大程度上是面向对象与协程的合并,因为演员(代理)可以同时接收和处理消息。 b) 协程不经常出现在 OOP 语言中的真正原因与协程不经常出现在任何主流语言中的原因相同,即。在存在传统堆栈的情况下,协程很难实现。

我的回复几乎可以肯定是迟到了,以帮助原始发帖人。我想我还是会做出回应,因为协程和其他形式的并发目前是一个热门话题。

【讨论】:

    【解决方案3】:

    这只是猜测:

    协程使用子程序的状态来改变它的返回值,而对象上的方法可以使用对象状态来改变它的返回值。 p>

    【讨论】:

      【解决方案4】:

      在我看来,这听起来像是一个糟糕的考试题——它非常主观,没有一个正确答案,甚至没有最佳答案。长话短说,我认为任何人都只能猜测这一点。

      我自己的猜测是,这主要是因为包含协程的语言(例如,Concurrent Pascal、Concurrent C(实际上支持当时的 C++)和 Ada Tasks 也有点相似)从未成为特别受欢迎。从技术角度来看,这些设计已经非常好,但它们从未变得特别流行。在某种程度上,这可能与其他任何事情一样都是时间问题。当多处理器计算机成为大多数程序员的真正目标时,这些语言已经被大部分人遗忘了。

      从技术角度来看,我不确定是否有人要添加很多新内容——主要是需要一个好的“推销”来使 Concurrent C 或 Ada 95(等)听起来足够新颖和创新让人们至少尝试一下。当然,几十年前的实现通常是单线程的——这需要更新。然而,举一个例子,我确信 Ada 95 的实现已经更新,因此它们可以很好地使用多个内核。不过,这似乎并没有使其流行起来(例如,在 SO 上,ada 标签目前只使用了 90 次)。

      【讨论】:

        【解决方案5】:

        对象的想法是隔离状态。您需要的一切都应该存在于该对象中。协程将“打破”这个想法,因为现在一个对象不再是孤立状态,而是依赖于另一个对象。

        【讨论】:

          【解决方案6】:

          嗯,实际上 Simula 67 和 Smalltalk 80——权威和终极的 OO 语言——都完美地支持协程。所以我怀疑协程的想法与 OOP 本身根本不兼容。更有可能是巧合,诸如“为什么主流语言/操作系统/等不支持酷的东西 X”之类的问题。

          【讨论】:

            猜你喜欢
            • 2011-02-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-06
            • 2010-10-18
            • 2010-12-29
            • 1970-01-01
            相关资源
            最近更新 更多