È compilato.
Il compilatore csc di C# compila in formato "IL" che significa
"Intermediate Language" un linguaggio che è facilmente traducibile
(quasi 1:1) con la maggior parte di assembly language delle cpu
attuali.
Quando l'assembly (la dll/exe che contiene codice IL) viene eseguita
sul PC avviene una seconda compilazione a cura del JIT (just in time
compiler) che traduce molto velocemente il codice IL nell'assembly
della CPU sulla quale sta per essere eseguito.
Il vantaggio di questa compilazione finale è di poter utilizzare al
meglio le specificità della CPU su cui sta per essere eseguito (per
esempio x32 x64, oppure istruzioni che esistono solo in CPU di ultima
generazione)
Il JIT compila solo i metodi eseguiti (non tutto l'exe) e ovviamente
una sola volta.
Se vuoi evitare anche il passo del JIT (in alcuni casi è desiderabile,
ma spesso è inutile) puoi eseguire il precompilatore ngen che crea
direttamente il codice assembler finale senza più avere la necessità di
quello che fa il JIT (addirittura non viene neppure caricato il codice
del compilatore JIT in memoria).
Questo step è possibile in queste condizioni:
- ngen deve essere eseguito sempre e solo sulla macchina su cui verrà
avviata l'applicazione
- ad ogni cambio di versione ngen deve essere rifatto
- l'assembly originale (quello con il codice IL) deve essere sul pc
perché contiene il manifest e altri metadati indispensabili
all'esecuzione
Per verificare il tempo e il numero di compilazioni del JIT è
sufficiente usare perfmon e misurare l'attività del JIT
Su molti tipi di algoritmi un listato C# può anche essere più
performante rispetto a codice C/C++.
La prima causa di mancanza di performance di C# rispetto a C/C++ è il
marshalling di memoria durante operazioni di interoperabilità (COM/API
native, etc.) e non di 'esecuzione' in quanto tale.
L'unica piattaforma sulla quale C# è invece interpretato è il Micro
Framework (destinato a CPU sui 100MHz senza MMU) ma qui l'architettura
è molto diversa anche perché HAL, PAL e CLR fanno anche da sistema
operativo.
--
Raffaele Rialdi http://www.iamraf.net
Weblog: http://blogs.ugidotnet.org/raffaele
Microsoft MVP profile
https://mvp.support.microsoft.com/profile/raffaele
UGIdotNET - http://www.ugidotnet.org/
Thanks.
Grazie a te!