El primer código .NET se compila en MSIL y luego JIT lo convierte en código dependiente de la máquina. ¿Alguien me puede decir lo que todos los beneficios obtienen debido a la compilación de 2 pasos. Gracias¿Por qué el código .NET se compila en MSIL?
Respuesta
Hay algunas razones. Lo primero y más probable es que sea multiplataforma. Si C# u otros lenguajes .NET se compilaran directamente en el código nativo, tendrían que recompilarse para cada plataforma en la que se ejecutan. Con una VM, todo el código puede mantenerse en un formato intermedio, y solo necesita escribir una implementación de VM para cada plataforma.
Además, al tener un lenguaje intermediario independiente del idioma, puede tener muchos idiomas de alto nivel (C#, VB.NET, Python, etc.) haciendo referencia a ensamblajes escritos en otros idiomas. Como todos compilan en la misma cosa, pueden trabajar sin problemas entre ellos.
También hay beneficios de rendimiento. El compilador JIT puede realizar optimizaciones agresivas específicamente para la máquina en la que se está ejecutando el código en ese momento. No sé cuánta optimización hace el compilador .NET JIT en este sentido, pero hay beneficios teóricos muy grandes que se podrían tener.
La plataforma cruzada realmente no se aplica mucho al framework .NET ya que solo se ejecutó en Windows, pero sigue siendo un punto válido. +1 –
¿De verdad? Entonces explica Mono. :) –
@Matt ¿me puede explicar amablemente cómo puedo hacer que mi código .net se ejecute en otra plataforma? Significa si quiero ejecutar mi aplicación .net en Linux? ¿Es posible? – Siddiqui
La respuesta se puede encontrar en MSDN
un ejecutable no está vinculado a la plataforma. Por ejemplo, XNA se dirige a procesadores PPC (Xbox360) y x86. Algunos programas se ejecutarán en Mono on Linux o OSX.
Se le permite optimizar mejor para el equipo de destino o reemplazar las funciones que faltan:
- Por ejemplo OSX> = 10,5 compila en falta las instrucciones de la GPU en tiempo de ejecución con OpenCL.
- Digamos que está trabajando en una CPU sin soporte de punto flotante, entonces puede emularla con el JIT sin necesidad de una reescritura de código completa.
- En algún punto en el futuro podría ser posible descargar el procesamiento en la GPU u otros objetivos de forma dinámica (sospecho que los lenguajes funcionales son algo más adecuados para esto).
Tiene razón sobre la afirmación de idiomas funcionales. Las GPU son realmente potentes para * ciertas * situaciones. Los lenguajes funcionales hacen que sea mucho más fácil para la infraestructura decidir cuándo llegan esas situaciones. –
Creo que el futuro será más una mezcla de ambos, FP + código paralelo de hilos masivos (GPGPU). – Stringer
primera conversión del lenguaje de alto nivel y luego a nivel de máquina, esta es la forma en la plataforma .NET está diseñado. La primera capa se ocupa del lenguaje de alto nivel para MSIL y el segundo nivel puede concentrarse en el enganche & falla de la plataforma para convertir de MSIL a código de nivel de máquina. Principalmente es compatible con la interoperabilidad de idiomas y es posible que en un futuro cercano también brinde soporte de Cross Platform cuando Project como Mono gane más terreno.
- 1. El código de argumento opcional se compila en .NET 3.5. ¿Por qué?
- 2. ¿Es MSIL igual que el código administrado en .NET?
- 3. ¿Por qué este código no se compila en g ++
- 4. ¿Por qué/cómo se compila?
- 5. ¿Por qué compila este código C?
- 6. ¿Por qué compila este código Haskell?
- 7. ¿Por qué compila este fragmento de código?
- 8. ¿Por qué este código C# no se compila?
- 9. ¿Por qué no se compila este código de plantilla C++?
- 10. ¿Por qué un objeto complementario de Scala se compila en dos clases (compiladores Java y .NET)?
- 11. ¿Por qué la directiva .MaxStack es opcional en el código MSIL?
- 12. "loop:" en código Java. ¿Qué es esto? ¿Por qué compila?
- 13. ¿Por qué compila esto?
- 14. ¿C++ se convierte en MSIL?
- 15. ¿La compilación del código nativo en .Net elimina el MSIL por completo?
- 16. ¿Por qué compila el siguiente código con MSVC++?
- 17. ¿Qué significa [opt] en MSIL?
- 18. ¿Por qué es tan fácil descompilar el código .NET IL?
- 19. ¿Dónde se almacena en caché el código .NET JIT-compiled?
- 20. ¿Por qué compila?
- 21. ¿Por qué int main() {} compila?
- 22. Característica o error: ¿Por qué compila este código de Java?
- 23. ¿Por qué compila erlang: foo()?
- 24. ¿Por qué aparece el error "Código inseguro solo puede aparecer si se compila con/inseguro"?
- 25. ¿Entiendo este código MSIL correctamente?
- 26. ¿Por qué compila esto en Ideone?
- 27. ¿Por qué no se compila este código C# cuando se usan parámetros con nombre?
- 28. ¿Por qué este código C++ se compila cuando se usa clang -std = gnu ++ 11?
- 29. ¿Por qué ptr_fun (tolower) no se compila en mingw?
- 30. ¿Por qué este programa C se compila sin un error?
Bueno, Java lo hizo hace años antes de que naciera .NET. Así que simplemente creo que .NET copió esa idea. :) –
Bueno, UCSD Pascal hizo eso en la década de 1970 y Java (y muchos otros) "lo copió". ¡Venga! :-) – CesarGon