Tipos
Linguagens de programação podem ser divididas em dois grupos: estáticas e dinâmicas.
Em geral, linguagens dinâmicas são mais lentas que estáticas, pois fornecem menos informações que possam ser usadas para otimização, e são, em geral, interpretadas.
Porém, principalmente graças ao enorme aumento de desempenho dos computadores, linguagens dinâmicas interpretadas estão se tornando cada vez mais populares, e tomando o lugar das estáticas em muitas áreas, principalmente nas que exigem rapidez e facilidade de desenvolvimento (Internet), já que nestes aspectos são bastante superiores.
Estáticas
Nestas linguagens, as variáveis e funções têm um tipo fixo, mas os objetos armazenados/apontados pelas variáveis não necessariamente têm tipo. Exemplos bem conhecidos deste grupo são Pascal, C, C++* e Java*. Qualquer valor/objeto "armazenado" na variável será tratado como sendo do tipo da variável. Caso o programador "force" (typecast) um tipo a uma variável, seu conteúdo será tratado como sendo deste tipo, não do seu tipo real/original.
Além de poderem ser mais otimizadas, linguagens estáticas também tem a vantagem de encontrar certos erros, relativos à incompatibilidade de tipos, em tempo de compilação, antes do programa rodar. Em uma linguagen dinâmica muitos destes erros só podem ser verificados durante a execução do programa.
Dinâmicas
Em linguagens dinâmicas as variáveis não necessariamente têm tipo, sendo apenas "etiquetas" que podem se referir a qualquer objeto/valor, e estes têm um tipo. Alguns exemplos deste grupo são Lisp, Python, Smalltalk e Ruby.
Isto significa que é possível fazer algo como:
a = 123; a = "abc"
Uma forma simplificada de visualizar a relação de classes, objetos e variáveis em uma linguagem dinâmica, como Ruby, pode ser a seguinte:
Diagrama original (dia)
Isto permite uma grande flexibilidade. Em um exemplo simples, pode-se criar uma lista de itens, e nela armazenar-se quaisquer objetos de diferentes tipos.
Observações:
- Existem compiladores para linguagens dinâmicas que geram código muito eficiente, comparável ao de linguagens estáticas, fazendo uso de inferência de tipo e outras técnicas.
- Os sistemas de tipos como das linguagens C e Pascal são bastante ultrapassados e simples, fornecendo pouca ajuda ao programador, principalmente quando comparados a linguagens com inferência de tipos, ou mesmo com sistemas como os templates de C++, e genéricos de Ada.