2010-07-06 23 views
8

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

的问题是,我不能找到一个好的答案。当然,如果你有面向对象的话,你不需要协程,但在某些情况下,它仍然是非常有用的。为什么大多数面向对象的语言不支持协程?

+1

*当然,如果您有对象方向,则不需要协程。* 错误。对象只是将数据与功能绑定。 – mcandre 2010-07-06 16:31:57

回答

6

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

+2

...除非协程本身是一个对象。 – Felixyz 2010-07-14 20:59:16

2

这仅仅是猜测:

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

0

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

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

从技术角度来看,我不确定有没有新的东西要添加 - 大部分需要的是一个很好的“销售空间”,以使Concurrent C或Ada 95(等)听起来像是一些新的创新足以让人们至少尝试一下。当然,几十年前的实现通常都是单线程的 - 这需要更新。然而,举个例子,我确信Ada 95的实现已经更新,所以他们可以很好地使用多个内核。虽然这似乎没有取得很大的成功(例如,在这里,ada标签目前仅使用了90次)。

4

在考试中这样一个问题的目的不是看你是否知道答案。 (这不一定是正确的答案。)相反,它是确定学生是否具备在学科领域内思考和推理的能力。

如果我要回答这个问题,我会观察到:a)角色模型非常合并面向对象和协同程序,因为角色(代理)可以同时接收和处理消息。 b)协程不常用于OOP语言的真正原因与协程不常用于任何主流语言的原因相同,在常规堆栈的情况下,协程很难实现。

我的回应几乎肯定要迟到才能帮到原来的海报。无论如何,我认为我会作出回应,因为协同程序和其他形式的并发是目前流行的话题。

0

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

0

嗯,实际上,Simula 67和Smalltalk 80--最终的和最终的OO语言 - 确实支持协程。所以我怀疑协程的想法与OOP本身是不兼容的。这很可能是一个巧合,诸如“为什么主流语言/操作系统/等不支持很酷的东西X”这样的问题。