¿Por qué WinRT no está administrado? [cerrado]

164

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?

usuario380719
fuente
56
Esta fue una mala decisión , tan mala como cerrarla. Ahora insiste en referencias y fuentes, corta eso antes cerrando la pregunta. Ahora eliminó excelentes fuentes de los programadores que trabajaron en él.
Hans Passant
9
He votado como fuera de tema ya que esto no aborda una pregunta práctica de programación. Es solo curiosidad. Ningún programador va a cambiar su código como resultado de esta pregunta.
Raymond Chen
17
@Kev Por ese razonamiento, preguntas como "¿cómo se formó el planeta Tierra?" habría sido absolutamente terrible en la comunidad científica porque atrajo mucha especulación religiosa. Hay buenas respuestas a esta pregunta, solo porque atraiga muchas respuestas malas no significa que sea una mala pregunta. Sin embargo, ¿por qué no simplemente mover esta pregunta a P.SE?
Rei Miyasaka
22
@casperOne Es una pregunta legítima de "pizarra" para muchos desarrolladores: queremos conocer las razones presumiblemente técnicas de la decisión, para que podamos aplicar el mismo razonamiento en otros lugares. ¿Es porque el recolector de basura es difícil de perfilar? ¿Es porque brinda un acceso más fácil a las abstracciones de hardware de nivel inferior? Si no hay razones técnicas, entonces eso es simplemente desafortunado, pero eso no tiene nada que ver con la calidad de la pregunta en sí.
Rei Miyasaka
77
Estoy de acuerdo con @HansPassant; Esta pregunta debe ser reabierta y tratada como válida. "¿Por qué no está administrado?" es una muy buena pregunta con respecto a los fundamentos de WinRT.
Rob Perkins

Respuestas:

190

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

Hans Passant
fuente
14
No sé acerca de los compiladores, pero estoy bastante seguro de que la proyección WinRT .NET tuvo mucho trabajo en CLR. Es posible que hayan reutilizado el código de interoperabilidad COM, pero también hay diferencias (por ejemplo, le IInspectablepermite 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.
Pavel Minaev
55
No estoy seguro, estás ignorando al elefante. IInspectable es un reemplazo para IDispatch que se atascó en 1997. Trabajas para Microsoft, no dudes en revelar algunos de los secretos aquí :)
Hans Passant
13
Se trabajó en los 3 idiomas para respaldar las proyecciones de idiomas.
RestablecerMonica Larry Osterman
13
Yo diría que en este momento 'el mejor enlace para WinRT' es en realidad C #. El enlace CLR está optimizado incluso más allá de la interoperabilidad COM bastante rápida, y los lenguajes .NET en la vista previa del desarrollador ya implementan un excelente soporte para las funciones asincrónicas ubicuas con 'wait'. En algunas de las demostraciones, el código C # hizo mucho más que las muestras de C ++, y funcionó más fácilmente. Tal vez más tarde C ++ obtenga una extensión auxiliar asíncrona, pero en esta versión, C ++ asíncrono se veía terrible. Y es menos probable que pierda memoria a largo plazo del CLR de recolección de basura que la implementación de C ++ con problemas de ciclo. C # FTW!
Govert
13
@Hans: La tercera proyección es el CLR para todos los lenguajes CLR (principalmente C # y VB). Además, WinJS no es una proyección, es un conjunto de bibliotecas de soporte. La proyección está integrada directamente en el motor Chakra JS.
ReinstateMonica Larry Osterman
25

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/

Andz
fuente
Enlace actualizado para los pensamientos de Bjarne sobre C ++ / CLI: stroustrup.com/bs_faq.html#CppCLI