Windows 8 presenta WinRT, que es como .NET pero no administrado. ¿Por qué no está gestionado? ¿Es un problema de rendimiento? ¿Significa que la recolección de basura no es adecuada para las API de nivel inferior?
Windows 8 presenta WinRT, que es como .NET pero no administrado. ¿Por qué no está gestionado? ¿Es un problema de rendimiento? ¿Significa que la recolección de basura no es adecuada para las API de nivel inferior?
Respuestas:
WinRT es un reemplazo para el antiguo Winapi basado en C. Es una API que debe ser utilizable en muchos entornos de tiempo de ejecución. Hace 20 años, una C api era relativamente fácil de interoperar. Desde entonces, COM se convirtió en el pegamento universal en la última mitad de la década de 1990. Prácticamente cualquier lenguaje en tiempo de ejecución de uso común en Windows es compatible con COM.
Un recolector de basura es un detalle de implementación del lenguaje de ejecución. El recopilador para .NET es muy diferente del recopilador para Javascript, por ejemplo. Los objetos nativos creados en cualquiera de ellos deben observar las reglas muy estrictas del colector. Lo que a su vez significa que habrían tenido que crear versiones de WinRT que sean específicas para cada tiempo de ejecución de idioma. Eso no funcionará, incluso una empresa tan grande como Microsoft no puede permitirse crear y soportar una versión específica de WinRT para cada enlace de idioma. Tampoco es necesario, dado que estos idiomas ya admiten COM.
En este momento, el mejor enlace para WinRT es C ++ ya que COM funciona de manera más eficiente con la gestión explícita de memoria. Con amplia ayuda de las nuevas extensiones del compilador de C ++ que lo hacen automático, muy similar a _com_ptr_t de antaño con sintaxis similar a C ++ / CLI para evitarlo. El enlace a lenguajes administrados es relativamente simple ya que el CLR ya tiene un excelente soporte de interoperabilidad COM. WinRT también adoptó el formato de metadatos de .NET. Afaik, hasta el momento no se ha realizado ningún trabajo en compiladores administrados.
EDITAR: Larry Osterman, un conocido programador y blogger de Microsoft, dejó un comentario bastante bueno en una respuesta ahora eliminada. Lo citaré aquí para preservarlo:
WinRT no está administrado porque el sistema operativo no está administrado. Y al diseñar WinRT de la forma en que fue diseñado, gana la capacidad de expresarse en muchos lenguajes diferentes, no solo en C ++, C # y JS. Por ejemplo, podría ver fácilmente un conjunto de módulos de Perl que implementan las API de WinRT que funcionan en el escritorio. Si lo hubiéramos implementado en .Net, eso habría sido extremadamente difícil
IInspectable
permite hacer cosas como consultar un objeto para su tipo de clase real o la lista de todas las interfaces compatibles, y con los archivos winmd uno puede proyectar metadatos WinRT para todo eso en Reflection ) Y los archivos winmd tampoco se pueden usar inmediatamente como ensamblajes de interoperabilidad, CLR tiene que manejarlos especialmente.
WinRT no está administrado porque está destinado a ser un reemplazo para Win32, la API accesible para desarrolladores de nivel más bajo para Windows. Una API no administrada sigue siendo la que tiene un rendimiento más potencial que puede exponerse al desarrollador y el razonamiento es que siempre será posible envolver una API administrada encima, que es precisamente lo que hacen las 'proyecciones'.
También significa que los desarrolladores de C ++ pueden usar WinRT sin saltar a través de los aros que introduce C ++ / CLI (consulte http://www2.research.att.com/~bs/bs_faq.html#CppCLI ). tienes que estudiar COM si quieres usar WinRT.
La verdadera pregunta es '¿por qué es necesario COM? ¿Por qué Microsoft tuvo que inventarlo? Debido a que C ++ sin todas las funciones adicionales de COM es inadecuado para el trabajo real de OOP y las afirmaciones de Stroustrup de que C ++ le brinda 'portabilidad' son muy poco sinceras a la luz de la realidad laboral. Ver http://webmechs.com/webpress/2011/11/c-versus-objective-c-as-api-substrate/