Skip to content

Sumários

Nuno Leite edited this page Jun 11, 2019 · 32 revisions

Sumários

Semana 1 - Aula 1 - 18/Fev/2019

  • Apresentação da disciplina

  • Regras de Avaliação

  • Bibliografia recomendada

  • Página do Moodle

  • Evolução histórica e comparação com a plataforma Java

Comandos básicos da ferramenta de controlo de versões git:

git init
git remote add origin https://github.com/isel-leic-ave/ave-2018-19-sem2-i41n.git
git pull origin master # copiar remote para local
git add . --all
git commit -m "Aula 01"
git push -u origin master # copiar local para remote

Leitura:

Semana 1 - Aula 2 e 3 - 22/Fev/2019

  • Arquitetura da Common Language Infrastructure (CLI)
    • Código managed vs. código unmanaged
    • Metadata
    • Ambiente virtual de execução
    • Representação intermédia
    • Sistema de tipos comum
  • Requisitos das plataformas de desenvolvimento e execução modernas
    • Portabilidade
    • Interoperabilidade entre linguagens
    • Serviços (Garbage collection, Serialização, segurança)
    • Funcionalidade (bibliotecas)
  • Assembly como unidade de distribuição; constituição dum assembly e seu processamento
  • Metadata; namespace System.Reflection
  • Constituição das tabelas de metadata; três tipos de tabelas: definition, reference, e manifest tables
  • Exemplo: classes Point e TestPoint; ferramentas de compilação; visualização da metadata usando a ferramenta ildasm
  • Assemblies, manifestos e Módulos
  • Processamento de CIL (Common Intermediate Language)
    • Arquitetura (concetual) baseada em stack
    • Estado de execução
      • argumentos (tabela Args) e variáveis locais (tabela Locs)
      • stack de avaliação
  • Análise do CIL presente em assemblies e módulos usando a ferramenta ILDASM (exemplo: Point.dll e TestPoint.dll)

Exercícios

  • Resolver Exercícios 1 e 2 (ver Wiki)

Leitura:

Semana 2 - Aula 4 - 25/Fev/2019

  • Estudo de construções básicas da linguagem IL (programas Branches.il, Loops.il, Methods.il)
  • Interoperabilidade entre linguagens; exemplo envolvendo as linguagens C++/CLI, C# e VB.Net
    • importância da representação intermédia, metadata, CTS (Common Type System) e dos compiladores .Net

Leitura:

Essential .NET: Cap. 4 (metadata) CLR via C#: Caps. 1 e 2

Semana 2 - Aula 5 e 6 - 1/Mar/2019

  • Interoperabilidade entre linguagens; exemplo envolvendo as linguagens C++/CLI, C# e VB.Net
    • importância da representação intermédia, metadata, CTS (Common Type System) e dos compiladores .Net
  • Safe code, Verifier e ferramenta PEVerify.exe
    • Alteração de código CIL de assembly adicionando um inteiro ao stack de modo a que o stack fique inválido; assemblagem de ficheiros CIL usando ilasm
  • Loader (slide 37 de ave-01-CLI.pdf)
  • Compilação Just-In-Time (slide 32 de ave-01-CLI.pdf)
  • Modelos unmanaged vs.managed
    • Cenário 1: usando bibliotecas de ligação estáticas (lib) em C++
    • Cenário 2: usando bibliotecas de ligação dinâmica (dll) em C++
    • Cenário 3: modelo managed em C#
    • Discussão dos problemas de compatibilidade binária existente nos Cenários 1 e 2
  • Introdução ao estudo do Common Type System (CTS)
    • Distinção entre tipos valor vs, tipos referência e valor vs. instância
  • T.P.C. - Resolver exercícios 1 a 4 no Wiki Exercícios

Leitura:

Semana 3 - Aula 7 - 4/Mar/2019

  • Aula Prática - Laboratório LS 1
    • Exercícios #1 a #3 do T.P.C.

Semana 3 - Aula 8 e 9 - 8/Mar/2019

  • Continuação do estudo do Common Type System (CTS)
    • manipulação de tipos referência e tipos valor
    • Layout de um objecto, detalhe do cabeçalho e estrutura com informação do tipo (RTTI - Runtime Type Information) - ver slides 10 e 11 de sessao_-_CTS1.pdf
  • Object::GetType e System.Type
  • Propriedades parameter less, automáticas (C# 3.0) e indexers (parameter full); análise do CIL gerado
  • Reflection Object Model
  • Type::GetMembers, MemberInfo e BindingFlags
  • PropertyInfo, FieldInfo, MethodInfo e ConstructorInfo
  • T.P.C. - Resolver exercício 5 no Wiki Exercícios

Leitura:

  • Essential .NET: Sec. 4.1 Programming with Type, 4.2 Programming Metadata, 4.3 Special Methods, 4.4 Metadata Extensibility

Semana 4 - Aula 10 - 11/Mar/2019

  • Continuação do estudo do Common Type System (CTS)
    • Type::GetMembers, MemberInfo e BindingFlags
    • PropertyInfo, FieldInfo, MethodInfo e ConstructorInfo
    • Definição informal de evento e delegate; tipo EventInfo
    • Object::GetType, typeof, System.Type e RuntimeTypeHandle
    • Métodos IsSubclassOf e IsAssignableFrom
    • Classe Activator
    • Exercícios
    • T.P.C. - Resolver exercício 6 no Wiki Exercícios

Leitura:

  • Essential .NET: Sec. 4.1 Programming with Type, 4.2 Programming Metadata, 4.3 Special Methods
  • CLR Via C#, Ch. 23 - Assembly Loading

Semana 4 - Aula 11 e 12 - 15/Mar/2019

  • Aula Prática para apoio ao Primeiro Trabalho

Semana 5 - Aula 13 - 18/Mar/2019

  • API de Reflexão
    • Custom Attributes;
    • Papel dos custom attributes como forma de expressão de intenções
    • Definição de novos atributos:
      • Parâmetros de atributos com e sem nome
      • Persistência dos custom attributes na metadata
    • AttributeUsageAttribute => restrição sobre o target e AllowMultiple
    • Comparação entre custom attibutes e anotações Java
    • Inspeção de custom attributes em tempo de execução
    • IsDefined(), GetCustomAttribute() e GetCustomAttributes()
  • Resolução do exercício 7 no Wiki Exercícios

Leitura:

  • Essential .NET: Sec. 4.1 Programming with Type, 4.2 Programming Metadata, 4.3 Special Methods, 4.4 Metadata Extensibility

Semana 5 - Aula 14 e 15 - 22/Mar/2019

  • Aula Prática - Apoio ao Primeiro Trabalho

Semana 6 - Aula 16 - 25/Mar/2019

  • Conclusão do estudo sobre Custom Attributes

Semana 6 - Aula 17 e 18 - 29/Mar/2019

  • Aula Prática - Apoio ao Primeiro Trabalho

Semana 7 - Aula 19 - 1/Abr/2019

  • Coerção de tipos dinâmica, down-casting e side-casting
  • Operadores is e as
  • Operadores isinst e castclass
  • Geração de código intermédio (em tempo de execução ou não); motivação
  • T.P.C. - Resolver exercício 8 no Wiki Exercícios

Leitura:

  • Essential .NET: Sec. 4.1 Programming with Type
  • MSDN (System.Reflection.Emit)

Semana 7 - Aula 20 e 21 - 5/Abr/2019

  • Geração de código intermédio (em tempo de execução ou não); motivação; Modelo de objectos de System.Reflection.Emit: AssemblyBuilder, ModuleBuilder, TypeBuilder, MethodBuidler e ILGenerator
    • Exercício: Gerar em IL uma classe contendo o método Main que imprime "Hello World!"
  • Geração de código intermédio usando o namespace System.Reflection.Emit
  • Implementação de um logger usando emissão de código IL
  • initobj e newobj
  • box e unbox (introdução)

Leitura:

  • MSDN (System.Reflection.Emit)
  • Essential .NET: Secs. 3.1 Type Fundamentals, 5.1 Objects and Values, 5.2 Vars, Args and Fields, 5.4 Boxing

Semana 8 - Aula 22 - 8/Abr/2019

  • Aula Prática - Apoio ao Segundo Trabalho

Semana 8 - Aula 23 e 24 - 12/Abr/2019

  • Aula Prática - Apoio ao Segundo Trabalho

Semana 9 - Aula 25 - 15/Abr/2019

  • Aula Prática - Apoio ao Segundo Trabalho

Semana 10 - Aula 26 e 27 - 26/Abr/2019

  • Carregamento dinâmico de assemblies
    • Métodos Assembly::LoadFrom e Assembly::Load; probing; Global Assembly Cache; método GetTypes
  • Campos readonly e const
  • Passagem de parâmetros por referência ref e out
    • Exemplo de método que realiza a troca de duas strings
    • Detalhe das operações ldind.ref e stind.ref
  • Métodos com número variável de parâmetros (keyword params)
  • box e unbox
    • Exemplo com tipo valor implementando métodos de instância
    • Inexistência de compatibilidade binária entre dois tipos valor definidos pelo utilizador (struct)

Leitura:

  • CLR Via C#, Ch. 23 - Assembly Loading
  • Best Practices for Assembly Loading
  • Essential .NET: Secs. 3.1 Type Fundamentals, 5.1 Objects and Values, 5.2 Vars, Args and Fields, 5.4 Boxing

Semana 11 - Aula 28 - 29/Abr/2019

  • box e unbox
    • Exemplo
    • Detalhe das operações box e unbox.any
    • Exemplo de como afetar versão boxed localizada no heap usando método de interface
  • Equals vs ReferenceEquals
    • Análise de diferentes formas de implementar o método Equals e seus problemas na presença de classes derivadas.
  • T.P.C. - Resolver exercício 9 no Wiki Exercícios

Leitura:

  • Essential .NET: Secs. 3.1 Type Fundamentals, 5.1 Objects and Values, 5.2 Vars, Args and Fields, 5.3 Equivalence vs Identity, 5.4 Boxing

Semana 11 - Aula 29 e 30 - 3/Mai/2019

  • Equals vs ReferenceEquals

    • Exemplo: Análise de diferentes formas de implementar o método Equals e seus problemas na presença de classes derivadas.
  • Implementação de igualdade em objetos e valores

    • Método Equals em System.ValueType
    • Cuidados a ter na redefinição do método Equals
  • Cuidados a ter na redefinição do método GetHashCode

  • Compilação JIT, tabela de métodos e stubs

    • Tabela de métodos e CORINFO_CLASS_STRUCT
    • Tipo System.Object - métodos de instância virtuais (ToString, Equals, GetHashCode e Finalize) e não virtuais (GetType)
    • Evidenciar o this como o 1.º argumento passado a um método de instância
    • Instruções call (despacho estático) e callvirt (despacho dinâmico);
      • situações em que compilador gera call na chamada a métodos de instância não virtuais
    • Análise da execução realizada num despacho dinâmico vs. despacho estático

Leitura:

Semana 12 - Aula 31 - 6/Mai/2019

  • Instruções call (despacho estático) e callvirt (despacho dinâmico); exemplos
  • Demonstração da chamada a um método da base virtual com a instrução callvirt, resultando num ciclo infinito
  • Demonstração da verificação feita por callvirt
  • Detalhe do código assembly gerado para despacho estático (endereço do método) e despacho dinâmico (baseado em offset do método)
  • Atributos de métodos: virtual, new e override

Leitura:

  • Compilação JIT, tabela de métodos e stubs - D. Box Sec. 6.1 JIT Compilation
  • Despacho estático vs Dinâmico (call e callvirt) - D. Box Sec. 6.2 Method Invocation

Semana 12 - Aula 32 e 33 - 10/Mai/2019

  • Atributos de métodos: virtual, new e override
  • Exemplos do resultado do layout da tabela de métodos com a utilização dos atributos anteriores
  • Estudo de casos de redefinição (override) ou "esconder" (new) de métodos => efeitos no layout da tabela de métodos e resultado na chamada a esses métodos.
    • análise de um exemplo em C#
  • Interfaces
  • Explicit Interface Method Implementation (EIMI)
    • Exemplos
  • Introdução ao delegates
    • Delegates em C#
  • Associação de métodos a delegates
    • Métodos estáticos e de instância
  • lambda functions
    • exemplo

Exercícios

  • Resolver Exercício 12 (ver Wiki)

Leitura:

  • Compilação JIT, tabela de métodos e stubs - D. Box Sec. 6.1 JIT Compilation
  • Despacho estático vs Dinâmico (call e callvirt (validação do target)) - D. Box Sec. 6.2 Method Invocation
  • Jeffrey Richter's "CLR via C# 4th edition", Cap. 13 Interfaces
  • Jeffrey Richter's "CLR via C# 4th edition", Cap. 17 Delegates

Semana 13 - Aula 34 - 13/Mai/2019

  • Continuação do estudo dos delegates
    • Delegates anónimos e lambda functions
    • Delegates genéricos: Action, Func, Predicate e Converter; exemplos.
  • Interfaces IEnumerable<T> e IEnumerator<T>; Tradução para IL do código foreach sobre um enumerável
  • Interface IDisposable;
  • Primitiva using;
  • Iteradores eager e lazy; keyword yield

Leitura:

Semana 13 - Aula 35 e 36 - 17/Mai/2019

  • Aula de laboratório para esclarecimento de dúvidas do 3.º Trabalho

Semana 14 - Aula 37 - 20/Mai/2019

  • Implementação das interfaces IEnumerable<T> e IEnumerator<T>;
  • Iteradores eager e lazy; keyword yield; aspetos de implementação de iteradores que usam construção yield
  • Delegates anónimos e lambda functions e captura de contexto
    • análise do código gerado quando se usa um delegate anónimo dentro dum método estático

Leitura:

  • Jeffrey Richter's "CLR via C# 4th edition", Cap. 17 Delegates
  • Jeffrey Richter's "CLR via C# 4th edition", Cap. 12 Generics

Semana 14 - Aula 38 e 39 - 24/Mai/2019

  • Aula de laboratório para esclarecimento de dúvidas do 3.º Trabalho

Semana 15 - Aula 40 - 27/Mai/2019

  • Classes Delegate e MulticastDelegate; método object DynamicInvoke(params object[] args)
  • Continuação do estudo dos delegates
    • Delegates anónimos e lambda functions
      • análise do código gerado quando se usa um delegate anónimo dentro dum método estático
      • análise do código gerado quando se usa um delegate anónimo dentro de métodos estáticos e de instância; captura de contexto
    • Co-variância e contra-variância de delegates
  • Introdução ao estudo dos Genéricos
    • tipos e métodos genéricos
    • constrangimentos usando cláusula where

Exercícios

  • Resolver Exercício 13 e 14 (ver Wiki)

Leitura:

  • Jeffrey Richter's "CLR via C# 4th edition", Cap. 17 Delegates
  • Jeffrey Richter's "CLR via C# 4th edition", Cap. 12 Generics

Semana 15 - Aula 41 e 42 - 31/Mai/2019

  • Continuação do estudo dos Genéricos

    • tipos e métodos genéricos
    • constrangimentos usando cláusula where
    • Open e closed types
    • Tipos e métodos genéricos
    • Delegates genéricos
    • Constrangimentos usando cláusula where
    • Exercícios com genéricos: PrintValuesUnder10, PrintValuesUnderLimit; exercícios com delegates genéricos (TOut Converter<TIn, TOut>(TIn i, TOut, o), void Predicate<T>(T t))
  • Segunda parte da aula: Aula de laboratório para esclarecimento de dúvidas do 3.º Trabalho

Leitura:

Semana 16 - Aula 43 - 3/Jun/2019

  • Conclusão dos exercícios da aula anterior
  • Continuação do estudo dos Genéricos
    • Implementação de genéricos na CIL
    • Tipos anuláveis (nullable value types); exemplos
    • Comparação de implementação de genéricos C# vs. Genéricos Java vs. templates C++

Leitura:

  • Jeffrey Richter's "CLR via C# 4th edition", Cap. 12 Generics

Semana 16 - Aula 42 e 43 - 6/Jun/2019

  • Métodos de extensão. Tipos anónimos. Tipificação implícita de variáveis locais (keyword var). Expressões de interrogação usando LINQ (Language Integrated Query) e sua representação usando métodos de extensão.

  • Criação e invocação de delegates em IL

  • T.P.C.: Resolução do Exercício #13

  • Introdução ao estudo do Garbage Collector; o Heap; organização em gerações; root references; Finalização de objetos; Finalização implícita (método Finalize)

    • Aspetos de desempenho de Finalize; Finalização explícita (método Dispose); Padrão disposable; método GC.SuppressFinalize
    • Interface IDisposable; libertação de recursos nativos (unmanaged), como file handles e BD handles usando IDisposable.Dispose(), e libertação de recursos managed, como memória dos objetos pelo Garbage Collector
    • Primitiva using;

Leitura: