2012-04-24 29 views
10

Estoy confundido con MSIL y Código administrado ¿son iguales o diferentes? Quiero decir, ¿qué sucede cuando construimos nuestro código C#?¿Es MSIL igual que el código administrado en .NET?

Cuál es la indicada

C# Code → C# compiler → Managed Code → MSIL

o

C# Code → C# compiler → MSIL

Sírvanse proporcionar auténtica referencia o enlace en apoyo de su respuesta.

Respuesta

9

Como se señala en los comentarios, MSIL ha cambiado de nombre a CIL.

C# Code --> C# compiler --> CIL

porque

CIL = Managed

cuando se pone en su contexto, también hay

Native Code = Unmanaged

Tenga en cuenta que Managed Code es algo completamente diferente, que refers to the source code.


Si desea extenderlo, entonces el proceso completo corregido es:

.NET Code --Compiler--> CIL (Managed) --JIT/NGEN--> Native Code (Unmanaged)


Referencias:

  1. Introducing C# (What is the .NET Framework? -> CIL and JIT -> First two sencences)

  2. JIT/NGEN (Towards a Cost Model for Managed Code -> The Just-in-Time compiler -> The whole)

+0

Y oficialmente se llama CIL, Common Intermediate Language, según [ECMA] (http://www.ecma-international.org/publications/standards/Ecma-335.htm) – Bob

+0

NGEN es generalmente ** not ** utilizado al compilar con código nativo, en su lugar se utiliza el compilador JIT. Y "[código de bytes] (http://en.wikipedia.org/wiki/Bytecode)" es ** no ** otro nombre para código nativo, es otro nombre para código administrado. – svick

+0

De hecho, mencionó JIT también ahora y decidió usar 'native' para evitar confusiones. –

3

El código escrito para funcionar exclusivamente bajo el control del CLR se llama código administrado. (Source). Así

C# Código → compilador de C# → CIL (anteriormente conocido como MSIL)

es correcta.

+0

Gracias por la referencia. ¿Puedes anotar el punto del párrafo en un documento que aclare esto? –

+0

@ user129967 Primera sección, "El papel de la CLR", tercer párrafo. También puede presionar Ctrl + F y buscar el "código administrado" en el artículo. – Indrek

12

Estás confundiendo cosas diferentes. Managed code es un código escrito en un lenguaje administrado (C#, VB.NET, F # y muchos otros) compilados en CIL (Common Intermediate Language, anteriormente Microsoft Intermediate Language o MSIL) y ejecutados en el entorno administrado de CLR.

El código no administrado, por otro lado, se compila directamente en el código nativo (también llamado ensamblaje), no se ejecuta en CLR.

Cuando construye su código C#, se compila en CIL. Es por eso que puede usar herramientas como ildasm o Reflector para inspeccionar el código compilado. Lo que ocurre exactamente cuando ejecutas el código CIL depende de las circunstancias. Podría ser

  1. compilados en el código nativo "just in time" usando el compilador JIT (la opción más común).
  2. ejecutado usando un código nativo precompilado (puede usar NGEN para obtenerlo).
  3. interpretado directamente; Creo que alguna versión de .Net para Windows CE o similar hace eso.
+1

+1 para ir más allá de la pregunta. El OP también debe leer algunos artículos introductorios de "Descripción general de .NET" para comprender de forma más exhaustiva los gestionados y no gestionados. Aquí hay una: http://www.codeproject.com/Articles/7333/Understanding-NET-Framework-at-a-glance –

+0

C# solo se "administra" si NO está utilizando la palabra clave "insegura". –

+0

¿Están ambos C = y CIL administrados o solo uno de ellos? –

2

Cuando escribe programas para Windows, puede escribir uno de dos tipos de código: administrado y nativo. El código nativo se compila directamente en una máquina ejecutable o .dll, mientras que el código administrado es un código que se dirige al tiempo de ejecución .NET (en otras palabras, su formulario compilado, denominado conjunto, es un archivo que contiene instrucciones CIL). En tiempo de ejecución, el compilador JIT convierte el CIL en código de máquina y lo ejecuta. La diferencia entre administrado y nativo tiene que ver con el objetivo del lenguaje (y su compilador). El código nativo se dirige a la máquina en sí porque está compilada en un conjunto de instrucciones directas de la máquina. Por otro lado, los compiladores de C# compilan su código en CIL porque el compilador de lenguaje C# apunta al tiempo de ejecución de .NET. C# podría decirse que es un "lenguaje gestionado" y cualquier código escrito en él "código administrado". Por ejemplo:

C src -> gcc.exe -> .exe containing a machine binary ->   processor 
C# src -> csc.exe -> .exe assembly containing CIL  -> CLR/JIT -> processor 

Creo que la razón el término "administrado" se utiliza es porque las instrucciones que forman su código en última instancia, se manejan por el tiempo de ejecución de .NET en lugar de ser ejecutados directamente por el procesador. El paso adicional de compilar la fuente a CIL no es en sí mismo lo que hace que su código sea administrado: más bien, el hecho de que su programa nunca sea ejecutado directamente por el procesador sí lo es. El CIL es justo lo que permite que múltiples lenguajes administrados diferentes se dirijan al mismo tiempo de ejecución.

Sé que esto es mucho más bohemio que decir "compilar los lenguajes administrados en CIL", pero eso es porque realmente no creo que sea una descripción completamente precisa de lo que hace que se administre el código. Java bytecode es análogo a CIL, pero existen "procesadores Java" que pueden ejecutar bytecode de forma nativa. Tal procesador también es concebible para .NET CIL, lo que significa que el código compilado en CIL y ejecutado en una máquina así se volvería nativo. El hecho de que su código deba manejarse a través del CLR es lo que lo hace funcionar. El CIL simplemente resulta ser el formato en el que el código debe convertirse a becore, el tiempo de ejecución puede ejecutarlo.

+0

Esto está muy cerca, pero lo que hace que se administre o no es la capa de seguridad que hace la recolección de basura y evita los desbordamientos del búfer de tiempo de ejecución y lo que no. Por lo tanto, los términos "inseguro" se aplican cuando se ejecuta código nativo a partir del código administrado. No se trata de "no ejecutar directamente por el procesador", porque se ejecuta directamente, es solo que el código se verifica y se envuelve en capas de seguridad en tiempo de ejecución. –

2

No entraré en muchos detalles aquí, porque otros ya han cubierto una gran cantidad, pero quiero aclarar algunos puntos que otras respuestas no han explicado bien o correctamente. Esto es en gran parte pedante, y para el 99,99999% de los casos se puede pensar en "C# y CIL/MSIL es código administrado", pero hay algunas sutilezas en esto.

Primero, CIL/MSIL es conocido como un "lenguaje intermedio", lo que significa que es un lenguaje de computadora que se utiliza como un paso intermedio entre el código fuente y el código de máquina nativo final. Sin embargo, esto no tiene que ser necesariamente el caso. He oído hablar de proyectos experimentales donde han creado una CPU que ejecuta CIL (o el equivalente de Java llamado Java Byte Code) directamente sin convertirlo primero a un formato nativo (básicamente, el CIL es la forma nativa).

Código administrado se refiere al código que es "administrado" por un tiempo de ejecución administrado de algún tipo. Esto generalmente significa que el código es basura recolectada, y tiene algún tipo de capa de seguridad que evita cosas como desbordamientos de búfer y otros tipos de problemas que pueden ocurrir en el código nativo. En .net esto se conoce como Common Language Runtime (CLR)

En los viejos tiempos, esto solía conocerse como una "máquina virtual" y por qué el entorno de Java se llama JVM, aunque ese término ahora es en gran parte un nombre inapropiado Hoy en día, con los compiladores JIT (Just in time), no existe una "máquina virtual" real, sino que es una capa de código que "envuelve" el código nativo compilado para garantizar que no se rompen las reglas y para limpiar después tu codigo. También abstrae algunas de las cosas específicas de la plataforma para que el CIL no tenga que preocuparse por ellas.

Por lo tanto, el código administrado se refiere al concepto de código que se ejecuta en un tiempo de ejecución administrado. CIL se considera código administrado cuando se ejecuta en un tiempo de ejecución, como el entorno de tiempo de ejecución .NET.

C# y VB.NET a menudo se consideran "Idiomas administrados" porque normalmente se compilan en CIL y se ejecutan en un tiempo de ejecución administrado. Sin embargo, esto no necesariamente tiene que ser el caso (aunque si sigue la letra de la especificación, probablemente tiene que ser el caso). Por ejemplo, hay compiladores que compilarán C# directamente al código nativo sin un nivel intermedio, y hay intérpretes en tiempo de ejecución para C# que no compilan el código en absoluto, sino que lo "interpretan" en tiempo de ejecución.

Así que lo esencial es que el código administrado y CIL son dos cosas diferentes, pero están relacionados.

Cuestiones relacionadas