-
Notifications
You must be signed in to change notification settings - Fork 0
Sumários
Sumários
-
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:
- 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
eTestPoint
; ferramentas de compilação; visualização da metadata usando a ferramentaildasm
- 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
eTestPoint.dll
)
Exercícios
- Resolver Exercícios 1 e 2 (ver Wiki)
Leitura:
- Ecma-335 - Ecma International
- Essential .NET: Cap. 4 (metadata)
- CLR via C#: Caps. 1 e 2
- 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
- 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
- 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
- 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:
- Essential .NET: Cap. 4 (metadata), sec. 4.1 Programming with Type
- CLR via C#: Caps. 1 e 2
- https://blogs.msdn.microsoft.com/ericlippert/2011/11/28/why-have-a-stack/
- Aula Prática - Laboratório LS 1
- Exercícios #1 a #3 do T.P.C.
- 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
eSystem.Type
- Propriedades parameter less, automáticas (C# 3.0) e indexers (parameter full); análise do CIL gerado
- Reflection Object Model
-
Type::GetMembers
,MemberInfo
eBindingFlags
-
PropertyInfo
,FieldInfo
,MethodInfo
eConstructorInfo
- 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
- Continuação do estudo do Common Type System (CTS)
-
Type::GetMembers
,MemberInfo
eBindingFlags
-
PropertyInfo
,FieldInfo
,MethodInfo
eConstructorInfo
- Definição informal de evento e delegate; tipo
EventInfo
-
Object::GetType
,typeof
,System.Type
eRuntimeTypeHandle
- Métodos
IsSubclassOf
eIsAssignableFrom
- 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
- Aula Prática para apoio ao Primeiro Trabalho
- 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 otarget
eAllowMultiple
- Comparação entre custom attibutes e anotações Java
- Inspeção de custom attributes em tempo de execução
-
IsDefined()
,GetCustomAttribute()
eGetCustomAttributes()
- 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
- Aula Prática - Apoio ao Primeiro Trabalho
- Conclusão do estudo sobre Custom Attributes
- Aula Prática - Apoio ao Primeiro Trabalho
- Coerção de tipos dinâmica, down-casting e side-casting
- Operadores
is
eas
- Operadores
isinst
ecastclass
- 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
)
- 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
eILGenerator
- Exercício: Gerar em IL uma classe contendo o método
Main
que imprime"Hello World!"
- Exercício: Gerar em IL uma classe contendo o método
- 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
enewobj
- 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
- Aula Prática - Apoio ao Segundo Trabalho
- Aula Prática - Apoio ao Segundo Trabalho
- Aula Prática - Apoio ao Segundo Trabalho
- Carregamento dinâmico de assemblies
- Métodos
Assembly::LoadFrom
eAssembly::Load
; probing; Global Assembly Cache; métodoGetTypes
- Métodos
- Campos
readonly
econst
- Passagem de parâmetros por referência
ref
eout
- Exemplo de método que realiza a troca de duas strings
- Detalhe das operações
ldind.ref
estind.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
-
box e unbox
- Exemplo
- Detalhe das operações
box
eunbox.any
- Exemplo de como afetar versão boxed localizada no heap usando método de interface
-
Equals
vsReferenceEquals
- Análise de diferentes formas de implementar o método
Equals
e seus problemas na presença de classes derivadas.
- Análise de diferentes formas de implementar o método
- 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
-
Equals
vsReferenceEquals
- Exemplo: Análise de diferentes formas de implementar o método
Equals
e seus problemas na presença de classes derivadas.
- Exemplo: Análise de diferentes formas de implementar o método
-
Implementação de igualdade em objetos e valores
- Método
Equals
emSystem.ValueType
- Cuidados a ter na redefinição do método
Equals
- Método
-
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
eFinalize
) 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) ecallvirt
(despacho dinâmico);- situações em que compilador gera
call
na chamada a métodos de instância não virtuais
- situações em que compilador gera
- Análise da execução realizada num despacho dinâmico vs. despacho estático
- Tabela de métodos e
Leitura:
- Essential .NET: Secs. 5.3 Equivalence vs Identity
- Ligações sobre os métodos
Equals
eGetHashCode
:- https://stackoverflow.com/questions/5443136/are-two-java-objects-with-same-hashcodes-not-necessarily-equal
- https://docs.oracle.com/javase/tutorial/java/IandI/objectclass.html
- https://stackoverflow.com/questions/7425142/what-is-hashcode-used-for-is-it-unique
- https://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-system-object-gethashcode
- https://stackoverflow.com/questions/9009760/implementing-gethashcode-correctly
- https://stackoverflow.com/questions/720177/default-implementation-for-object-gethashcode
- https://stackoverflow.com/questions/2975612/what-happens-when-hash-collision-happens-in-dictionary-key
- Compilação JIT, tabela de métodos e stubs - D. Box Sec. 6.1 JIT Compilation
- Instruções
call
(despacho estático) ecallvirt
(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
eoverride
Leitura:
- Compilação JIT, tabela de métodos e stubs - D. Box Sec. 6.1 JIT Compilation
- Despacho estático vs Dinâmico (
call
ecallvirt
) - D. Box Sec. 6.2 Method Invocation
- Atributos de métodos:
virtual
,new
eoverride
- 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
ecallvirt
(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
- Continuação do estudo dos delegates
- Delegates anónimos e lambda functions
-
Delegates genéricos:
Action
,Func
,Predicate
eConverter
; exemplos.
- Interfaces
IEnumerable<T>
eIEnumerator<T>
; Tradução para IL do códigoforeach
sobre um enumerável - Interface
IDisposable
; - Primitiva
using
; - Iteradores eager e lazy; keyword
yield
Leitura:
- Jeffrey Richter's "CLR via C# 4th edition", Cap. 17 Delegates
- Jeffrey Richter's "CLR via C# 4th edition", Cap. 12 Generics
- The reason why IEnumerator extends IDisposable
- Aula de laboratório para esclarecimento de dúvidas do 3.º Trabalho
- Implementação das interfaces
IEnumerable<T>
eIEnumerator<T>
; - Iteradores eager e lazy; keyword
yield
; aspetos de implementação de iteradores que usam construçãoyield
-
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
- Aula de laboratório para esclarecimento de dúvidas do 3.º Trabalho
- Classes
Delegate
eMulticastDelegate
; métodoobject 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
-
Delegates anónimos e lambda functions
- 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
-
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:
- Jeffrey Richter's "CLR via C# 4th edition", Cap. 12 Generics
- http://mattwarren.org/2017/05/08/Arrays-and-the-CLR-a-Very-Special-Relationship/
- https://stackoverflow.com/questions/5968708/why-array-implements-ilist#
- https://stackoverflow.com/questions/4482557/what-interfaces-do-all-arrays-implement-in-c
- 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
-
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étodoDispose
); Padrão disposable; métodoGC.SuppressFinalize
- Interface
IDisposable
; libertação de recursos nativos (unmanaged), como file handles e BD handles usandoIDisposable.Dispose()
, e libertação de recursos managed, como memória dos objetos pelo Garbage Collector - Primitiva
using
;
- Aspetos de desempenho de
Leitura:
- Jeffrey Richter's "CLR via C# 4th edition", Cap. 10 Properties
- MSDN
- SelectMany example
- Jeffrey Richter's "CLR via C# 4th edition", Secções 21.1 e 2 Managed Heap; Secção 21.3 Special Cleanup
- The reason why IEnumerator extends IDisposable