Sé que .NET y Mono son binarios compatibles pero dado un conjunto de código fuente, ¿csc y mcs producirán el mismo ejecutable de CLI binario 100% idéntico? ¿Uno podría decir si un ejecutable fue compilado con csc o mcs?Compatibilidad de .NET csc y Mono mcs
Respuesta
Muchas cosas no están completamente definidas en la especificación, o son extensiones específicas de la implementación.
Los ejemplos de no-especificada completamente:
- la semántica de sincronización de los eventos de campo similares; esto es explícitamente abierto a implementaciones en la especificación ecma; es stricty se define en la especificación MS, pero utiliza una versión diferente en C# 4.0 que todavía no aparecen en la especificación formal, IIRC
Expression
construcción (de lambdas); es simplemente "se define en otro lugar" (en realidad, no lo es)
ejemplos de extensiones de aplicación:
- P/Invoke manejo
- interfaz COM (es decir, cómo se puede llamar
new
en una interfaz)
Así que no: no se garantiza que tenga la misma IL, ya sea entre csc o [g] mcs, pero incluso entre diferentes versiones de csc.
Aún más: según la configuración de depuración, las optimizaciones habilitadas o no, y algunas constantes de compilación definidas (como DEBUG o TRACE), el mismo compilador generará código diferente.
Estoy seguro de que no producen la misma IL del mismo código fuente. Incluso las diferentes versiones del compilador MS C# no lo hacen.
El optimizador funcionará de manera diferente y creará códigos ligeramente diferentes.
espero mayores diferencias en la implementación de características complejas tales como iteradores, variable local capturado por lamdas, ...
Luego están los nombres del compilador genera arbitrarias, por ejemplo para los tipos anónimos. No hay razón por la cual deberían usar el mismo esquema de nomenclatura para ellos.
No me sorprendería que hubiera algunos metadatos de ensamblaje que también contengan el nombre y la versión de su compilador.
- 1. Monocompilador como un servicio (MCS)
- 2. Diferencias de .Net y MONO portátiles
- 3. Compatibilidad mono con bool Type.op_Equality (Type, Type)
- 4. Comenzando con JSON en .net y mono
- 5. ¿Soporta Mono .NET y compila C++/CLI?
- 6. .NET/Mono Install Base
- 7. .NET/Mono Database Engine
- 8. Reflector .NET para Mono
- 9. ¿Controles de cuadrícula compatibles con .NET y Mono?
- 10. Mono y IHttpHandler
- 11. ¿Mono es un subconjunto de .NET?
- 12. Linux Mono Equivalente de .NET Windows Service
- 13. ¿Por qué hay cuatro compiladores mono C#?
- 14. Cómo decodificar wav, mp3 y/ogg en .Net/Mono?
- 15. Compilador # directivo para dividir entre Mono y .NET
- 16. Diferencias en el desarrollo entre .NET y Mono
- 17. ¿Compatibilidad de versión con serialización .NET?
- 18. Cómo apuntar .NET 4.0 bajo mono
- 19. Mejor biblioteca gráfica para .NET/Mono
- 20. CouchDB - .NET o Mono Tecnología equivalente
- 21. Mono funciones creadas disponibles en .NET?
- 22. Cobertura de código usando pruebas mono y nunit
- 23. Compatibilidad con .NET Framework para hardware multinúcleo
- 24. Autenticación mono y ASP.NET
- 25. DotGNU vs Mono
- 26. Compatibilidad con JPEG 2000 en C# .NET
- 27. ¿Mono es estable y lo suficientemente rápido?
- 28. OpenGL Core y compatibilidad
- 29. Compatibilidad de ARC y Storyboard
- 30. Código Broken Mono C# usando System.Windows.Forms
El optimizador vive en el jitter, no en el compilador. –
@Hans: el compilador realiza algunas optimizaciones: 'string x =" a "+ s0 + s1;' => 'string x = string.Concat (" a ", s0, s1);' viene a la mente. Sin embargo, dudo que difieran en este ejemplo. –
AFAIK Tanto el jitter como el compilador tienen algunos optimizadores. Pero tienes razón en que el optimizador de jit hace la mayoría de las micro optimizaciones. – CodesInChaos