Para tipos não compatíveis → conversão
- Implícita ou explícita
\pause Implicitamente
- Com base em regras predefinidas na linguagem ou na implementação da linguagem (compilador)
- Chamada de Coerção
\pause Explicitamente
- Codificada pelo programador
- Usando funções de conversão ou Casting
Automaticamente converter um tipo para outro
Leva, em geral, a perda de informação
- Truncamento
- Arredondamento
\pause Necessita de mecanismos auxiliares
- Código para checagem semântica durante a execução
- Código para conversão de representações de baixo nível
\pause Exemplo Ada – coercao.adb
\pause Exemplo C – coercao.c
float f;
int i;
f = i; //i é truncado para float
float f;
int i;
float r;
f = r/i; //i é promovido
Não basta coerção, temos que ter sobrecarga também.
Efeitos similares.
Supondo a expressão “ a+b
”: soma inteiros e flutuantes
\pause Sem coerção
- a,b são inteiros
- a,b são flutuantes
\pause Com: tudo é convertido para flutuante
\pause Uma linguagem sem sobrecarga, e somente com soma entre flutuantes
- Sempre haveria conversão para flutuantes
- Mesmo com a e b sendo inteiros
- Custo computacional maior
Tipo universal pode se referir a qualquer tipo
Facilita a escrita de programas genéricos
Se apresenta sob várias formas
C/C++ | \texttt{void*} |
Clu | \texttt{any} |
Modula-2 | \texttt{address} |
Modula-3 | \texttt{refany} |
Java | \texttt{Object} |
C# | \texttt{object} |
Objective-C | \texttt{id} |
Em geral, evita-se utilizar com tipos primitivos
- Para qual tipo converter automaticamente?
- Vejamos se C tem coerção com tipos universais
- Exemplo
tipo_universal.c
- Exemplo
Mas em LPs no paradigma orientado a objeto
- Como garantir a validade de uma atribuição?
- Ou de um uso a um objeto de tipo universal?
\pause Checagem dinâmica de tipo universal
- Associar um descritor de tipo ao objeto
- Verificado durante a execução do programa
- \pause Exemplo em Objective-C:
exemplo3.m
gcc -I/usr/include/GNUstep/ \ exemplo3.m -lgnustep-base -lobjc \ -o exemplo3
Coerção é um assunto controverso
- Enfraquecem a segurança do sistema de tipos
- Por outro lado, aumenta a flexibilidade da LP