为什么大多数面向对象的语言不支持协同程序?

时间:2010-07-06 16:17:55

标签: oop coroutine

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

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

6 个答案:

答案 0 :(得分:6)

我认为这是出于意识形态的原因。在OOP中,表示状态的主体是对象。没有别的东西应该有。在协程世界中,它们成为国家的另一个载体,与OOP略有矛盾。在C#中有一个次要版本的coroutine:yield语句,但它纯粹是C#的特性,而不是CLR和.net本身,而编译时所有状态变量都成为隐藏类的字段。这是因为除了对象之外什么都不能在.net中有状态。

答案 1 :(得分:4)

在考试中这样的问题的目的不是看你是否知道答案。 (不需要正确答案。)而是确定学生是否具备在主题领域内思考和推理的能力。

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

我的回答几乎肯定是为了帮助原始海报。我认为无论如何我会做出回应,因为协程和其他形式的并发目前是一个热门话题。

答案 2 :(得分:2)

这只是猜测:

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

答案 3 :(得分:0)

这听起来像是一个考试的糟糕的问题 - 这是非常主观的,没有一个正确的答案,甚至没有最好的答案。长话短说,我认为任何人都不能做出更多的猜测。

我自己的猜测是,这主要是因为包含协同程序的语言(例如,Concurrent Pascal,Concurrent C(实际上支持当时的C ++)和Ada Tasks也有类似的东西),从未成为过特别受欢迎。从技术角度来看,这些设计已经非常好,但它们从未变得特别受欢迎。在某种程度上,这可能与时间问题无关。当多处理器计算机可用于使并行计算成为大多数程序员的真正目标时,这些语言已经被遗忘了。

从技术角度来看,我不确定是否有任何新的东西需要添加 - 大多数需要的是一个很好的“销售推销”,以使Concurrent C或Ada 95(等)听起来像一些新的和创新的东西让人们至少尝试一下。当然,几十年前的实现通常都是单线程的 - 需要更新。但是,举个例子,我确信Ada 95的实现已经更新,因此可以很好地使用多个内核。尽管如此,这似乎没有做到很多(例如,在SO上,ada标签目前只使用了90次)。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

嗯,实际上,Simula 67和Smalltalk 80--最终的和最终的OO语言 - 确实完美地支持了协同程序。所以我怀疑协同程序的概念本质上与OOP本身是不兼容的。它更可能是巧合,这类问题就像“为什么在主流语言/操作系统/等等中不支持酷X”。