Perché la maggior parte linguaggi orientati agli oggetti non supportano coroutine?

StackOverflow https://stackoverflow.com/questions/3188107

  •  02-10-2019
  •  | 
  •  

Domanda

Al momento sto preparando per un esame. Una delle domande che ho trovato in un vecchio esame è:
"Perché la maggior parte linguaggi orientati agli oggetti non supportano coroutine (Suggerimento: Non è perché supportano le discussioni)?"
Il problema è che non riesco a trovare una buona risposta. Naturalmente non c'è bisogno coroutine se si dispone di orientamento agli oggetti, ma sarebbe ancora essere molto utile avere in alcuni casi.

È stato utile?

Soluzione

Penso che sia a causa di ragioni ideologiche. In entità principale OOP che rappresenta il Stato è oggetto. Nient'altro dovrebbe avere Stato . Nel mondo del coroutine diventano un altro portatore di Stato e che contraddice leggermente con OOP. In C # è la versione minore del coroutine: istruzione yield, ma è puramente caratteristica di C #, non CLR e .net stessa, mentre compilate tutte le variabili di stato diventano campi di classe di nascosto. È perché nulla se non oggetto può avere uno stato in .NET.

Altri suggerimenti

Lo scopo di una domanda come questa in un esame, non è quello di vedere se si conosce la risposta. (Non non ha bisogno di essere una risposta giusta.) , piuttosto, è quello di determinare se lo studente ha sviluppato la capacità di pensare e ragionare all'interno del dominio soggetto.

Se dovessi rispondere a questa domanda rilevo: a) Un modello attore è molto una fusione di orientamento agli oggetti con coroutine, nel senso che attori (agenti) possono ricevere ed elaborare i messaggi contemporaneamente. b) La vera ragione coroutine non sono spesso in lingue OOP è la stessa come la ragione coroutine spesso non sono in qualsiasi lingua corrente principale, vale a dire. coroutine sono difficili da implementare in presenza di una pila convenzionale.

La mia risposta è quasi certamente troppo tardi per aiutare il manifesto originale. Ho pensato di rispondere comunque come coroutine e altre forme di concorrenza sono attualmente un argomento popolare.

Questa è solo una supposizione:

A coroutine utilizza il Stato della subroutine per alterare il suo valore di ritorno, mentre un metodo su un oggetto può utilizzare il Stato oggetto per alterare il suo valore di ritorno.

Questo suona per me come un pessima domanda per un esame - è altamente soggettivo, e non c'è una risposta giusta o addirittura migliore risposta. Per fare una lunga storia breve, non credo che chiunque può fare molto di più che a questo.

La mia ipotesi è che è per lo più perché le lingue che hanno incluso coroutine (ad esempio, Concurrent Pascal, Concurrent C (che in realtà ha sostenuto la C ++ del tempo), e Ada compiti sono una sorta di simile pure), non sono mai diventati particolarmente popolare. Dal punto di vista tecnico, questi disegni sono già molto buono, ma non hanno mai diventati particolarmente popolari. In un certo senso, questo è probabilmente una questione di tempi tanto quanto qualsiasi altra cosa. Per il momento in computer multiprocessore si sono resi disponibili a fare paralleli di calcolo un vero e proprio obiettivo per la maggior parte dei programmatori, nelle lingue erano già in gran parte dimenticati.

Dal punto di vista tecnico, non sono sicuro che nessuno ha molto di nuovo da aggiungere - per lo più ciò che è necessario è un "passo di vendite" buoni per fare concomitante C o Ada 95 (etc.) suono come qualcosa di abbastanza nuovo e innovativo per convincere la gente ad almeno provarli. Naturalmente, le implementazioni da decenni fa erano spesso single-threaded sotto il cofano - che avrebbe bisogno di aggiornamento. Per un esempio, però, sono sicuro che Ada 95 implementazioni sono state aggiornate in modo da poter utilizzare più core abbastanza bene. Non mi sembra di aver fatto un sacco di sua popolarità anche se (per esempio, qui su SO, il tag ada è attualmente stato utilizzato solo 90 volte).

L'idea di un oggetto è allo stato isolato. Tutto il necessario dovrebbe essere presente in tale oggetto. Un coroutine sara 'break' questa idea, perché ora un oggetto non è più uno stato isolato, ma piuttosto dipende da un altro oggetto.

Beh, in realtà sia Simula 67 e Smalltalk 80 - il OO definitivo e finale lingue - hanno fatto coroutine supporto perfettamente. Quindi dubito che l'idea di coroutine è fondamentalmente incompatibile con OOP di per sé. E 'più probabile che sia una coincidenza, quella sorta di domanda come "il motivo per cui è il fresco cosa X non è supportato nelle lingue mainsteam / sistemi operativi / etc".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top