Common Language Common Language RuntimeRuntime
Mauro Araújo e Rafael BorgesMauro Araújo e Rafael Borges{mscla, rmb2}@cin.ufpe.br{mscla, rmb2}@cin.ufpe.br
SumárioSumário ComponentesComponentes
COMCOM CLRCLR
AssembliesAssemblies Assembly metadataAssembly metadata Type metadataType metadata MSILMSIL
Modelo de ExecuçãoModelo de Execução Chamada de MétodosChamada de Métodos
InteroperabilidadeInteroperabilidade
ComponentesComponentes CaracterísticasCaracterísticas
GenéricosGenéricos ComposicionaisComposicionais EncapsuladosEncapsulados
Unidades IndependentesUnidades Independentes ImplantaçãoImplantação VersionamentoVersionamento
Modelo AtualModelo Atual ContratosContratos Definições de TiposDefinições de Tipos
COMCOM Especificação dos ContratosEspecificação dos Contratos
Sem padrãoSem padrão IDL, TLBIDL, TLB
DependênciasDependências Sem descriçãoSem descrição DLL HellDLL Hell
ContratosContratos FísicosFísicos Sem extensibilidadeSem extensibilidade
CLRCLR
Evolução do COMEvolução do COM
Assemblies e ContratosAssemblies e Contratos Auto-descritíveis (via Metadados)Auto-descritíveis (via Metadados) Extensíveis (via Atributos)Extensíveis (via Atributos) Descrevem dependênciasDescrevem dependências Side-by-side executionSide-by-side execution
Virtualização dos ContratosVirtualização dos Contratos Referência por AssinaturaReferência por Assinatura Independente de plataformaIndependente de plataforma Abstrai representação físicaAbstrai representação física
AssembliesAssemblies
Assembly metadata
Type metadata
AssembliesAssemblies
Compiler
Class Loader
JIT
ManagedNativeCode
Security Checks
Execution
Class Library(MSIL +
Metadata)
Source Code
EXE/DLL
(MSIL + METADATA)
Call to
uncompiled method
Trustedpre-JITedcode only
Modelo de ExecuçãoModelo de Execução
C#, VB, C++, Haskell, ...
Execution StateExecution State
Evaluation stack
Activation record
Evaluation stack
Incomingargument
sLocal
variables
top
Activation RecordActivation Record Alocados na pilha de Alocados na pilha de
execuçãoexecução Coleção de variáveis Coleção de variáveis
locaislocais Coleção de Coleção de
argumentos do argumentos do métodométodo
Numeração lógicaNumeração lógica Ordem de Ordem de
declaraçãodeclaração
0
0
1
1
2
2
...
...
0
0
1
1
2
2
...
...
0
0
1
1
2
2
...
...
Evaluation StackEvaluation Stack Onde a computação ocorre de fatoOnde a computação ocorre de fato
Alvo das instruções da CLRAlvo das instruções da CLR
Pilha lógicaPilha lógica Elementos não possuem um tamanho Elementos não possuem um tamanho
particularparticular Tipos primitivos Tipos primitivos Tipos Referência Tipos Referência
Structs Structs ... ...
Evaluation StackEvaluation Stack
top top
Cópia do valor da n-ésima variável local
ldloc n
top
top
add
v2v1 v1 + v2
Evaluation StackEvaluation Stack
top
top
stloc n
top
top arg2arg1 return value
call int32 [mscorlib] System.Math::Max(int32, int32)
Evaluation StackEvaluation Stack
top top
ldelem.u2
array indexarray ref. array elem.
OpcodeOpcode ComentárioComentárioCampo estáticoCampo estático ldsfldldsfld Op-arg: Op-arg: Type Class::field-nameType Class::field-name
Campo de instânciaCampo de instância ldfldldfld Op-arg: Op-arg: Type Class::field-nameType Class::field-name
Variável localVariável local ldlocldloc Op-arg: Op-arg: local variable ordinallocal variable ordinal
Argumentos de Argumentos de métodométodo ldargldarg Op-arg: Op-arg: formal argument formal argument
ordinalordinalElemento de arrayElemento de array ldelem.*ldelem.* Suffix: specialized for element Suffix: specialized for element
typetype
Carregando campos e Carregando campos e variáveisvariáveis
[mscorlib]System.Math :: PI
Type Class::field-name
Carregando constantesCarregando constantes
OpcodeOpcode ComentárioComentárionumbersnumbers ldc.*ldc.* Op-arg: Op-arg: number, number, Suffix denotes Suffix denotes
primitive typeprimitive type
stringsstrings ldstrldstr Op-arg: Op-arg: literal stringliteral string
nullnull ldnullldnull No argument is needed or No argument is needed or allowedallowed
Carregando endereçosCarregando endereços
OpcodeOpcode ComentárioComentárioCampo estáticoCampo estático ldsfldaldsflda Op-arg: Op-arg: Type Class::field-nameType Class::field-name
Campo de instânciaCampo de instância ldfldaldflda Op-arg: Op-arg: Type Class::field-nameType Class::field-name
Variável localVariável local ldlocaldloca Op-arg: Op-arg: local variable ordinallocal variable ordinal
Argumentos de Argumentos de métodométodo ldargaldarga Op-arg: Op-arg: formal argument formal argument
ordinalordinalElemento de arrayElemento de array ldelemaldelema Op-arg: Op-arg: Array ellement Array ellement
typenametypename
Armazenando campos Armazenando campos e variáveise variáveis
OpcodeOpcode ComentárioComentárioCampo estáticoCampo estático stsfldstsfld Op-arg: Op-arg: Type Class::field-nameType Class::field-name
Campo de instânciaCampo de instância stfldstfld Op-arg: Op-arg: Type Class::field-nameType Class::field-name
Variável localVariável local stlocstloc Op-arg: Op-arg: local variable ordinallocal variable ordinal
Argumentos de Argumentos de métodométodo stargstarg Op-arg: Op-arg: formal argument formal argument
ordinalordinalElemento de arrayElemento de array stelem.*stelem.* Suffix: specialized for element Suffix: specialized for element
typetype
[mscorlib]System.Math :: PI
Type Class::field-name
Instruções Instruções aritméticasaritméticas
InstruçãoInstrução int3int322
int6int644
nfloanfloatt
addadd Adição sem verificaçãoAdição sem verificação
add.ovfadd.ovf Verificação de overflowVerificação de overflow "signed" "signed"
add.ovf.unadd.ovf.un Verificação de overflow Verificação de overflow "unsigned""unsigned"
InstruçãoInstrução int3int322
int6int644
nfloanfloatt
divdiv Divisão "signed"Divisão "signed"
div.undiv.un DivisãoDivisão "unsigned" "unsigned"
remrem Resto Resto "signed""signed"
rem.unrem.un Resto Resto "unsigned""unsigned"
Instruções de desvio e Instruções de desvio e comparaçãocomparação Gerando valores booleanosGerando valores booleanos
clt, ceq, cgtclt, ceq, cgt
top top
clt
right operandleft operand Bool result
Instruções de desvio e Instruções de desvio e comparaçãocomparação
OperaçãoOperação Seq. de instruçõesSeq. de instruçõeslOp = rOplOp = rOp ceqceq
lOp != rOplOp != rOp ceq ; ldc.1 ; xorceq ; ldc.1 ; xor
lOp < rOplOp < rOp cltclt
lOp <= rOplOp <= rOp cgt ; ldc.1 ; xorcgt ; ldc.1 ; xor
lOp > rOplOp > rOp cgtcgt
lOp >= rOplOp >= rOp clt ; ldc.1 ; xorclt ; ldc.1 ; xor
Instruções de desvio e Instruções de desvio e comparaçãocomparação Executando o desvioExecutando o desvio
brfalsebrfalse ""Branch on false, zero or nullBranch on false, zero or null""
brtruebrtrue ""Branch on nonfalse or nonBranch on nonfalse or nonnullnull""
OperaçãoOperação InstruçãInstruçãoo
Seq. de Seq. de instruçõesinstruções
lOp = rOplOp = rOp beqbeq beq ; brtruebeq ; brtrue
lOp != rOplOp != rOp bne.unbne.un ceq ; brfalseceq ; brfalse
lOp < rOplOp < rOp bltblt clt ; brtrueclt ; brtrue
lOp <= rOplOp <= rOp bleble cgt ; brfalsecgt ; brfalse
lOp > rOplOp > rOp bgtbgt cgt ; brtruecgt ; brtrue
lOp >= rOplOp >= rOp bgebge clt ; brfalseclt ; brfalse
Instruções de desvio e Instruções de desvio e comparaçãocomparação
class HelloWorld { public static void Main() { System.Console.WriteLine("Hello World"); }}
Hello WorldHello 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 }}
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,...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 lb02lb01: ldsfld string[] ProgArgs::argList ldlen conv.i4 stloc.0lb02: ldloc.0 ret
Desvios, loops,...Desvios, loops,...
// 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 testlb05: 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 ilb03: ldloc.1 ldloc.0 bge.s lb04 // test i >= len ldarg.0 ldloc.1 ldelem.u2 brtrue.s lb05 // test str[i] != 0lb04: ret
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 Criando Objetos e arraysarrays
.method public hidebysig instance int32[] CreateArrayOfInt() cil managed{ .maxstack 1 .locals init ([0] int32[] 'array')
ldarg.0 // thisldfld int32 Class1::anewarr [mscorlib]System.Int32stloc.0ldloc.0ret
}
Criando Objetos e Criando Objetos e arraysarrays
.method private hidebysig static void Main() cil managed{ .entrypoint .maxstack 3 .locals init ([0] class Class1 c, [1] int32[] 'array')
ldc.i4.3ldstr "if724"newobj instance void Class1::.ctor(int32, string)stloc.0ldloc.0callvirt instance int32[] Class1::CreateArrayOfInt()stloc.1ret
}
Criando Objetos e Criando Objetos e arraysarrays
Chamando métodosChamando métodos
Métodos estáticosMétodos estáticos call void [mscorlib]System.Console::WriteLine(string)call void [mscorlib]System.Console::WriteLine(string)
Métodos de instância não-virtuaisMétodos de instância não-virtuais call instance void [mydll]MyNamespace.Class:: Method(int32)call instance void [mydll]MyNamespace.Class:: Method(int32)
Métodos de instância virtuaisMétodos de instância virtuais callvirt instance string callvirt instance string
[mscorlib]System.String::Insert(int32,string)[mscorlib]System.String::Insert(int32,string)
Chamada de métodosChamada de métodos
InteroperabilidadeInteroperabilidade Linguagem intermediária comumLinguagem intermediária comum
Especificação de subconjunto mínimo Especificação de subconjunto mínimo que deve ser suportados por todas as que deve ser suportados por todas as linguagenslinguagens CLSCLS
ReferênciasReferências Essential .NET – Volume 1Essential .NET – Volume 1
Don Box, with Chris SellsDon Box, with Chris Sells
Compiling for the .NET Common Compiling for the .NET Common Language RuntimeLanguage Runtime John GoughJohn Gough
Inside .NET FrameworkInside .NET Framework msdn.microsoft.com/librarymsdn.microsoft.com/library