2009-03-27 15 views
9

He sido desarrollador de C# y .Net desde hace mucho tiempo, y he estado jugando con la idea de aprender C++.¿C++ se convierte en MSIL?

Una de las razones principales por las que he estado pensando en esto, es cuánto más rápido puede ser C++ sobre las aplicaciones que usan .Net Framework. Pero estoy en lo cierto al suponer que si escribo una aplicación C++ en Visual Studio, y/o hago referencia a las bibliotecas .Net en una aplicación C++ que, ese C++ se convierte en MSIL (como C#) - y por lo tanto perdería ningún beneficio de la codificación en él?

Así que mi pregunta es realmente esta: ¿los componentes C++ de una aplicación hacen referencia a los ensamblados .Net compilados de la manera "tradicional", o enviados a MSIL?

Respuesta

25

Bueno, es un poco más complicado que eso. En realidad, hay dos versiones totalmente diferentes de .NET-compatible con C++.

El antiguo, Extensiones administradas para C++, era la única opción disponible en Visual C++ 2002/2003. Está disponible en compiladores más nuevos en la opción/clr: oldSyntax. Es un poco torpe ya que se esfuerza por integrarse con C++ estándar, por lo que todas las palabras clave nuevas (y hay muchas) tienen como prefijo doble, etc. El código generado por este compilador es una mezcla de código nativo y MSIL, denominado IJW " solo funciona ".

El nuevo, llamado C++/CLI, es un nuevo y limpio lenguaje disponible en Visual C++ 2005 y versiones posteriores. Lo más importante, es compatible con varios modos de generación de código. La opción/clr genera nuevamente una mezcla IJW de código nativo y MSIL. /clr: pure resulta en un ensamblado solo administrado, aunque puede traducir tipos nativos en las estructuras .net correspondientes. Por lo tanto, el código puede no ser seguro para el tipo de letra y puede usar la aritmética del puntero, más o menos como C# con/inseguro. Y la opción más estricta es/clr: safe, que produce un ensamblado MSIL de solo seguridad y verificable, exactamente igual que el compilador de C# (sin/inseguro, eso es).

Para las diferencias entre MC++ y C++/CLI, vea wikipedia.

Para obtener una descripción de los conmutadores del compilador, consulte MSDN.

PS. El código de bytes .NET se llama MSIL (Microsoft Intermediate Language) o CIL (Common Intermediate Language). MIL puede representar Media Integration Layer, la biblioteca de bajo nivel indocumentada utilizada por WPF y Vista Desktop Window Manager.

6

This es una discusión bastante buena (aunque anticuada) de C++ gestionado vs no gestionado.

En un shell de tuerca, C++ puede ser administrado (compilado a MIL) o no administrado (compilado a código nativo).

+5

En una "cáscara de red" :) –

2

Independientemente de sus razones para querer aprender C++, siempre es bueno saber más idiomas porque amplía su mente, por lo que aprender C++ es una valiosa lección en sí misma.

Con C++ puede ejecutarlo como una aplicación .NET C++/CLI o nativo. Es solo un modificador de compilador en Visual Studio, sin embargo, hay bastantes diferencias de sintaxis entre los dos. Personalmente creo que aprender ambos sabores es útil.

Cuál elegir en sus proyectos depende un poco de los requisitos, p. si su programa necesita interactuar con otros módulos administrados, como módulos escritos en C#, es preferible usar C++/CLI para evitar algunos cambios generales entre el código administrado y no administrado.

19

Probablemente sea una buena idea mantener los conceptos por separado.

En primer lugar, C++ es un lenguaje, y no especifica nada sobre a qué plataforma se debe dirigir. En principio, el código directo de C++ podría compilarse para el ensamblador nativo x86, bytecode de Java, MSIL o cualquier otra cosa que le interese. Creo que Adobe creó recientemente un compilador de C++ que genera código de bytes Flash.

En segundo lugar, con la típica indecisión, Microsoft ha creado dos lenguajes derivados de C++ que apuntan a .NET. Primero, crearon las "extensiones administradas para C++". Luego decidieron que era una mierda, lo abandonaron e intentaron fingir que nunca existió.

Ahora su mejor apuesta para .NET-style C++ se llama C++/CLI, pero no es C++. Extiende y cambia el idioma en varias formas no estándar. (Y creo que el comité estándar de C++ solicitó que cambien el nombre para evitar confusiones. Pero no lo hicieron)

Visual Studio 2005 y versiones posteriores admiten C++/CLI. (en "Agregar proyecto", se enumeran en Visual C++ -> CLR)

Sin embargo, (no creía que fuera así de simple, ¿verdad?), Microsoft lo ha vuelto a hacer. Después de especificar C++/CLI, que en realidad es un intento razonablemente bien diseñado para integrar C++ con CLI, se dieron cuenta de que prácticamente nadie lo usa. Resulta que incluso los programadores de C++ generalmente prefieren usar C# cuando están trabajando en .NET, y de otra manera, C++ nativo.

Así que ahora, se están enfocando en hacer interoperabilidad entre nativo C++ y .NET más simple y más potente. Sin embargo, C++/CLI no es probable que desaparezca. Funciona, y en algunos casos es útil. Simplemente no es el asesino de C++ que originalmente esperaban.

Visual Studio (desde siempre) también es compatible con aplicaciones nativas de C++, compiladas a código máquina x86, no contaminadas por .NET. Estos se enumeran en el cuadro de diálogo "Agregar proyecto" en Visual C++ -> Win32.

Así que si quieres aprender C++, tienes dos opciones: Aprender C++/CLI, que te limita a un lenguaje solo de MS que sí, genera MSIL en lugar de código de máquina nativo y requiere .NET para ejecutarse, y en general no vale la pena la molestia porque si vas a tomar una dependencia de .NET de todos modos, ¿por qué no escribir en C#?

O aprende C++ apropiado, que está completamente separado de .NET y no puede hacer referencia directamente a los ensamblados .NET.

El punto clave es que son idiomas separados. O compila como C++/CLI, lo que significa que el compilador le permitirá hacer referencia a ensamblados .NET y generará código MSIL, o compilará como C++, en cuyo caso el mundo .NET no existe.

Y, por último, una nota de precaución. A pesar de mi redacción anterior ("C++ correcto" y "no contaminado por .NET"), C++ no es "mejor". En muchos casos, tampoco es más rápido. C++ tiene el potencial para ser más rápido, pero depende mucho más del programador.

El compilador de C# convertirá casi cualquier cosa en un código razonablemente eficiente. C++, por otro lado, está lleno de trampas que harán que su código sea más lento que el equivalente C#.

http://blogs.msdn.com/ricom/archive/2005/05/10/416151.aspx y las entradas de blog que hace referencia son dignas de leer para cualquier persona interesada en el rendimiento de un código similar escrito en los dos idiomas.

Solo hay un área donde las aplicaciones C++ serán consistentemente más rápidas, y eso es en tiempo de inicio. una aplicación .NET puede tener que cargar el framework .NET y JIT el código MSIL, donde una aplicación nativa ... simplemente comienza.

Pero, aparte de eso, probablemente sea un error suponer que C++ será más rápido. Es puede ser, porque le da un poco más de control. Pero, por lo general, eso solo significa que el compilador es menos capaz de salvarte de las ineficiencias que creas en tu código.

1

Los componentes C++ no pueden hacer referencia fácilmente a los ensamblados .Net (debe usar COM). Managed C++ se compila en CIL y tiene el mismo perfil de rendimiento que C#.

C++ es aproximadamente 10% más rápido para el mismo nivel de optimización para la mayoría de los códigos; sin embargo, C# tarda la mitad del tiempo en escribir y depurar, por la misma cantidad de tiempo argumentaría que las optomizaciones que ...