La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Introduzione al CLR/MSIL Alfredo Paolillo e Marco Servetto.

Presentazioni simili


Presentazione sul tema: "Introduzione al CLR/MSIL Alfredo Paolillo e Marco Servetto."— Transcript della presentazione:

1 Introduzione al CLR/MSIL Alfredo Paolillo e Marco Servetto

2 Vocabolario IL: IL: Intermediate Language, Standard ECMA del 1997 Intermediate Language, Standard ECMA del 1997 MSIL: MSIL: Microsoft IL, Implementazione Microsoft di IL Microsoft IL, Implementazione Microsoft di IL

3 Introduzione Perché.NET Perché.NET Ambiente di esecuzione Ambiente di esecuzione Common Language Runtime Common Language Runtime

4 Perché.NET Difficile effettuare sviluppo omogeneo Difficile effettuare sviluppo omogeneo Molto tempo viene dedicato a far comunicare i vari “strati” Molto tempo viene dedicato a far comunicare i vari “strati” Serve un salto qualitativo per semplificare lo scenario Serve un salto qualitativo per semplificare lo scenario

5 Codici Evoluzione Evoluzione Codice nativo Codice nativo Codice interpretato Codice interpretato Codice MSIL Codice MSIL

6 Codice nativo Codice nativo (.EXE) Output Compilatore Sorgenti

7 Codice interpretato Interprete Output Sorgenti

8 Codice MSIL Codice nativo Output Compilatore JIT Codice MSIL (Assembly).EXE/.DLL Compilatore.NET Sorgenti

9 Codice MSIL Codice nativo Output Sorgenti Compilatore JIT Codice MSIL (Assembly).EXE/.DLL Compilatore.NET Codice + metadati

10 Codice MSIL Codice nativo Output Compilatore JIT Codice MSIL (Assembly).EXE/.DLL Compilatore.NET Sorgenti Ambiente di esecuzione.NET Runtime

11 Motori JIT Inizialmente previsti 4 motori: Inizialmente previsti 4 motori: MotoreDescrizione Dove si trova JIT Attuale implementazione OptiJit Codice più ottimizzato Non implementato FastJit Esecuzione JIT più veloce.NET Compact Framework Native (Pre-Jit) Compilazione preventiva, assembly compilato salvato in GAC NGEN.EXE

12 JIT – Just in Time Compiler In teoria, come con Java, è possibile compilare MSIL ed eseguirlo (interpretato) in qualsiasi ambiente che supporti l’esecuzione In teoria, come con Java, è possibile compilare MSIL ed eseguirlo (interpretato) in qualsiasi ambiente che supporti l’esecuzione La compilazione di un’applicazione da un tipo di codice assembly quale MSIL verso un codice eseguibile sulla macchina nativa dovrebbe appesantire le prestazioni dell’applicazione La compilazione di un’applicazione da un tipo di codice assembly quale MSIL verso un codice eseguibile sulla macchina nativa dovrebbe appesantire le prestazioni dell’applicazione È quello che succede? È quello che succede?

13 JIT – Just in Time Compiler Il codice non viene caricato tutto in memoria Il codice non viene caricato tutto in memoria il compilatore JIT compila solo il codice necessario, quindi memorizza nella cache il codice nativo compilato per riutilizzarlo il compilatore JIT compila solo il codice necessario, quindi memorizza nella cache il codice nativo compilato per riutilizzarlo L’overhead è una lieve differenza che, nella maggior parte dei casi, non verrà rilevata L’overhead è una lieve differenza che, nella maggior parte dei casi, non verrà rilevata

14 JIT – Just in Time Compiler Quando viene caricata una classe, il caricatore aggiunge uno stub a ogni metodo della classe Quando viene caricata una classe, il caricatore aggiunge uno stub a ogni metodo della classe La prima volta che viene chiamato il metodo, il codice stub cede il controllo al compilatore JIT, che compila MSIL nel codice nativo. La prima volta che viene chiamato il metodo, il codice stub cede il controllo al compilatore JIT, che compila MSIL nel codice nativo. Lo stub viene quindi modificato per puntare al codice nativo appena creato, affinché le chiamate successive passino direttamente al codice nativo Lo stub viene quindi modificato per puntare al codice nativo appena creato, affinché le chiamate successive passino direttamente al codice nativo

15 Indipendenza dalla piattaforma.NET è un’implementazione di CLI.NET è un’implementazione di CLI Common Language Infrastructure Common Language Infrastructure CLI è uno standard ECMA CLI è uno standard ECMA ECMA-334, ECMA-335 ECMA-334, ECMA-335 Esistono già altre implementazioni di CLI: Esistono già altre implementazioni di CLI: SSCLI (Microsoft, per Windows, FreeBSD e Macintosh) SSCLI (Microsoft, per Windows, FreeBSD e Macintosh) Mono (per Linux) Mono (per Linux) DotGNU DotGNU Intel OCL (Open CLI Library) Intel OCL (Open CLI Library) …

16 Codice IL Tutto questo assomiglia a qualcosa di già visto? Forse Java? Ci sono delle differenze Ci sono delle differenze Un compilatore Java crea bytecode, che in fase di esecuzione viene interpretato tramite JVM Un compilatore Java crea bytecode, che in fase di esecuzione viene interpretato tramite JVM.NET crea un codice nativo.NET crea un codice nativo

17 Codice IL Un vantaggio rilevante offerto da.NET Framework rispetto a Java e JVM è la scelta del linguaggio di programmazione Un vantaggio rilevante offerto da.NET Framework rispetto a Java e JVM è la scelta del linguaggio di programmazione JVM solo Java JVM solo Java.NET Multilinguaggio (VB.net, C#, J# etc…).NET Multilinguaggio (VB.net, C#, J# etc…) Vediamo un esempio di IL Vediamo un esempio di IL

18 Assembly Assembly Codice IL Metadati Manifest Modulo (file PE)

19 Metadati Concetto chiave in.NET Concetto chiave in.NET Informazioni sui tipi di un assembly Informazioni sui tipi di un assembly Generati automaticamente dai compilatori Generati automaticamente dai compilatori Estendibili da terze parti Estendibili da terze parti Formato binario rappresentabile con XML: Formato binario rappresentabile con XML: XML Schema (XSD) XML Schema (XSD) Serializzazione e deserializzazione oggetti a runtime in XML Serializzazione e deserializzazione oggetti a runtime in XML

20 Metadati Descrizione di un assembly Descrizione di un assembly Identità: nome, versione, cultura [, pubblic key] Identità: nome, versione, cultura [, pubblic key] Tipi esportati Tipi esportati Assembly da cui dipende Assembly da cui dipende Descrizione dei tipi Descrizione dei tipi Nome, visibilità, classe base, interfacce implementate Nome, visibilità, classe base, interfacce implementate Attributi custom Attributi custom Definiti dall’utente Definiti dall’utente Definiti dal compilatore Definiti dal compilatore

21 Codice IL Proviamo adesso a scrivere e compilare dei semplici programmi in C# e proviamo ad analizzarli Proviamo adesso a scrivere e compilare dei semplici programmi in C# e proviamo ad analizzarli

22 Codice IL Esempio 1 Esempio 1 namespace testUno { public class esempioUno { public esempioUno() {} static void Main(string[] args) { int primaVariabile = 0x1234; int secondaVariabile = 0xabcdef; }}}

23 Codice IL Il file eseguibile è costituito da due parti: Il file eseguibile è costituito da due parti: la prima è il codice MSIL, utilizzato per generare il codice nativo la prima è il codice MSIL, utilizzato per generare il codice nativo la seconda è rappresentata dai metadati la seconda è rappresentata dai metadati Con un tool in dotazione con l’SDK possiamo Diassemblare il file ottenuto dalla compilazione Con un tool in dotazione con l’SDK possiamo Diassemblare il file ottenuto dalla compilazione Otterremo il seguente output Otterremo il seguente output Tralasceremo comunque alcuni dettagli come il codice del costruttore di classe Tralasceremo comunque alcuni dettagli come il codice del costruttore di classe

24 Codice IL.method private hidebysig static void Main(string[] args) cil managed {.entrypoint.entrypoint // Code size 13 (0xd) // Code size 13 (0xd).maxstack 1.maxstack 1.locals init (int32 V_0, int32 V_1).locals init (int32 V_0, int32 V_1) IL_0000: ldc.i4 0x1234 IL_0000: ldc.i4 0x1234 IL_0005: stloc.0 IL_0005: stloc.0 IL_0006: ldc.i4 0xabcdef IL_0006: ldc.i4 0xabcdef IL_000b: stloc.1 IL_000b: stloc.1 IL_000c: ret IL_000c: ret } // end of method esempioUno::Main

25 Codice IL – istruzioni principali.entrypoint.entrypoint Specifies that this method is the entry point to the application (only one such method is allowed)..maxstack.maxstack int32 specifies the maximum number of elements on the evaluation stack during the execution of the method.locals [init] Defines a set of local variables for this method. ldc.i4: ldc.i4: Description Description Push num of type int32 onto the stack as int32. stloc.0: stloc.0: Description: Description: Pop value from stack into local variable 0. ret: ret: Description: Description: return from method, possibly returning a value

26 Codice IL – Metainformazioni ScopeName : testUno.exe MVID : {F01C8E38-E942-43D9-9D71-95D37789D357} =========================================================== Global functions Global fields Global MemberRefs TypeDef # TypDefName: testUno.esempioUno ( ) Flags : [Public] [AutoLayout] [Class] [AnsiClass] ( ) Extends : [TypeRef] System.Object Method # MethodName:.ctor ( ) Flags : [Public] [HideBySig] [ReuseSlot] [SpecialName] [RTSpecialName] [.ctor] ( ) RVA : 0x ImplFlags : [IL] [Managed] ( ) CallCnvntn: [DEFAULT] hasThis ReturnType: Void No arguments. Method #2 [ENTRYPOINT] MethodName: Main ( ) Flags : [Private] [Static] [HideBySig] [ReuseSlot] ( ) RVA : 0x ImplFlags : [IL] [Managed] ( ) CallCnvntn: [DEFAULT] ReturnType: Void 1 Arguments Argument #1: SZArray String 1 Parameters (1) ParamToken : ( ) Name : args flags: [none] ( )

27 Codice IL – Metainformazioni TypeRef #1 ( ) Token: 0x ResolutionScope: 0x TypeRefName: System.Object MemberRef # Member: (0a000002).ctor: CallCnvntn: [DEFAULT] hasThis ReturnType: Void No arguments. TypeRef #2 ( ) Token: 0x ResolutionScope: 0x TypeRefName: System.Diagnostics.DebuggableAttribute MemberRef # Member: (0a000001).ctor: CallCnvntn: [DEFAULT] hasThis ReturnType: Void 2 Arguments Argument #1: Boolean Argument #2: Boolean

28 Codice IL – Metainformazioni Signature #1 (0x ) CallCnvntn: [LOCALSIG] 2 Arguments Argument #1: I4 Argument #2: I4 Assembly Token: 0x Name : testUno Public Key : Hash Algorithm : 0x Major Version: 0x Minor Version: 0x Build Number: 0x Revision Number: 0x Locale: Locale: Flags : [SideBySideCompatible] ( ) CustomAttribute #1 (0c000001) CustomAttribute Type: 0a CustomAttributeName: System.Diagnostics.DebuggableAttribute :: instance void.ctor(bool,bool) Length: 6 Value : > < ctor args: ( )

29 Codice IL – Metainformazioni AssemblyRef # Token: 0x Public Key or Token: b7 7a 5c e0 89 Name: mscorlib Major Version: 0x Minor Version: 0x Build Number: 0x Revision Number: 0x Locale: Locale: HashValue Blob: Flags: [none] ( )

30 Codice IL I metadati vengono organizzati in tabelle, in cui fondamentalmente viene descritto ciò che il codice definisce e a cui fa riferimento Prestiamo attenzione a questa parte di codice: CallCnvntn: [LOCALSIG] 2 Arguments Argument #1: I4 Argument #2: I4

31 Codice C# Proviamo adesso a compilare il seguente codice Proviamo adesso a compilare il seguente codiceFILE:esempioDueB namespace testDue { public class esempioDueB { static void Main(string[] args) { esempioDueA variabile = new esempioDueA(); variabile.printString();}}}

32 Codice C# FILE: esempioDueA using System; namespace testDue { public class esempioDueA { public esempioDueA() {} public void printString() { string s = "Hello!!!!"; Console.Write(s);}}}

33 Codice IL Disassembliamo: Disassembliamo: A differenza di prima dovremo analizzare due codici

34 Codice IL.method private hidebysig static void Main(string[] args) cil managed {.entrypoint.entrypoint // Code size 13 (0xd) // Code size 13 (0xd).maxstack 1.maxstack 1.locals init (class testDue.esempioDueA V_0).locals init (class testDue.esempioDueA V_0) IL_0000: newobj instance void testDue.esempioDueA::.ctor() IL_0000: newobj instance void testDue.esempioDueA::.ctor() IL_0005: stloc.0 IL_0005: stloc.0 IL_0006: ldloc.0 IL_0006: ldloc.0 IL_0007: callvirt instance void testDue.esempioDueA::printString() IL_0007: callvirt instance void testDue.esempioDueA::printString() IL_000c: ret IL_000c: ret } // end of method esempioDueB::Main

35 Codice IL.method public hidebysig instance void printString() cil managed { // Code size 13 (0xd) // Code size 13 (0xd).maxstack 1.maxstack 1.locals init (string V_0).locals init (string V_0) IL_0000: ldstr "Hello!!!!" IL_0000: ldstr "Hello!!!!" IL_0005: stloc.0 IL_0005: stloc.0 IL_0006: ldloc.0 IL_0006: ldloc.0 IL_0007: call void [mscorlib]System.Console::Write(string) IL_0007: call void [mscorlib]System.Console::Write(string) IL_000c: ret IL_000c: ret } // end of method esempioDueA::printString

36 Codice IL Principali differenze rispetto al codice precedente: Newobj: Newobj: Assembli format: Assembli format: newobjctor Description: Description: allocate an uninitialized object or value type and call ctor Call: Call: Assembli format: call method Assembli format: call method Description: Description: Call method described by method Callvirt: Callvirt: Assembli format: Assembli format: callvirt method Description: Description: Call a method associated with obj

37 Codice IL Andiamo nuovamente a riesaminare le meta-informazioni: Andiamo nuovamente a riesaminare le meta-informazioni: Signature #2 (0x ) (EsempioDueB) CallCnvntn: [LOCALSIG] 1 Arguments Argument #1: Class testDue.esempioDueA Signature #1 (0x ) (EsempioDueA) CallCnvntn: [LOCALSIG] 1 Arguments Argument #1: String

38 Codice IL – Metainformazioni Method #2 (definizione del metodo invocato dalla call) MethodName: printString ( ) Flags : [Public] [HideBySig] [ReuseSlot] ( ) RVA : 0x ImplFlags : [IL] [Managed] ( ) CallCnvntn: [DEFAULT] hasThis ReturnType: Void No arguments User Strings (costante) : ( 9) L"Hello!!!!”

39 Codice C# Passaggio di parametri: Passaggio di parametri: namespace testTre { public class esempioTreA { static void Main(string[] args) { string s = ("HELLO!!!!!!!!!!!!!!!!!!!!!!!!!!"); esempioTreB variabile = new esempioTreB(); variabile.printString(s);}}}

40 Esempio C# Using system; public class esempioTreB { public esempioTreB() {} public void printString(string s) {Console.Write(s);}}

41 Codice IL.method private hidebysig static void Main(string[] args) cil managed {.entrypoint.entrypoint // Code size 20 (0x14) // Code size 20 (0x14).maxstack 2.maxstack 2.locals init (string V_0, class testTre.esempioTreB V_1).locals init (string V_0, class testTre.esempioTreB V_1) IL_0000: ldstr "HELLO!!!!!!!!!!!!!!!!!!!!!!!!!!" IL_0000: ldstr "HELLO!!!!!!!!!!!!!!!!!!!!!!!!!!" IL_0005: stloc.0 IL_0005: stloc.0 IL_0006: newobj instance void testTre.esempioTreB::.ctor() IL_0006: newobj instance void testTre.esempioTreB::.ctor() IL_000b: stloc.1 IL_000b: stloc.1 IL_000c: ldloc.1 IL_000c: ldloc.1 IL_000d: ldloc.0 IL_000d: ldloc.0 IL_000e: callvirt instance void testTre.esempioTreB::printString(string) IL_000e: callvirt instance void testTre.esempioTreB::printString(string) IL_0013: ret IL_0013: ret } // end of method esempioTreA::Main

42 Codice IL.method public hidebysig instance void printString(string s) cil managed { // Code size 7 (0x7) // Code size 7 (0x7).maxstack 1.maxstack 1 IL_0000: ldarg.1 IL_0000: ldarg.1 IL_0001: call void [mscorlib]System.Console::Write(string) IL_0001: call void [mscorlib]System.Console::Write(string) IL_0006: ret IL_0006: ret } // end of method esempioTreB::printString

43 Codice IL ldarg.1 ldarg.1 Assembli format: ldarg.1 Assembli format: ldarg.1 Description: Description: Load argument 1 onto stack Esistono anche delle varianti, ad esempio: ldarg num Assembli format: ldarg num Assembli format: ldarg num Description: Description: Load argument numbered num onto stack.

44 Codice IL – Metainformazioni TypeDef # TypDefName: testTre.esempioTreB ( ) Flags : [Public] [AutoLayout] [Class] [AnsiClass] ( ) Extends : [TypeRef] System.Object Method # MethodName:.ctor ( ) Flags : [Public] [HideBySig] [ReuseSlot] [SpecialName] [RTSpecialName] [.ctor] ( ) RVA : 0x ImplFlags : [IL] [Managed] ( ) CallCnvntn: [DEFAULT] hasThis ReturnType: Void No arguments. Method # MethodName: printString ( ) Flags : [Public] [HideBySig] [ReuseSlot] ( ) RVA : 0x ImplFlags : [IL] [Managed] ( ) CallCnvntn: [DEFAULT] hasThis ReturnType: Void 1 Arguments Argument #1: String 1 Parameters (1) ParamToken : ( ) Name : s flags: [none] ( )

45 Codice IL – Metainformazioni Signature #1 (0x ) CallCnvntn: [LOCALSIG] 2 Arguments Argument #1: String Argument #2: Class testTre.esempioTreB Assenza di Signature #2 La classe su cui viene invocato il metodo printString non ha dichiarazioni locali

46 Garbage Collector Gli oggetti vengono distrutti automaticamente quando non sono più referenziati Gli oggetti vengono distrutti automaticamente quando non sono più referenziati Algoritmo Mark-and-Compact Algoritmo Mark-and-Compact

47 Garbage Collector - fase 1: Mark NextObjPtr Oggetti “vivi” Oggetti non raggiungibili Spazio libero Root set

48 Garbage Collector - fase 2: Compact NextObjPtr Oggetti “vivi” Spazio libero Root set Spazio recuperato

49 GC e distruzione deterministica In alcuni casi serve un comportamento di finalizzazione deterministica: In alcuni casi serve un comportamento di finalizzazione deterministica: Riferimenti a oggetti non gestiti Riferimenti a oggetti non gestiti Utilizzo di risorse che devono essere rilasciate appena termina il loro utilizzo Utilizzo di risorse che devono essere rilasciate appena termina il loro utilizzo Non si possono usare i finalizzatori, che non sono richiamabili direttamente Non si possono usare i finalizzatori, che non sono richiamabili direttamente Implementare l’interfaccia IDisposable Implementare l’interfaccia IDisposable

50 Common Type System Tutto è un oggetto Tutto è un oggetto Due categorie di tipi: Due categorie di tipi: Tipi reference (riferimento) Tipi reference (riferimento) Allocati su heap gestito Allocati su heap gestito Tipi value (valore) Tipi value (valore) Allocati su stack o in oggetti gestiti (reference) Allocati su stack o in oggetti gestiti (reference) Tutti i tipi value possono essere visti come tipi reference Tutti i tipi value possono essere visti come tipi reference Boxing Boxing

51 Tipi value e reference in memoria StackHeap height width Class CSize v.height v.width r public struct Size { public int height; public int weight; } public class CSize { public int height; public int weight; } void Main() { Size v; // v istanza di Size v.height = 100; // ok CSize r; // r è un reference r.height = 100; // illegale, r non assegnato r = new CSize(); // r fa riferimento a un CSize r.height = 100; // ok, r inizializzata }

52 Equivalenza e identità Il confronto tra oggetti può essere: Il confronto tra oggetti può essere: di equivalenza di equivalenza Object.Equals: oggetti con stesso tipo e uguale contenuto Object.Equals: oggetti con stesso tipo e uguale contenuto di identità di identità Object.ReferenceEquals: stessa istanza o entrambi null Object.ReferenceEquals: stessa istanza o entrambi null ==: dipende dal tipo (come ReferenceEquals o altro) ==: dipende dal tipo (come ReferenceEquals o altro) Object.GetHashCode: rappresentazione univoca istanza Object.GetHashCode: rappresentazione univoca istanza StackHeap height width Class CSize r2 r1 r2=r1;

53 Equivalenza e identità “Teo” 19 c a d b truetruec falsetrueb falsefalsea ==d.Equals(d) “Ugo” 38 “Ugo” 38

54 Boxing I tipi value si possono sottoporre a “boxing” per supportare le funzionalità tipiche degli oggetti I tipi value si possono sottoporre a “boxing” per supportare le funzionalità tipiche degli oggetti Un tipo value “boxed” è un clone indipendente Un tipo value “boxed” è un clone indipendente Un tipo value “boxed” può tornare ad essere value (unboxing) Un tipo value “boxed” può tornare ad essere value (unboxing) System.Object è il tipo universale System.Object è il tipo universale

55 Boxing int i = 123; object o = i; int k = (int)o; 123 i o int k int j = (int)o; object o = i; int i = 123; Stack Heap Boxing Unboxing

56 Conclusioni Evoluzione della macchina virtuale Evoluzione della macchina virtuale Si cerca di trovare il miglior compromesso tra sicurezza, flessibilità e prestazioni Si cerca di trovare il miglior compromesso tra sicurezza, flessibilità e prestazioni Non tutto è documentato Non tutto è documentato Scarsa documentazione per quanto riguarda i metadati Scarsa documentazione per quanto riguarda i metadati

57 Altre Informazioni Dove posso ottenere maggiori informazioni Dove posso ottenere maggiori informazioni Developer resources Developer resources Microsoft Visual Studio.NET Microsoft Visual Studio.NET Microsoft.NET Framework SDK Microsoft.NET Framework SDK Microsoft Developer Network Microsoft Developer Network


Scaricare ppt "Introduzione al CLR/MSIL Alfredo Paolillo e Marco Servetto."

Presentazioni simili


Annunci Google