Tamanho de um tipo pode ser diferente
Pode depender da
- Implementação da linguagem no compilador
- Arquitetura do computador alvo
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.
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));
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
É 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
Mais popular em linguagens mais recentes
- Java, C#, standard Pascal, Ada
Exemplo com tipos incompatíveis em Ada
compatibilidade.adb
comgnat make
Vejamos se Pascal tem compatibilidade de tipos por nome
exemplo2.pas
comfpc
É 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
comp-estrutura1.c
\pause Na linguagem C
typedef
só define um nome, um sinônimo
Definem novos tipos
enum
struct
union
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;
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;
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