340 likes | 456 Views
Common Language Runtime. Mauro Araújo e Rafael Borges {mscla, rmb2}@cin.ufpe.br. Sumário. Componentes COM CLR Assemblies Assembly metadata Type metadata MSIL Modelo de Execução Chamada de Métodos Interoperabilidade. Componentes. Características Genéricos Composicionais
E N D
Common Language Runtime Mauro Araújo e Rafael Borges{mscla, rmb2}@cin.ufpe.br
Sumário • Componentes • COM • CLR • Assemblies • Assembly metadata • Type metadata • MSIL • Modelo de Execução • Chamada de Métodos • Interoperabilidade
Componentes • Características • Genéricos • Composicionais • Encapsulados • Unidades Independentes • Implantação • Versionamento • Modelo Atual • Contratos • Definições de Tipos
COM • Especificação dos Contratos • Sem padrão • IDL, TLB • Dependências • Sem descrição • DLL Hell • Contratos • Físicos • Sem extensibilidade
CLR • Evolução do COM • Assemblies e Contratos • Auto-descritíveis (via Metadados) • Extensíveis (via Atributos) • Descrevem dependências • Side-by-side execution • Virtualização dos Contratos • Referência por Assinatura • Independente de plataforma • Abstrai representação física
Assemblies Assembly metadata Type metadata
Modelo de Execução EXE/DLL (MSIL + METADATA) Source Code Compiler Class Library(MSIL + Metadata) Class Loader C#, VB, C++, Haskell, ... JIT Trustedpre-JITedcode only Call to uncompiled method ManagedNativeCode Execution Security Checks
Execution State Evaluation stack Activation record Incomingarguments top Localvariables Evaluation stack
0 0 0 1 1 1 2 2 2 ... ... ... 0 0 0 1 1 1 2 2 2 ... ... ... Activation Record • Alocados na pilha de execução • Coleção de variáveis locais • Coleção de argumentos do método • Numeração lógica • Ordem de declaração
Onde a computação ocorre de fato Alvo das instruções da CLR Pilha lógica Elementos não possuem um tamanho particular Tipos primitivos Tipos Referência Structs ... Evaluation Stack
Evaluation Stack ldloc n top top Cópia do valor da n-ésima variável local add top v2 top v1 + v2 v1
top top Evaluation Stack stloc n top arg2 top return value arg1 call int32 [mscorlib] System.Math::Max(int32, int32)
top top Evaluation Stack ldelem.u2 array index array elem. array ref.
Carregando campos e variáveis Type Class::field-name [mscorlib]System.Math :: PI
Armazenando campos e variáveis Type Class::field-name [mscorlib]System.Math :: PI
top top clt right operand Bool result left operand Instruções de desvio e comparação • Gerando valores booleanos • clt, ceq, cgt
Instruções de desvio e comparação • Executando o desvio • brfalse • "Branch on false, zero or null" • brtrue • "Branch on nonfalse or nonnull"
Hello World .assembly extern mscorlib {}.assembly hellocs {}.module hellocs.exe .class private auto ansi HelloWorld extends [mscorlib]System.Object { .method public hidebysig static void Main() il managed { .entrypoint .maxstack 1 ldstr "Hello World" call void [mscorlib]System.Console::WriteLine(string) ret } .method public hidebysig specialname rtspecialname instance void .ctor() il managed { .maxstack 1 ldarg.0 call instance void [mscorlib]System.Object:: .ctor() ret } } class HelloWorld { public static void Main() { System.Console.WriteLine("Hello World"); } }
Desvios, loops,... public class Console{ public static void WriteLn(){ System.Console.WriteLine(); } public static void WriteString(char[] str){ int len = str.Length; for( int i = 0; i < len && str[i] != '\0'; i++) System.Console.Write(str[i]); } } public class ProgArgs { public static System.String[] argList = null; public static int ArgNumber() { if (ProgArgs.argList == null) return 0; else return argList.Length; } }
Desvios, loops,... // public static int ArgNumber() { // if (ProgArgs.argList = = null) // return 0; // else // return argList.Length; // } .locals ([0] int32) ldsfld string[] ProgArgs::argList brtrue.s lb01 ldc.i4.0 stloc.0 br.s lb02 lb01: ldsfld string[] ProgArgs::argList ldlen conv.i4 stloc.0 lb02: ldloc.0 ret
// public static void WriteString(char[] str){// int len = str.Length; // for( int i = 0; i < len && str[i] != '\0'; i++) // System.Console.Write(str[i]); // } .locals ([0] int32 len, [1] int32 i) ldarg.0 // load argument str ldlen // get array length conv.i4 stloc.0 // store in len ldc.i4.0 stloc.1 // set i to 0 br.s lb03 // jump to test lb05: ldarg.0 ldloc.1 ldelem.u2 call void [mscorlib]System.Console::Write(wchar) ldloc.1 // load i and increment ldc.i4.1 add stloc.1 // store new value of i lb03: ldloc.1 ldloc.0 bge.s lb04 // test i >= len ldarg.0 ldloc.1 ldelem.u2 brtrue.s lb05 // test str[i] != 0 lb04: ret
Criando Objetos e arrays class Class1 { public int a; public string b; Class1(int n, string s){ a = n; b = s; } public int[] CreateArrayOfInt() { int[] array = new int[this.a]; return array; } static void Main() { Class1 c = new Class1(3,"if724"); int[] array = c.CreateArrayOfInt(); } }
Criando Objetos e arrays .method public hidebysig instance int32[] CreateArrayOfInt() cil managed { .maxstack 1 .locals init ([0] int32[] 'array') ldarg.0 // this ldfld int32 Class1::a newarr [mscorlib]System.Int32 stloc.0 ldloc.0 ret }
Criando Objetos e arrays .method private hidebysig static void Main() cil managed { .entrypoint .maxstack 3 .locals init ([0] class Class1 c, [1] int32[] 'array') ldc.i4.3 ldstr "if724" newobj instance void Class1::.ctor(int32, string) stloc.0 ldloc.0 callvirt instance int32[] Class1::CreateArrayOfInt() stloc.1 ret }
Chamando métodos • Métodos estáticos • call void [mscorlib]System.Console::WriteLine(string) • Métodos de instância não-virtuais • call instance void [mydll]MyNamespace.Class:: Method(int32) • Métodos de instância virtuais • callvirt instance string [mscorlib]System.String::Insert(int32,string)
Interoperabilidade • Linguagem intermediária comum • Especificação de subconjunto mínimo que deve ser suportados por todas as linguagens • CLS
Referências • Essential .NET – Volume 1 • Don Box, with Chris Sells • Compiling for the .NET Common Language Runtime • John Gough • Inside .NET Framework • msdn.microsoft.com/library