2011-05-01 3 views
5

So che .NET e Mono sono binari compatibili ma dato un insieme di codice sorgente, csc e mcs producono esattamente lo stesso identico eseguibile CLI binario al 100% identico? Sarebbe in grado di dire se un eseguibile è stato compilato con csc o mcs?Compatibilità di .NET csc e Mono mcs

risposta

4

Un sacco di cose non sono completamente definite nelle specifiche o sono estensioni specifiche dell'implementazione.

Esempi di non pienamente determinate:

  • la semantica di sincronizzazione di settore eventi simili; questo è esplicitamente aperto alle implementazioni nella specifica ecma; è stricty definita nelle specifiche di MS, ma utilizza una versione diversa in C# 4.0 che non ancora appaiono nelle specifiche formali, IIRC
  • Expression costruzione (da lambda); è semplicemente "definiti altrove" (in realtà, non lo è)

Esempi di estensioni di implementazione:

  • P/Invoke
  • movimentazione interfaccia COM (vale a dire come si può chiamare new su un'interfaccia

Quindi no: non è garantito avere lo stesso IL, sia tra csc o [g] mcs - ma anche tra diverse versioni di csc.

Ancora più: in base alle impostazioni di debug, all'attivazione o meno delle ottimizzazioni e alla definizione di alcune costanti di compilazione (come DEBUG o TRACE), lo stesso compilatore genererà un codice diverso.

1

Sono sicuro che non producono lo stesso IL dallo stesso codice sorgente. Anche le diverse versioni del compilatore MS C# non lo fanno.

L'ottimizzatore funziona in modo diverso e crea un codice leggermente diverso.

mi aspetto le differenze più grandi nella realizzazione di funzioni complesse come iteratori, variabile locale catturata per lamdas, ...

Poi ci sono compilatore generato nomi arbitrari, ad esempio per i tipi anonimi. Nessuna ragione per cui dovrebbero usare lo stesso schema di denominazione per loro.

Non sarei sorpreso se ci fossero alcuni metadati di assembly che contengono anche il nome e la versione del compilatore.

+0

L'ottimizzatore vive nel jitter, non nel compilatore. –

+0

@Hans: il compilatore esegue alcune ottimizzazioni: 'string x =" a "+ s0 + s1;' => 'string x = string.Concat (" a ", s0, s1);" mi viene in mente. Dubito che siano diversi in questo esempio. –

+0

AFAIK sia il jitter che il compilatore hanno alcuni ottimizzatori. Ma hai ragione che l'ottimizzatore di jit fa la maggior parte delle micro ottimizzazioni. – CodesInChaos