Skip to content

Latest commit

 

History

History
216 lines (165 loc) · 4.72 KB

compatibilidade.org

File metadata and controls

216 lines (165 loc) · 4.72 KB

Compatibilidade

1 Compatibilidade de Tipos (arquitetura)

Tamanho de um tipo pode ser diferente

Pode depender da

  • Implementação da linguagem no compilador
  • Arquitetura do computador alvo

1.1 Discurso do Bjarne Stroustrup (criador do C++)

\scriptsize

Pessoas que apregoam não se preocupar com portabilidade geralmente fazem isto porque usam um único sistema e sentem que podem se dar ao luxo de acreditar que “a linguagem é aquilo que meu compilador implementa”.

Esta é uma visão restrita e míope. Se seu programa é um sucesso, é muito provável que seja portado, de modo que alguém vai ter que procurar e corrigir problemas relacionados com características dependentes da implementação.

Além disto, freqüentemente é necessário compilar programas com outros compiladores para o mesmo sistema e mesmo uma versão futura de seu compilador favorito pode fazer algumas coisas de maneira diferente da atual.

2 Como saber o tamanho de um tipo?

Especificação da linguagem

Um operador que devolve os tamanhos

printf ("int = %d\n", sizeof(int));
printf ("long int = %d\n", sizeof(long int));
printf ("float = %d\n", sizeof(float));
printf ("double = %d\n", sizeof(double));

3 Situações em que um tipo de dado é esperado

Atribuições

int a = <inteiro>;       

Operações

a % b; //resto da divisão em inteiros

Funções

int foo (int, float);

\pause Compatibilidade: quando um tipo pode ser usado no lugar do outro

  • por nome, ou por estrutura

Quando ocorre, podemos usar tipos compatíveis

sem que o compilador ou a execução detecte erros de tipo

\pause Podem haver perdas.c

4 Compatibilidade por nome

É compatível por nome quando as variáveis tem

em suas declarações o mesmo nome de tipo

Vejamos este exemplo

type
    natural : 1..MAXINT;
var
    n1, n2 : natural;
    i : integer;
    n3 : natural;

Exemplo

  • n1, n2 e n3 são compatíveis
  • i não é com nenhuma delas

5 Verificando existência de compatibilidade por nome

Mais popular em linguagens mais recentes

  • Java, C#, standard Pascal, Ada

Exemplo com tipos incompatíveis em Ada

  • compatibilidade.adb com gnat make

Vejamos se Pascal tem compatibilidade de tipos por nome

  • exemplo2.pas com fpc

6 Compatibilidade por estrutura

É compatível quando os tipos possuem estrutura idêntica

Considere o mesmo exemplo

type
    natural : 1..MAXINT;
var
    n1, n2 : natural;
    i : integer;
    n3 : natural;

Exemplo

  • Todas as variáveis são compatíveis

Implementação mais difícil

  • Deve-se comparar as estruturas

7 Vejamos o caso de C: compatibilidade estrutural de tipos

comp-estrutura1.c

\pause Na linguagem C

  • typedef só define um nome, um sinônimo

Definem novos tipos

  • enum
  • struct
  • union

8 Compatibilidade por estrutura

Algol-68: propôs equivalência estrutural

mode p = struct(int x, ref p z) 
mode q = struct(int x, ref r z) 
mode r = struct(int x, ref q z)

Modula-3

TYPE Complex1 = RECORD re, im: REAL END; 
TYPE Complex2 = RECORD radius, angle: REAL END;

9 Discussão

Se a estrutura for a mesma, mas com um nome de campo

diferente, a compatibilidade deveria ser válida?

struct DataBrasil { int dia, mes, ano; };
struct DataEUA { int mes, dia, ano; };

\pause Uma possível solução proposta por Modula-3

TYPE Complex1 = BRANDED RECORD re, im: REAL END; 
TYPE Complex2 = BRANDED RECORD radius, angle: REAL END;

10 Forçar a incompatibilidade (por estrutura)

E se quisermos criar tipos efetivamente diferentes?

Ou seja, criar tipos derivados, que sejam incompatíveis.

type
    celsius : float;
    fahrenheit : float;

\pause Linguagens sem suporte

  • Pascal derivados.pas
  • C derivados.c

\pause Linguagens com suporte

  • Ada: derivados.adb
  • Haskell

\pause Subtipos (compatíveis)

  • Ada subtipos.adb