Skip to content

Latest commit

 

History

History
132 lines (101 loc) · 3.23 KB

coercao.org

File metadata and controls

132 lines (101 loc) · 3.23 KB

Conversão Implícita

1 Conversão

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

2 Coerção (conversão implícita)

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

3 Coerção por atribuição e por promoção

float f;
int i;
f = i;  //i é truncado para float
float f;
int i;
float r;
f = r/i; //i é promovido

4 Discussão: coerção e sobrecarga de operadores

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

5 Discussão: coerção e o tipo universal

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}

6 Relação entre coerção e tipo universal

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

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
        

7 Sumário de conversão implícita (coerção)

Coerção é um assunto controverso

  • Enfraquecem a segurança do sistema de tipos
  • Por outro lado, aumenta a flexibilidade da LP