Actualmente me estoy preparando para un examen. Una de las preguntas que he encontrado en un examen de edad es:
"¿Por qué la mayoría de los lenguajes orientados a objetos no son compatibles con corrutinas? (Pista: No es porque apoyan hilos)"
El problema es que no puedo encuentra una buena respuesta Por supuesto que no necesita coroutines si tiene orientación de objeto, pero aún sería muy útil tenerlos en algunos casos.¿Por qué la mayoría de los lenguajes orientados a objetos no admiten corutinas?
Respuesta
Creo que es por razones ideológicas. En la entidad principal OOP que representa el estado es el objeto. Nada más debería tener estado. En el mundo de las corutinas se convierten en un portador de estado más y eso contradice ligeramente con OOP. En C# hay una versión menor de coroutine: declaración de rendimiento, pero es puramente una característica de C#, no de CLR y .net en sí, mientras que todas las variables de estado compiladas se convierten en campos de clase oculta. Es porque nada excepto objeto puede tener un estado en .net.
... a menos que la corutina misma sea un objeto. – Felixyz
esto es sólo una conjetura:
A corrutina utiliza el estado de la subrutinapara alterar su valor de retorno, mientras que a un método en un objeto puede utilizar el estado objeto para alterar su valor de retorno.
Esto me suena como una pregunta pésima para un examen - es muy subjetivo, y no hay una respuesta correcta o incluso la mejor respuesta. Para resumir, no creo que nadie pueda hacer mucho más que adivinar esto.
Supongo que es principalmente porque los lenguajes que han incluido corutinas (por ejemplo, Concurrent Pascal, Concurrent C (que en realidad admitía el C++ de la época) y Ada Tasks también son similares), nunca ser particularmente popular Desde un punto de vista técnico, estos diseños ya son extremadamente bueno, pero nunca se han vuelto especialmente populares. Hasta cierto punto, eso es probablemente una cuestión de tiempo tanto como cualquier otra cosa. Cuando las computadoras con multiprocesador estuvieron disponibles para hacer de la computación paralela un objetivo real para la mayoría de los programadores, estos lenguajes ya habían sido olvidados.
Desde un punto de vista técnico, no estoy seguro de que alguien tenga algo nuevo que agregar: lo que se necesita es un buen "argumento de venta" para hacer que Concurrent C o Ada 95 (etc.) suenen como algo nuevo e innovador lo suficiente como para hacer que la gente al menos los pruebe. Por supuesto, las implementaciones de décadas atrás a menudo tenían un único hilo bajo el capó, que necesitarían actualización. Por ejemplo, sin embargo, estoy seguro de que las implementaciones de Ada 95 se han actualizado para que puedan usar múltiples núcleos bastante bien. Sin embargo, eso no parece haber hecho mucha popularidad (por ejemplo, aquí en SO, la etiqueta ada
se ha usado actualmente solo 90 veces).
El propósito de una pregunta como esta en un examen no es ver si conoce la respuesta. (No es necesario que sea una respuesta correcta) Más bien, es para determinar si el alumno ha desarrollado la capacidad de pensar y razonar dentro del dominio de la materia.
Si tuviera que responder esta pregunta, observaría: a) Un actor-modelo es una gran fusión de orientación a objetos con corutinas, en el sentido de que los actores (agentes) podrían recibir y procesar mensajes al mismo tiempo. b) La verdadera razón por la que las corutinas no se encuentran a menudo en los lenguajes de programación orientada a objetos es la misma que la razón por la que las corutinas no se encuentran a menudo en ningún lenguaje general, a saber. Las corutinas son difíciles de implementar en presencia de una pila convencional.
Mi respuesta es, casi con seguridad, demasiado tarde para ayudar al cartel original. Pensé que respondería de todos modos, ya que las corrutinas y otras formas de concurrencia son actualmente un tema popular.
La idea de un objeto es aislar el estado. Todo lo que necesita debe estar presente en ese objeto. Una corutina 'romperá' esta idea porque ahora un objeto ya no es un estado aislado, sino que depende de otro objeto.
Bueno, en realidad tanto Simula 67 como Smalltalk 80 - los lenguajes OO definitivos y definitivos - soportaron coroutines perfectamente. Así que dudo que la idea de corutinas sea fundamentalmente incompatible con OOP per se. Es más probable que sea una coincidencia, ese tipo de pregunta como "¿por qué lo bueno no es compatible con X en los lenguajes principales/sistemas operativos/etc".
- 1. ¿Por qué los lenguajes perezosos no admiten la mutación?
- 2. Pregunta de la entrevista: diferencia entre el objeto y los lenguajes orientados a objetos
- 3. ¿Por qué la mayoría de los lenguajes de scripting no tienen tipeo?
- 4. ¿Deberían aplicarse principios orientados a objetos en los lenguajes de procedimiento?
- 5. ¿Cuáles son algunos de los lenguajes más 'puros' orientados a objetos?
- 6. ¿Qué lenguajes de programación admiten métodos constantes?
- 7. ¿Por qué la mayoría de los lenguajes de programación utilizan una evaluación entusiasta para los argumentos pasados a una función?
- 8. ¿Por qué la mayoría de los lenguajes de S-Expression se tipan dinámicamente?
- 9. Otros lenguajes de programación que admiten implicits "a la Scala"
- 10. Recursos de diseño orientados a objetos
- 11. Conceptos orientados a objetos Java en Javascript
- 12. Lenguajes de script que admiten fibras/coroutines?
- 13. esquema para programadores orientados a objetos
- 14. Los lenguajes funcionales dirigidos a la LLVM
- 15. Encontrar la mayoría de los objetos repetidos en la matriz
- 16. ¿Por qué se desaprobaron la mayoría de los métodos java.util.Date?
- 17. ¿Por qué la mayoría de los ejemplos que usan ArrayList
- 18. ¿Por qué los lenguajes dinámicos como Ruby y Python no tienen el concepto de interfaces como en Java o C#?
- 19. ¿Cuál es la diferencia entre los modelos de aplicación centrados en datos y orientados a objetos?
- 20. Llamar a los procedimientos de miembros de PL/SQL orientados a objetos de Oracle desde JDBC
- 21. ¿Cuáles son los beneficios de corutinas?
- 22. ¿Por qué la mayoría de los algoritmos de gráficos no se adaptan tan fácilmente a los números negativos?
- 23. ¿Por qué 'ref' y 'out' no admiten el polimorfismo?
- 24. ¿Por qué hay tantos lenguajes de programación?
- 25. ¿Por qué las matrices admiten IList?
- 26. Abandonar corutinas
- 27. Flujos orientados a la línea en Node.js
- 28. ¿Cómo/por qué los lenguajes funcionales (específicamente Erlang) escalan bien?
- 29. ¿Para qué sirven corutinas Lua? ¿Por qué este código no funciona como lo espero?
- 30. ¿Por qué Java es utilizado por la mayoría de los bancos?
* Por supuesto que no necesita coroutines si tiene orientación de objeto. * False. Los objetos simplemente agrupan datos con funcionalidad. – mcandre