2011-05-01 14 views

Respuesta

4

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.

1

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.

+0

El optimizador vive en el jitter, no en el compilador. –

+0

@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. –

+0

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