# Sistema de Tipos

O sistema de tipos de uma linguagem de programação é um **sistema lógico formal**, com um **conjunto de regras semânticas**, que por associação de uma propriedade (tipo) a entidades da linguagem (expressões, variáveis, métodos, etc.) permite a detecção de uma classe importante de erros semânticos: erros de tipos.

A verificação de erros de tipo, é aplicável nas seguintes operações:

* Atribuição de valor: *v = e*.
* Aplicação de operadores: *e1 + e2* (por exemplo).
* Invocação de funções: *f(a)*.
* Utilização de classes/estruturas: *o.m(a)* ou *data.field*.

Outras operações, como por exemplo a utilização arrays, podem também envolver verificações de tipo. No entanto, **podemos considerar que as operações sobre arrays são atribuições de valor e aplicação de métodos especiais**.

Diz-se que qualquer uma destas **operações é válida quando existe conformidade** entre as propriedades de tipo das entidades envolvidas.

A conformidade indica se um tipo *T1* pode ser usado onde se espera um tipo *T2* . É o que acontece quando *T1=T2*.

* Atribuição de valor (*v = e*).&#x20;
  * O tipo de *e* tem de ser conforme com o tipo de *v*.
* Aplicação de operadores (*e1 + e2*).
  * Existe um operador + aplicável aos tipos de *e1 e e2*.
* Invocação de funções (*f(a)*).
  * Existe uma função global *f* que aceita argumentos a conformes com os argumentos formais declarados dessa função.
* Utilização de classes/estruturas (*o.m(a)* ou *data.field*).
  * Existe um método *m* na classe correspondente ao objecto *o*, que aceita argumentos *a* con- formes com os argumentos formais declarados desse método; e existe um campo *field* na estrutura/classe de data.
