22
Linguagens de Programacão I [email protected] 1 Tipos Tipos Linguagens de Programacão I [email protected] 2 O Conceito de Tipo O Conceito de Tipo LPs geralmente permitem a organização de dados LPs geralmente permitem a organização de dados em diferentes categorias através do conceito de tipo. em diferentes categorias através do conceito de tipo. Um tipo é definido a partir de um conjunto de valores Um tipo é definido a partir de um conjunto de valores e de operações ao qual está associado. e de operações ao qual está associado. O sistema de tipos de uma LP usualmente inclui O sistema de tipos de uma LP usualmente inclui um conjunto básico de tipos; um conjunto básico de tipos; mecanismos para a associação entre tipos e construções mecanismos para a associação entre tipos e construções básicas da LP; básicas da LP; regras para a definição de novos tipos; regras para a definição de novos tipos; regras de compatibilidade e inferência. regras de compatibilidade e inferência.

O Conceito de Tipo - Departamento de Informática – PUC-Rioinf1621/tipo.pdf · limites de um array dinamicamente (Java, ... Em LPs com mecanismos de ponteiros a alocação e

Embed Size (px)

Citation preview

1

Linguagens de Programacão [email protected] 1

Tipos Tipos

Linguagens de Programacão [email protected] 2

O Conceito de TipoO Conceito de TipoLPs geralmente permitem a organização de dados LPs geralmente permitem a organização de dados em diferentes categorias através do conceito de tipo.em diferentes categorias através do conceito de tipo.

Um tipo é definido a partir de um conjunto de valores Um tipo é definido a partir de um conjunto de valores e de operações ao qual está associado.e de operações ao qual está associado.

O sistema de tipos de uma LP usualmente incluiO sistema de tipos de uma LP usualmente incluium conjunto básico de tipos;um conjunto básico de tipos;

mecanismos para a associação entre tipos e construções mecanismos para a associação entre tipos e construções básicas da LP; básicas da LP;

regras para a definição de novos tipos;regras para a definição de novos tipos;

regras de compatibilidade e inferência.regras de compatibilidade e inferência.

2

Linguagens de Programacão [email protected] 3

O Conceito de TipoO Conceito de TipoO tipo fornece um contexto implícito para a execução O tipo fornece um contexto implícito para a execução de operações, e facilita a definição de regras de operações, e facilita a definição de regras semânticas:semânticas:

PodePode--se checar em tempo de compilação a utilização se checar em tempo de compilação a utilização correta de variáveis.correta de variáveis.

A resolução de operações sobrecarregadas também pode A resolução de operações sobrecarregadas também pode ser feita em tempo de compilação.ser feita em tempo de compilação.

TornaTorna--se mais fácil entender a estrutura do programa.se mais fácil entender a estrutura do programa.

A forma como a representação de um tipo de dado é A forma como a representação de um tipo de dado é implementada tornaimplementada torna--se transparente, podendo se transparente, podendo inclusive ser modificada sem afetar o funcionamento inclusive ser modificada sem afetar o funcionamento do programa.do programa.

Linguagens de Programacão [email protected] 4

Definição de TiposDefinição de Tipos

A atribuição de um tipo a uma variável usualmente é feito A atribuição de um tipo a uma variável usualmente é feito através de uma declaração. através de uma declaração.

Entretanto em algumas LPs uma variável pode ser utilizada Entretanto em algumas LPs uma variável pode ser utilizada sem ser declarada (Fortran, Basic, Lua, Lisp, etc).sem ser declarada (Fortran, Basic, Lua, Lisp, etc).

Em Fortran, se uma variável não é declarada, o compilador Em Fortran, se uma variável não é declarada, o compilador assume que a variável é local. Se o nome da variável começar comassume que a variável é local. Se o nome da variável começar comI..N o compilador assume que o seu tipo é inteiro, ou real caso I..N o compilador assume que o seu tipo é inteiro, ou real caso contrário. contrário.

Em Lua o tipo da variável é determinado implicitamente pelo tipoEm Lua o tipo da variável é determinado implicitamente pelo tipodo dado que lhe é atribuído: do dado que lhe é atribuído: x = 5 x = 5 ---- x tem o tipo ‘number’ x tem o tipo ‘number’ x ={1, 2, 3} x ={1, 2, 3} ---- x tem o tipo ‘table’x tem o tipo ‘table’

3

Linguagens de Programacão [email protected] 5

Definição de TiposDefinição de Tipos

A verificação de tipos pode ser feita durante a A verificação de tipos pode ser feita durante a compilação (verificação estática) ou em tempo de compilação (verificação estática) ou em tempo de execução (verificação dinâmica).execução (verificação dinâmica).

Exemplos de LPs com verificação dinâmica são Lua, Exemplos de LPs com verificação dinâmica são Lua, Scheme, Smalltalk, Perl, etc.Scheme, Smalltalk, Perl, etc.

Em LPs orientadas a objetos sempre é necessário Em LPs orientadas a objetos sempre é necessário algum tipo de verificação dinâmica.algum tipo de verificação dinâmica.

Linguagens de Programacão [email protected] 6

Definição de TiposDefinição de Tipos

Toda LP possui um conjunto primitivo de tipos, que Toda LP possui um conjunto primitivo de tipos, que geralmente incluem:geralmente incluem:

Caracter (char)Caracter (char)StringsStringsInteirosInteirosReaisReaisBoleanosBoleanos

Além disso muitas LPs permitem que o usuário Além disso muitas LPs permitem que o usuário defina novos tipos de dados através de declarações defina novos tipos de dados através de declarações específicas (específicas (typedeftypedef em C, em C, typetype em Pascal e Módula em Pascal e Módula 2, etc).2, etc).

4

Linguagens de Programacão [email protected] 7

Classificação de TiposClassificação de Tipos

Podemos classificar os tipos compostos Podemos classificar os tipos compostos disponíveis em LPs nas seguintes categorias:disponíveis em LPs nas seguintes categorias:

Produto cartesiano;Produto cartesiano;

Conjunto potência;Conjunto potência;

Domínios finitos;Domínios finitos;

União discriminada;União discriminada;

Sequências;Sequências;

Definição recursiva;Definição recursiva;

Linguagens de Programacão [email protected] 8

Produto CartesianoProduto Cartesiano

Um produto cartesiano de dois ou mais Um produto cartesiano de dois ou mais conjuntos é uma combinação de valores conjuntos é uma combinação de valores agregados (tuplas) retirados de cada um dos agregados (tuplas) retirados de cada um dos conjuntos de dados. Várias linguagens conjuntos de dados. Várias linguagens permitem tais construções, como as permitem tais construções, como as estruturas (estruturas (structuresstructures) de C ou Algol) de C ou Algol--68, ou 68, ou os registros (os registros (recordsrecords) em Ada ou Pascal.) em Ada ou Pascal.

5

Linguagens de Programacão [email protected] 9

RecordRecordAs declarações em Pascal e C abaixoAs declarações em Pascal e C abaixo

type typedef struct{ type typedef struct{ t = record int a;t = record int a;a:integer; char b; a:integer; char b; b:char; } t b:char; } t

end;end;

introduzem um tipo t, e fazem com que cada variável x declarada introduzem um tipo t, e fazem com que cada variável x declarada como sendo do tipo t tenha duas componentes, x.a e x.b, sendo o como sendo do tipo t tenha duas componentes, x.a e x.b, sendo o valor da primeira componente do tipo inteiro, e o valor da segunvalor da primeira componente do tipo inteiro, e o valor da segunda da componente do tipo char. A variável x é composta por x.a e x.b, componente do tipo char. A variável x é composta por x.a e x.b, que podem, em conjunto, assumir valores como (100,'a'), ou que podem, em conjunto, assumir valores como (100,'a'), ou (25,'?').(25,'?').

Linguagens de Programacão [email protected] 10

RecordRecord

A maioria das LPs permite a comparação e A maioria das LPs permite a comparação e atribuição direta entre records do mesmo atribuição direta entre records do mesmo tipo.tipo.

Algumas LPs oferecem um comando para a Algumas LPs oferecem um comando para a manipulação de records. Em Modula 3 por manipulação de records. Em Modula 3 por exemplo:exemplo:with e = carro.sistema.peça dowith e = carro.sistema.peça do

e.nome:= “pastilha”e.nome:= “pastilha”e.preco := 23;e.preco := 23;

endend

6

Linguagens de Programacão [email protected] 11

Conjunto PotênciaConjunto Potência

Permitem definir valores que pertencem Permitem definir valores que pertencem a um subconjunto de um tipo qualquer.a um subconjunto de um tipo qualquer.

Um exemplo é o Um exemplo é o set ofset of de Pascal:de Pascal:type type carroscarros = set of (= set of (fuscafusca,,golgol,escort,,escort,opalaopala););

type type digitosdigitos = set of 0..9;= set of 0..9;

Linguagens de Programacão [email protected] 12

Conjunto PotênciaConjunto PotênciaOperações típicas de conjunto potência são união, Operações típicas de conjunto potência são união, interseção e pertence.interseção e pertence.

Em Pascal temosEm Pascal temos::varvar A,B,C: A,B,C: digitosdigitos;;

beginbegin

A := [1, 2, 3, 4]; B := [3, 4, 5];A := [1, 2, 3, 4]; B := [3, 4, 5];

C:= A+B; C:= A+B; [1,2,3,4,5] [1,2,3,4,5]

C:= A*B; C:= A*B; [3,4,][3,4,]

C:= AC:= A--B; B; [1,2][1,2]

if 5 in C thenif 5 in C then

......

7

Linguagens de Programacão [email protected] 13

Domínios FinitoDomínios Finito

Permitem definir uma associação entre Permitem definir uma associação entre um conjunto finito (domínio) e valores um conjunto finito (domínio) e valores de um conjunto qualquer (contrade um conjunto qualquer (contra--domínio).domínio).

Como principal exemplo desta categoria Como principal exemplo desta categoria temos o array.temos o array.

Linguagens de Programacão [email protected] 14

ArraysArrays

Array é o tipo composto mais comum e mais Array é o tipo composto mais comum e mais importante em LPs.importante em LPs.

Poucas LPs permitem a comparação Poucas LPs permitem a comparação (Fortran, Ada) e atribuição direta entre arrays (Fortran, Ada) e atribuição direta entre arrays (Java).(Java).

Diversas LPs permitem a definição dos Diversas LPs permitem a definição dos limites de um array dinamicamente (Java, limites de um array dinamicamente (Java, Lua).Lua).

8

Linguagens de Programacão [email protected] 15

Array Array -- ExemplosExemplosCC\\C++C++

char digit[10];char digit[10];

Pascal e Modula 2Pascal e Modula 2var y: array[1..5] of integer;var y: array[1..5] of integer;

LuaLua

x ={1, 2, 3, 4}x ={1, 2, 3, 4}

PearlPearl@a = (1, 2, 3, 4)@a = (1, 2, 3, 4)

Linguagens de Programacão [email protected] 16

Arrays Arrays -- RepresentaçãoRepresentação

Um array geralmente é Um array geralmente é representado em memória representado em memória através de endereços através de endereços consecutivos.consecutivos.

Existem duas opções para Existem duas opções para representar arrays birepresentar arrays bi--dimensionais na memória: dimensionais na memória: usando posições contíguas para usando posições contíguas para as colunas ou para as linhas.as colunas ou para as linhas.

9

Linguagens de Programacão [email protected] 17

Arrays Arrays –– Acessando ElementosAcessando Elementos

Linguagens de Programacão [email protected] 18

EnumeraçãoEnumeração

Todos os valores possíveis de um tipo são Todos os valores possíveis de um tipo são explicitamente enumerados.explicitamente enumerados.

Exemplos:Exemplos:PascalPascal

type cor =(azul, vermelho, verde, amarelo)type cor =(azul, vermelho, verde, amarelo)

CC

enum cor {azul, vermelho, verde, amarelo} enum cor {azul, vermelho, verde, amarelo}

10

Linguagens de Programacão [email protected] 19

União DiscriminadaUnião DiscriminadaPermite a definição concomitante de mais de um tipo para uma Permite a definição concomitante de mais de um tipo para uma variável.variável.

É interessante em situações em que uma variável precisa É interessante em situações em que uma variável precisa assumir valores de mais de um tipo, ou para economia de assumir valores de mais de um tipo, ou para economia de memória.memória.

No exemplo em CNo exemplo em Cunion {union {short int offset;short int offset;long unsigned int absolute;long unsigned int absolute;}}

os campos são mutuamente exclusivos. Somente um pode os campos são mutuamente exclusivos. Somente um pode estar ativo em qualquer tempo.estar ativo em qualquer tempo.

Linguagens de Programacão [email protected] 20

União DiscriminadaUnião Discriminada

Exemplo Exemplo -- variant records variant records –– Pascal:Pascal:Type AddrType = (US, Canada, Generic) Type AddrType = (US, Canada, Generic)

AddressRecord = record AddressRecord = record Address: array[1..2] of string[20]; Address: array[1..2] of string[20]; City: string[20]; City: string[20]; Country: string[20]; Country: string[20]; case Kind: AddrType ofcase Kind: AddrType of

US: (State: string[2]; ZIP:string[10]);US: (State: string[2]; ZIP:string[10]);Canada: (Province: string[10]; ZIP:string[6]); Canada: (Province: string[10]; ZIP:string[6]); Generic: (Comment: String[16]); Generic: (Comment: String[16]);

end; {case} end; {case} end; {record}end; {record}

11

Linguagens de Programacão [email protected] 21

SequênciasSequênciasPermitem que os dados sejam representados através Permitem que os dados sejam representados através de listas. de listas.

Exemplos são cadeias de caracteres (Exemplos são cadeias de caracteres (stringsstrings), listas ), listas (Lisp, Prolog, Ada) e arquivos sequenciais (Pascal).(Lisp, Prolog, Ada) e arquivos sequenciais (Pascal).

Suportam operações como “primeiro”, “próximo”e Suportam operações como “primeiro”, “próximo”e “anterior”.“anterior”.

Em Scheme temos:Em Scheme temos:(car ‘(2 3 4)) (car ‘(2 3 4)) 22

(cdr (cdr ‘‘(2 3 4)) (2 3 4)) (3 4)(3 4)

Linguagens de Programacão [email protected] 22

Definições RecursivasDefinições RecursivasTipos em que os dados podem crescer de forma Tipos em que os dados podem crescer de forma arbitrária, através de referências a outras estruturas arbitrária, através de referências a outras estruturas do mesmo tipo.do mesmo tipo.

Exemplos seriam estruturas de dados clássicas Exemplos seriam estruturas de dados clássicas como listas e árvores.como listas e árvores.

Estes tipos geralmente são implementados através Estes tipos geralmente são implementados através de ponteiros:de ponteiros:typedef struct{typedef struct{

int val;int val;int_list* next;int_list* next;

} int_list;} int_list;

12

Linguagens de Programacão [email protected] 23

Modelo de Valor ouModelo de Valor oude Referênciade Referência

Em LPs como Samlltalk, Clu, ML e Lisp, variáveis contém Em LPs como Samlltalk, Clu, ML e Lisp, variáveis contém apenas referências para objetos. Uma operação de atribuição apenas referências para objetos. Uma operação de atribuição faz com que duas variáveis refiramfaz com que duas variáveis refiram--se ao mesmo objeto.se ao mesmo objeto.

Estas LPs adotam um modelo de variável por referência.Estas LPs adotam um modelo de variável por referência.

Em LPs como C, Pascal e Ada a operação de atribuição copia Em LPs como C, Pascal e Ada a operação de atribuição copia valores. Referência a objetos só são possíveis através da valores. Referência a objetos só são possíveis através da criação explícita de referências, usando o mecanismo de criação explícita de referências, usando o mecanismo de ponteiros.ponteiros.

Estas LPs adotam um modelo de variável por valor. Estas LPs adotam um modelo de variável por valor.

Linguagens de Programacão [email protected] 24

PonteirosPonteirosPonteiros permitem armazenar o lPonteiros permitem armazenar o l--value de uma variável.value de uma variável.

Para acessar os valores referenciados pelos ponteiros (rPara acessar os valores referenciados pelos ponteiros (r--value) value) são usados operadores especiais denominados operadores de são usados operadores especiais denominados operadores de indireção (dereferencing).indireção (dereferencing).

Em Pascal temos o Em Pascal temos o ^ (e o (e o -> para records):para records):my_pt^.val:= 5;my_pt^.val:= 5;

my_ptmy_pt-->val:= 5;>val:= 5;

Em CEm C\\C++ temos o C++ temos o *::

(*my_pt).val = 5;(*my_pt).val = 5;

formas equivalentesformas equivalentes

13

Linguagens de Programacão [email protected] 25

Exemplo Exemplo -- CC

1 2 100100 4000 5000

x y ip

1 1 100100 4000 5000

x y ip

100 1 100100 4000 5000

x y ip

3 2 100100 4000 5000

x y ip

int x=1, y=2;int *ip; ip = &x;

y = *ip;

x = ip;

*ip = 3;

memóriaprograma

Linguagens de Programacão [email protected] 26

PonteirosPonteirosEm LPs com mecanismos de ponteiros a alocação e Em LPs com mecanismos de ponteiros a alocação e desalocação de memória deve ser feita desalocação de memória deve ser feita explicitamente pelo programador.explicitamente pelo programador.

Em C++ isto é feito através das funções new e delete Em C++ isto é feito através das funções new e delete e em Pascal através de new e dispose:e em Pascal através de new e dispose:type pont=^integer;var pt:pont;

...new(pt);pt^:= 5...dispose(pt);

14

Linguagens de Programacão [email protected] 27

PonteirosPonteirosA alocação dinâmica de memória, com exceção de variáveis A alocação dinâmica de memória, com exceção de variáveis locais, sempre utiliza a heap.locais, sempre utiliza a heap.

Dois problemas são derivados da alocação e da desalocação Dois problemas são derivados da alocação e da desalocação explicitas de espaço: a criação de lixo e de referências explicitas de espaço: a criação de lixo e de referências pendentes ou ocas.pendentes ou ocas.

Por lixo, entendePor lixo, entende--se uma área que não está mais em uso, mas se uma área que não está mais em uso, mas que não foi devolvida à lista de espaço vazio, porque não foi que não foi devolvida à lista de espaço vazio, porque não foi feita a operação de liberação correspondente.feita a operação de liberação correspondente.

Referências pendentes são referências a uma área que já foi Referências pendentes são referências a uma área que já foi desalocada, e que portanto, ou está marcada como espaço livre desalocada, e que portanto, ou está marcada como espaço livre e não deve ser utilizada, ou já foi realocada e tem uma e não deve ser utilizada, ou já foi realocada e tem uma utilização diferente.utilização diferente.

Linguagens de Programacão [email protected] 28

PonteirosPonteiros

type pont=^integer;

var pt:pont;

var x: integer;

...

new(pt);

pt^:= 5

...dispose(pt);

x:= pt^;

15

Linguagens de Programacão [email protected] 29

Ponteiros e Arrays em CPonteiros e Arrays em C

int main ()

{

int numbers[5];

int * p;

p = numbers; *p = 10;

p++; *p = 20;

p = &numbers[2]; *p = 30;

p = numbers + 3; *p = 40;

p = numbers; *(p+4) = 50;

for (int n=0; n<5; n++)

cout << numbers[n] << ", ";

return 0;

}

10 20 5030 40numbers

Linguagens de Programacão [email protected] 30

Ponteiros X ReferênciasPonteiros X Referências

Uma referência equivale a uma constante ponteiro Uma referência equivale a uma constante ponteiro (após ser criado, o seu valor não pode mais mudar).(após ser criado, o seu valor não pode mais mudar).

Em referências a indireção é automática, não há Em referências a indireção é automática, não há necessidade de utilização de operadores especiais.necessidade de utilização de operadores especiais.

ExemploExemplointint b;b;intint& a = b; & a = b; referênciareferênciaa = 10;a = 10;

intint b;b;intint *a = &b; *a = &b; ponteiroponteiro*a = 10;*a = 10;

16

Linguagens de Programacão [email protected] 31

Gerenciamento de MemóriaGerenciamento de MemóriaEm algumas LPs (Java, Lua, C#) o programador pode criar Em algumas LPs (Java, Lua, C#) o programador pode criar novos objetos dinamicamente, sem a necessidade de controlar novos objetos dinamicamente, sem a necessidade de controlar explicitamente o gerenciamento da memória.explicitamente o gerenciamento da memória.

Em LPs com gerenciamento automático de memória o sistema Em LPs com gerenciamento automático de memória o sistema deve ser capaz de identificar os objetos que não podem ser deve ser capaz de identificar os objetos que não podem ser mais acessados pelo programa (lixo), desalocando o espaço de mais acessados pelo programa (lixo), desalocando o espaço de memória correspondente.memória correspondente.

Este processo de desalocação automática de memória é Este processo de desalocação automática de memória é conhecido como coleta de lixo (garbage collection).conhecido como coleta de lixo (garbage collection).

As duas principais técnicas utilizadas para implementar a coletaAs duas principais técnicas utilizadas para implementar a coletade lixo são a contagem de referências (reference count) e de lixo são a contagem de referências (reference count) e marcar e varrer (markmarcar e varrer (mark--andand--sweep). sweep).

Linguagens de Programacão [email protected] 32

Reference CountReference CountCada objeto guarda o número de referências que Cada objeto guarda o número de referências que apontam para ele.apontam para ele.

Sempre que uma nova referência para um objeto é Sempre que uma nova referência para um objeto é criada ou destruída, o número de referências criada ou destruída, o número de referências correspondente é modificado.correspondente é modificado.

Quando o número de referências atinge zero, a Quando o número de referências atinge zero, a memória utilizada pelo objeto pode ser desalocada memória utilizada pelo objeto pode ser desalocada pelo sistema.pelo sistema.

Um problema importante desta técnica são as Um problema importante desta técnica são as referências circulares. referências circulares.

17

Linguagens de Programacão [email protected] 33

Reference CountReference Count

Linguagens de Programacão [email protected] 34

MarkMark--andand--SweepSweep

A técnica de markA técnica de mark--andand--sweep segue um sweep segue um algoritmo simples:algoritmo simples:1.1. Percorrer toda a memória heap e marcar todos Percorrer toda a memória heap e marcar todos

os objetos como “livres”.os objetos como “livres”.

2.2. Percorrer de forma recursiva todas as referências Percorrer de forma recursiva todas as referências contidas em variáveis fora da heap, e marcar contidas em variáveis fora da heap, e marcar todos os objetos encontrados como “nãotodos os objetos encontrados como “não--livres”.livres”.

3.3. Percorrer novamente a memória heap e Percorrer novamente a memória heap e desalocar todos os objetos que ainda estiverem desalocar todos os objetos que ainda estiverem marcados “livres”.marcados “livres”.

18

Linguagens de Programacão [email protected] 35

MarkMark--andand--SweepSweep

Linguagens de Programacão [email protected] 36

Equivalência Entre TiposEquivalência Entre Tipos

DizDiz--se que uma LP é se que uma LP é fortemente tipadafortemente tipada, se é possível, apenas , se é possível, apenas por análise por análise estática estática do programa (análise realizada em tempo do programa (análise realizada em tempo de compilação), determinar que a estrutura de tipos da de compilação), determinar que a estrutura de tipos da linguagem não é violada.linguagem não é violada.

A princípio se uma operação é definida com um parâmetro do A princípio se uma operação é definida com um parâmetro do tipo T, qualquer invocação legal desta função deveria incluir tipo T, qualquer invocação legal desta função deveria incluir sempre um parâmetro do tipo T.sempre um parâmetro do tipo T.

Na maioria das LPs entretanto as regras de tipos apresentam Na maioria das LPs entretanto as regras de tipos apresentam alguma flexibilidade, permitindo a conversão entre valores de alguma flexibilidade, permitindo a conversão entre valores de tipos distintos.tipos distintos.

19

Linguagens de Programacão [email protected] 37

Equivalência Entre TiposEquivalência Entre Tipos

Exemplo:Exemplo:type aluno = recordtype aluno = recordnome, endereco: stringnome, endereco: stringidade: integeridade: integer

endendtype aluno = recordtype aluno = recordnome, endereco: stringnome, endereco: stringidade: integeridade: integer

endend......x: estudante;x: estudante;y: aluno;y: aluno;beginbegin......x = y; x = y; Erro??Erro??

Linguagens de Programacão [email protected] 38

Equivalência Entre TiposEquivalência Entre Tipos

Em algumas LPs a compatibilidade entre tipos é Em algumas LPs a compatibilidade entre tipos é determinada pela estrutura do tipo (C, com exceção determinada pela estrutura do tipo (C, com exceção de de strutstruts), enquanto em outras a compatibilidade é s), enquanto em outras a compatibilidade é determinada pelo nome (Pascal, Ada).determinada pelo nome (Pascal, Ada).type complex is struct {type complex is struct {

float a,b;float a,b;}}

type point is struct {type point is struct {float a,b;float a,b;

}}

20

Linguagens de Programacão [email protected] 39

Conversão Implícita (Coerção)Conversão Implícita (Coerção)

Se dados do tipo T1, do ponto de vista abstrato, Se dados do tipo T1, do ponto de vista abstrato, podem conter valores do tipo T2, embora através de podem conter valores do tipo T2, embora através de representações distintas, a LP pode fazer a representações distintas, a LP pode fazer a conversão automática entre estes tipos.conversão automática entre estes tipos.

Exemplo:Exemplo:x: real;x: real;i: integer;i: integer;x = i; x = i; ---- coerção de inteiro para realcoerção de inteiro para realprint(“resultado:”+x) print(“resultado:”+x) ---- coerção de real para stringcoerção de real para string

Linguagens de Programacão [email protected] 40

Conversão Explícita (Typecast)Conversão Explícita (Typecast)

Em algumas situações pode ser necessário que um Em algumas situações pode ser necessário que um valor do tipo T1 seja entendido como se fosse do tipo valor do tipo T1 seja entendido como se fosse do tipo T2.T2.

Algumas LPs (Java, C, Eiffel) permitem esta Algumas LPs (Java, C, Eiffel) permitem esta conversão através do mecanismo de conversão através do mecanismo de typecasttypecast..float x;float x;int z;int z;z = z+(int)x;z = z+(int)x;

21

Linguagens de Programacão [email protected] 41

Conversão ForçadaConversão Forçada

Quando há várias maneiras de converter um valor de Quando há várias maneiras de converter um valor de um tipo T1 para o tipo T2, é necessário indicar a um tipo T1 para o tipo T2, é necessário indicar a forma de conversão desejada, e, em geral, isso é forma de conversão desejada, e, em geral, isso é feito através de uma função de conversão.feito através de uma função de conversão.

Um exemplo seria a conversão de reais em inteiros, Um exemplo seria a conversão de reais em inteiros, que pode ser feita por arredondamento, truncamento, que pode ser feita por arredondamento, truncamento, etc, ou a conversão de strings para inteiros.etc, ou a conversão de strings para inteiros.

Normalmente a LP disponibiliza funções préNormalmente a LP disponibiliza funções pré--definidas para as situações mais comuns.definidas para as situações mais comuns.

Linguagens de Programacão [email protected] 42

Tipos Abstratos de DadosTipos Abstratos de Dados

A facilidade de definir novos tipos permite ao programador A facilidade de definir novos tipos permite ao programador estruturar os dados conforme as características da sua estruturar os dados conforme as características da sua aplicação.aplicação.

Entretanto estes mecanismos não permitem especificar Entretanto estes mecanismos não permitem especificar totalmente quais são as operações válidas sobre estes tipos, e totalmente quais são as operações válidas sobre estes tipos, e nem ocultar a sua estrutura.nem ocultar a sua estrutura.

Em LPs com tipos abstratos de dados a representação e as Em LPs com tipos abstratos de dados a representação e as operações associadas ao tipo são definidas através de uma operações associadas ao tipo são definidas através de uma única estrutura (encapsulamento), e a representação dos dados única estrutura (encapsulamento), e a representação dos dados muitas vezes é transparente para os usuários. muitas vezes é transparente para os usuários.

22

Linguagens de Programacão [email protected] 43

Tipos Abstratos de DadosTipos Abstratos de Dados

Exemplos clássicos de tipos abstratos são Exemplos clássicos de tipos abstratos são classes em Java, C++, C#, Eiffel e Smalltalk.classes em Java, C++, C#, Eiffel e Smalltalk.

O mecanismo de templates em C++ permite O mecanismo de templates em C++ permite a definição de tipos abstratos que utilizam a definição de tipos abstratos que utilizam tipos genéricos como parâmetros.tipos genéricos como parâmetros.

Linguagens de Programacão [email protected] 44

Exemplo Exemplo -- TemplatesTemplates

template <class T>T GetMax (T a, T b) {

T result;result = (a>b)? a : b;return (result);

}

int main () {int i=5, j=6, k;long l=10, m=5, n;k=GetMax<int>(i,j);n=GetMax<long>(l,m);...

}