Vi esta bonita imagen aquí . Aprendí que todos los compiladores que admiten el lenguaje .net convierten el código fuente al CIL
formato. Ahora Microsoft nunca está incorporando .NET
todo el sistema operativo escribiendo un CLR para todos los sistemas operativos. Entonces, ¿por qué mantener un formato de código intermedio y un CLR para ejecutar ese CIL? ¿No es un dolor de cabeza con el que lidiar? ¿Por qué Microsoft eligió ser así?
EDITAR Este tipo de arquitectura tiene su precio. Reducirá el rendimiento, ¿no? Java hace esto para mantener la independencia de la plataforma, ¿por qué razón lo hace .NET? ¿Por qué no mantener un simple compilador de C simple? Cualquier forma también requerirá un compilador para convertir el código a CIL si necesito agregar un nuevo idioma, la única diferencia que haría es el idioma de destino. Tat es todo.
Respuestas:
Porque solo necesitan escribir un compilador para C # a CIL, que es la parte difícil. Hacer un intérprete (o más a menudo, un compilador Just-In-Time) para el CIL por plataforma es relativamente fácil en comparación con escribir un compilador de C # a un código ejecutable (por plataforma).
Más allá de eso, el tiempo de ejecución puede manejar cualquier cosa que se compile a CIL. Si desea un nuevo lenguaje (como F #), solo tiene que escribir un compilador para él y automáticamente obtiene mágicamente todo el soporte de la plataforma para cosas que admite .NET.
Ah, y puedo tomar un .NET dll y ejecutarlo en Windows o en Linux a través de Mono sin recompilar (suponiendo que todas mis dependencias estén satisfechas).
En cuanto al rendimiento, es discutible. Hay "precompiladores" esencialmente que toman el CIL y hacen binarios nativos. Otros argumentan que los compiladores justo a tiempo pueden hacer optimizaciones que los compiladores estáticos simplemente no pueden hacer. En mi experiencia, depende mucho de lo que esté haciendo su aplicación y de la plataforma en la que la esté ejecutando (principalmente lo bueno que es el JITer en esa plataforma). Es extremadamente raro para mí encontrarme en un escenario donde .NET no sea lo suficientemente bueno .
fuente
readonly
campos. Los compiladores tradicionales pueden hacer algunas de estas optimizaciones, pero solo cuando pueden detectarse mediante análisis estático. Por el contrario, un jitter puede descubrir en tiempo de ejecución que (por ejemplo) una sección de código no está haciendo ningún trabajo útil porque los objetos o variables que modifica no están referenciados en ningún otro lugar. No soy un experto en nerviosismo, pero se trata básicamente del poder del análisis dinámico frente al análisis estático..NET tiene un lenguaje intermedio (CIL / MSIL) e implementaciones específicas de la plataforma de un tiempo de ejecución independiente de la plataforma (CLR) por la misma razón que Java. Microsoft pretendía que C # compitiera directamente con Java, y lo hace, en los sistemas operativos a los que se dirige Microsoft (el suyo).
Las ventajas, aunque .NET solo es compatible con plataformas Windows (u otros sistemas operativos que tienen un funcionamiento similar a .NET como Mono / Linux), son similares a Java:
Por razones antimonopolio, MS tiene cuidado de no ser visto "interfiriendo" demasiado en otras plataformas importantes como Android, Mac OSX / iOS y Linux; sin embargo, sí tiene equipos en desarrollo para las tres plataformas. Hay una versión de Office para OSX desarrollada por MS, hay numerosas aplicaciones que incluyen aplicaciones de interoperabilidad de Office para iOS y Android, Skype (ahora un producto de Microsoft) se ejecuta en Linux e incluso se ha visto que Microsoft contribuye al kernel de Linux (principalmente en un mentalidad de virtualización).
fuente
El sistema operativo Windows está disponible para diferentes tipos de CPU, actualmente principalmente x64, x86, Intel, ARM.
CIL / CLR es independiente de esa plataforma de hardware: el entorno de ejecución de IL "abstrae" estas diferencias. Por ejemplo, un ensamblado .NET compilado para "cualquier CPU" generalmente puede ejecutarse en Win64 como un proceso de 64 bits, y Win32 como un proceso de 32 bits, sin la necesidad de proporcionar diferentes ejecutables.
Además, el CIL permite que los metadatos se almacenen en ensamblajes que no es posible fácilmente con archivos DLL nativos (es posible, por supuesto, MS hizo esto antes con componentes COM, pero esa tecnología nunca fue tan fácil de manejar como los componentes .NET). Eso hace que la creación de componentes de software sea mucho más simple y es la base de la reflexión / introspección en todos los lenguajes .NET.
fuente