sexta-feira, 20 de março de 2009

Verificação de Tipos

(Por: Felipe Roberto Silva Ferreira e Thiago da Silva Resende)

Análise semântica é uma fase da compilação. Onde se verifica os erros semânticos existentes no código fonte e se obtém informações necessárias para a próxima fase da compilação. Uma das etapas da Análise semântica é a Verificação de Tipos, onde se assegura que operandos de um operador sejam de tipos compatíveis. Um tipo compatível é aquele que pode ser utilizado pelo operador, ou que tenha permissão, nas regras da linguagem, para ser transformado pelo compilador em um tipo válido (coerção).

Exemplo: Código em C++


1int restoDivisao(int a, float b)
2{
3 return a%b;
4}
Tentar compilar esse código geraria um ERRO DE TIPO, já que a aplicação do operador % não pode ter um operando real (float b).


Coerção

Em alguns casos, o compilador realiza a conversão automática de um tipo para outro que seja adequado à aplicação do operador.
Em C existe uma seqüência que determina como acontecerá a coerção:

1. Char e short são convertidos para int, float para double;
2. Se um dos operandos é double, o outro é convertido para double e o resultado é double;
3. Se um dos operandos é long, o outro é convertido para long e o resultado é long;
4. Se um dos operandos é unsig
ned, o outro é convertido para unsigned e o resultado é unsigned;

Exemplo: Código em C++


1int soma(int a,char b)
2{
3 //A variável b e convertida para int.
4 return a + b;
5}
6
7int main()
8{
9 int a = 1;
10 char b = '1';
11
12 //Imprime 50.
13 cout << soma(a,b);
14
15 getch();
16 return 0;
17}
Ao compilar o código acima a variável b do tipo char e convertida automaticamente para int e realizando a soma.

Em outros casos a conversão pode ser feita pelo próprio programador, para isso ele deve utilizar um operador molde entre parênteses que indicará em qual tipo o resultado deve ser convertido.

Exemplo:


int total = 0;
double exp = (double) total;


A verificação de tipos pode ser Estática ou Dinâmica.

Estática
A verificação de tipo e executada em tempo de compilação, sendo assim muitos erros são tratados durante o processo de desenvolvimento e a execução do programa pode ser realizada com mais eficiência.

Exemplo de linguagens com verificação estática: Ada, C, C++, C#, Java, Fortran, ML, Pascal, Haskell e etc.

Dinâmica
A verificação de tipo é executada em tempo de execução, tornando uma linguagem mais flexível e perdendo parte da capacidade de dectar erros.

Exemplo de linguagens com verificação dinâmica: Groovy, Java Script, Lisp, Objective-C, Perl, PHP, Prolog, Python,Ruby, Smalltalk,scheme,visual basic, clojure,apl,snobol4 e etc.


Tipificação forte


“Uma linguagem é dita fortem
ente tipificada se erros de tipo sempre forem detectados”. Permite detectar toda utilização de variáveis que resultam em erros de tipo.



Bibliografia:

Conceitos de Linguagens de Programação, 4º Edição, Robert W. Sebesta
http://pt.wikipedia.org/wiki/Tipo_de_dado
http://en.wikipedia.org/wiki/Type_system#Type_checking
http://www.dca.fee.unicamp.br/cursos/EA876/apostila/HTML/node71.html
http://gersonc.anahy.org/repcomp/Compiladores11-Semantica.pdf
http://www.inf.ufrgs.br/procpar/disc/cmp135/trabs/martinotto/trabII/semantica.htm
http://www.gpec.ucdb.br/ricrs/Courses/CompilerII-2008/Lectures/Verificacao_Tipos.pdf
http://www.dsc.ufcg.edu.br/~patricia/plp2003.1/aulas/valores2.pdf
http://ctgalina.googlepages.com/aula_5_TIPOSDEDADOS.doc

9 comentários:

  1. Pô moçada bacana o post de vocês, tava aki lendo e testando os exemplos no DEV rsrs,
    eu não sabia como funcionava a semantica e nem havia escutado falar sobre "coerção", tanto é que
    até o programador pode definir o tipo para o qual a variavel vai ser convertida, muito doido.

    ResponderExcluir
  2. Boua..tamém achei muito bacana a postagem velho, isso é bakana pra galera conseguir identificar melhor os erros que dão na compilação.
    Vlw a postagem..ms eu num intendi muito bem o que é a tipificação forte..tpo..s for possível(desculpa o incômodo) me dá um exemplo do que é.
    E isso ae ^^
    vlw...

    ResponderExcluir
  3. Este comentário foi removido pelo autor.

    ResponderExcluir
  4. uma linguagem tem uma tipificaçao forte, quando os erros de tipo (quando se utiliza um um tipo de variável, em uma operação que não é compatível com a operação) sempre são detectados... fico mais claro?
    qualquer duvida que permaneça, é so postar ae galera...
    vlw abraçoSs

    ResponderExcluir
  5. POxa...tenho q parabenizar os que já postaram..
    e o professor pelo incentivo..
    Estou com dificuldade na matéria ..
    mas no blog está bem mais claro do que no livro...e está me ajudando muuuito...
    um abraço a todos

    ResponderExcluir
  6. PUXXX. Tipificação é mara. Abordagem bem sucinta e objetiva mas que trouxe um esclarecimento bem legal sobre dúvidas de semântica que as vezes só são esclarecidas com conclusões como a de vcs.

    ResponderExcluir
  7. Legal, o que não entendi muito bem foi em relação à tipificação forte, ou seja, se for em uma linguagem onde não é necessário a declaração de tipo, como a linguagem irá detectar os erros?
    Mas no mais tudo tranquis !!!!

    ResponderExcluir
  8. bom eu num entendi muita coisa
    tenho dificuldade nessas coisas
    se puder depois gostaria de tirar
    duvidas pessoalmente, vlw!

    ResponderExcluir
  9. Estamos a disposição Josias... e André também precisava conversar pessoalmente... acho que poderia esclarecer mais coisas...

    ResponderExcluir