2010-07-06 49 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」這樣的問題。