Você está na página 1de 5

Verificao de Tipo

Atividade que certifica que os operandos de um operador so de tipos compatveis. So considerados operadores e operandos:
operadores usuais (aritmticos, relacionais, etc) subprogramas (operadores) e parmetros (operandos) atribuio (operador) e variavel / expresso (operandos)

Verificao de tipo esttica


Feita antes da execuo Amarrao de tipo esttica permite quase sempre a verificao de tipo esttica Vantagem da deteco de erros em tempo de compilao: quanto antes e erro for encontrado, menor o custo. Desvantagem: reduo da flexibilidade para o programador Verificao de tipo deve ser dinmica quando a mesma posio de memria pode armazenar valores de tipos diferentes em momentos diferentes durante a execuo (record variante, union, equivalence).

Os tipos de operandos so compatveis com um operador se:


so aceitos pelo operador ou podem ser convertidos implicitamente pelo compilador (coero)

Erro de tipo: aplicao de um operador a um operando de tipo no apropriado.

Verificao de tipo dinmica


Feita durante a execuo do programa. Amarrao de tipo dinmica exige verificao de tipo dinmica. Amarrao de tipo dinmica o tipo da varivel definido durante a execuo, por um comando de atribuio Exemplo: APL
List <- 10.5 5.3 4.1 0.0 (list um array do tipo float) List <- 38 (list um inteiro escalar)

Unions
A verificao de tipo dinmica tambm deve ser feita quando a mesma posio de memria pode armazenar valores de tipos diferentes em momentos diferentes durante a execuo Ada e Pascal : record variante FORTRAN: EQUIVALENCE C, C++ : unions

Exemplo record variante (Pascal)


type shape = (circle, triangle, rectangle); colors = (red, green blue); figure = record filled: boolean; color: colors; case form : shape of circle: (diameter : real); triangle: (leftside : integer; rightside : integer; angle : real); rectangle : (side1 : integer; side2 : integer) end; var myfigure : figure;
rectangle circle

filled

collor form (discriminante)

triangle

Tipagem forte
Tanto na verificao de tipo esttica quanto na dinmica, alguns erros no podem ser encontrados. A capacidade da linguagem de sempre detectar erros est relacionada ao conceito de tipagem forte. Uma linguagem considerada fortemente tipada se erros de tipo podem sempre ser detectados. Isso exige que os tipos de todos os operandos possam ser determinados, em tempo de compilao ou de execuo. FORTRAN no fortemente tipada
no faz verificao de tipo entre parmetros formais e reais EQUIVALENCE permite acesso a mesma posio de memria por variveis de tipos diferentes

Pascal quase fortemente tipada


record variante permite omisso do tag que armazena o tipo corrente de uma varivel

Compatibilidade de tipo
C, C++ no so fortemente tipadas
estruturas do tipo union so checadas permitem uso de funes que no fazem verificao de tipo de parmetros

Linguagens podem usar diferentes regras para compatibilidade de tipo. Essas regras influenciam a deciso sobre quais tipos de dados e operaes sero includas na linguagem. Mtodos de compatibilidade de tipo: Compatibilidade de nome
Duas variveis tem o mesmo tipo se estiverem na mesma declarao ou em declarao com o mesmo nome de tipo

permitem vrias formas de converso automtica de tipo (coero)

Java fortemente tipada


permite converso explicita de tipo, que pode resultar em erro de tipo converso automtica restrita

Compatibilidade de estrutura
Duas variveis so compatveis se seus tipos tiverem a mesma estrutura

Compatibilidade de nome
Fcil de implementar Muito restritiva:
Tipo intervalo de inteiros no seria compatvel com inteiros
type indextype = 1 .. 100; var count : integer; index : indextype (count e index no seriam compatveis)

Compatibilidade de estrutura
Mais flexvel Difcil de implementar Outras questes:
Toda a estrutura deve ser comparada para verificar a compatibilidade Duas estruturas que tem a mesma estrutura com diferentes nomes para os campos, so compatveis?

Tipos estruturados passados como parmetros tem que ser declarados globalmente (primeiras verses do Pascal)

Equivalncia por declarao


As regras de compatibilidade das linguagens so muitoas vezes definidas combinando os dois mtodos. Compatibilidade por estrutura mais usada, exceto em algumas situaes especficas, como a equivalncia por declarao:
type type1 = array [1..10] of integer; type2 = type1;

C usa equivalncia estrutural para quase todos os tipos, exceto tipos estruturados (record, unions) Para os tipos estruturados usa equivalncia por declarao. C++ usa equivalncia de nome (typedef no define um novo tipo, apenas define um novo nome para um tipo existente). Linguagens OO (C++, JAVA) devem definir regras para implementar compatibilidade entre objetos e sua relao com o mecanismo de herana (discutido no item de POO)

Se um tipo definido com o nome de outro tipo, os dois so compatveis, mas no so compatveis por nome.

Subprogramas
Duas formas de abstrao so possveis em linguagens de programao: abstrao de processo e abstrao de dados. Abstrao de processos: aparece na forma de subprogramas, que permitem:
o reuso de cdigo economia de tempo e de memria. facilitar a leitura do programa (permite ver a estrutura lgica do programa, escondendo detalhes de codificao)

Caractersticas dos subprogramas estudados


Cada subprograma tem um nico ponto de entrada A unidade chamadora suspensa durante a execuo da unidade chamada existe um nico subprograma em execuo a cada momento O controle sempre retorna a unidade chamadora quando acaba a execuo da unidade chamada Outras formas de subprogramas:
corotinas unidades concorrentes

Mtodos de POO: semelhantes aos subprogramas Principais diferenas:


forma de chamada associao com classes e objetos

Semelhanas:
Passagem de parmetros Variveis locais