Beruflich Dokumente
Kultur Dokumente
Nas ltimas semanas tenho descoberto que existe um dbito tcnico muito
grande em relao a programao.
Dbito tcnico: leia-se uma forma bonita que aprendi a falar para mostrar
que tenho uma grande capacidade de programar sem saber de fato a
aplicao, teoria, filosofia daquilo que est sendo escrito.
Tipagem fraca, forte, dinmica, esttica e inferncia de tipos so 5
conceitos diferentes - s pra ficar bem claro.
Inferncia de Tipo
A inferncia de tipos a capacidade do compilador entender/adivinhar qual
o tipo de dados de determinada varivel sem ela ter sido declarada no cdigo
escrito. Isso, mastigue o conceito com calma tomando a sua cerveja.
Vamos aos exemplos. No C# temos inferncia de tipo ao declarar variveis
locais com o var antes do nome da nossa varivel, tipo:
var inferencia = 10; //Nossa varivel 'inferencia' ter seu
tipo setado em tempo de compilao
Por exemplo, temos nosso amigo Javascript que uma tipagem fraca, ou seja,
alm de no ter a capacidade de detectar erros em operaes de tipos
diferentes, ela nos d um resultado nas operaes de tipos diferentes, mas
como assim?
Em Javascript podemos fazer:
'1' + 1 // o resultado ser '11'
'1' + true // o resultado ser 1true
'1' + True
Traceback (most recent call last): File "
<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'bool'
objects</module></stdin>
Note que PHP tem tipagem fraca e o Python tem tipagem forte mas as
duas linguagens tem Inferncia de Tipos.
desta forma podemos usar a palavra reservada var que no momento da atribuio o
compilador ir verificar o tipo do valor que est sendo atribudo e automaticamente ir
entender que aquela varivel do mesmo tipo do valor que queremos guardar. Veja o
exemplo abaixo nos arquivos InferenciaDeTipo.java e InferenciaDeTipo.cs.
Repare que em Java no temos o recurso de inferncia de tipo fazendo com que o
arquivo no seja compilado, j em C# ele descobrir o tipo pra voc, desde que use
o var na declarao da varivel.
Linguagens como PHP, Ruby, Python, Javascript e muitas outras inferem o tipo
sempre, nessas linguagens voc no declara os tipos.
A partir deste momento comea a confuso, onde muita gente comea a falar mal das
linguagens dinmicas por confundir inferncia de tipo com tipagem fraca. Pois bem
vamos l, so duas coisas completamente diferentes, s porque infere o tipo no quer
dizer que tenha tipagem fraca.
O que tipagem forte e fraca?
Bem, veja o Java e o C#, eles te obrigam a declarar os tipos das variveis. Em Java voc
sempre ter de declarar os tipos. Em C# voc pode usar o var para inferir o tipo e
deixar o seu cdigo mais limpo mas nem todos os lugares poder fazer isso, com
variveis que pertencem a uma classe por exemplo obrigatria a declarao do tipo.
Mas o que torna estas linguagens fortemente tipadas no s a declarao explcita de
tipo, mas sim o fato de que voc no conseguir realizar alguns tipos de operaes com
variveis de tipos diferentes, como somar um nmero int com boolean, ou subtrair um
float de uma string e por a vai.
Linguagens como Ruby e Python inferem o tipo para voc mas so fortemente tipadas.
Veja o exemplo abaixo no arquivo tipagem_forte.rb e tipagem_forte.py. Execute e
ver que no consegue somar/subtrair nmero com texto, se tentar outras operaes
com tipos diferentes ver que o interpretador ir acusar um erro.
J linguagens como PHP e Javascript os tipos tambm so inferidos porm sua tipagem
fraca o que faz com que anomalias aconteam quando se executam operaes com
valores de tipos diferentes. Primeiro execute o cdigo do
arquivo tipagem_fraca.php, nele estamos somando um int com string que por
coincidncia tem um nmero no meio, e o que o interpretador faz? Ao executar voc
ver que ele converteu sua string para int e somou ao outro valor sem nem acusar nada.
Com o arquivo tipagem_fraca.js acontece a mesma coisa, aqui estamos somando um
int com boolean, ele no acusa problema, ele simplesmente realiza a converso do
boolean para 1 e soma com o outro valor.
Com strings o Javascript no apresenta o problema do PHP porque ele as trata de
forma diferente, realizando a operao de concatenao. Em Java e C# ao somar uma
string com outro valor tambm realizada uma concatenao pois strings tambm so
tratadas de forma diferente onde o operador de soma sobrecarregado com outro
comportamento. Como podem ver, algumas linguagens tem tratamentos especiais para
certos recursos, seja por questes de desempenho ou praticidade.
using System;
var permitido1 = 1;
var permitido2 = "Permitido";
}
}
view rawInferenciaDeTipo.cs hosted with
by GitHub
naoPermitido = 42;
}
}
view rawInferenciaDeTipo.java hosted with
by GitHub
by GitHub
by GitHub
// WTF
console.log(10 + true);
view rawtipagem_fraca.js hosted with
by GitHub
<?php
// WTF
echo "5 laranjas" + 10 . "\n";
echo 10 + "5 laranjas" . "\n";
// OK
echo 10 . "5 laranjas" . "\n";
?>
view rawtipagem_fraca.php hosted with
by GitHub
H uma certa confuso em vrios termos sobre este assunto. Em alguns casos
no h uma definio formal aceita universalmente.
Popularmente as linguagens so classificadas pela sua tipagem, ento linguagens
estticas formalmente so linguagem que possuem tipagem esttica. E linguagens
dinmicas possuem tipagem dinmica.
Algumas linguagens podem ser classificadas como dinmicas por terem outras
caractersticas. Elas permitem execuo de cdigo arbitrrio ( eval) ou a
transformao de cdigos existentes em tempo de execuo. Cada vez mais
comum as linguagens modernas permitirem estas flexibilidades. No importa a
tipagem, ento formalmente existem linguagens que so dinmicas por esta
definio e estticas pela tipagem.
Definio
Esttica
A definio bsica da tipagem esttica que uma linguagem de programao pode
ter como caracterstica que h uma verificao dos tipos usados em dados e
variveis para garantir que sempre est sendo usado um tipo que esperado em
todas as situaes. Esta verificao feita no cdigo fonte pelo processo de
compilao. Esta anlise ajuda na chamada segurana de tipos na utilizao dos
dados pelo programa permitindo que o programador se preocupe menos com
esta questo. O compilador fornece garantias que alguns problemas no podero
ocorrer aps o programa passar por esta verificao, ou seja, erros so detectados
logo, antes do programa ser efeticamente executado.
Uma varivel no pode mudar seu tipo.
No entanto a tipagem esttica pode causar uma falsa sensao de segurana. S
uma parte dos erros podem ser descobertos antecipadamente.
Exemplo (est em C# mas poderia bem ser pseudocdigo):
var x = 1;
x = "1"; //erro de compilao, no pode trocar o tipo da varivel
Dinmica
Na tipagem dinmica esta verificao tambm ocorre mas ela feita em cima do
dado em si, j que as variveis podem conter qualquer tipo de dado. Claro que em
determinado momento uma varivel s pode conter um tipo de dado e isto
verificado. Mas a principal diferena que a esta verificao feita em tempo de
execuo. Isto feito atravs de uma infraestrutura auxiliar (uma mquina virtual
ou uma biblioteca normalmente chamada de runtime). comum o programador ter
que fazer suas prprias verificaes no programa ou em cdigos externos de teste
para garantir que todos os tipos esto corretos nos momentos certos. O
programador tem que se preocupar mais com os tipos embora em solues
simples pode parecer que a preocupao no seja necessria.
O que dinmico efetivamente o tipo da varivel. Entender e documentar os
tipos ainda so necessrios. H linguagens que incentivam fazer a documentao
no cdigo com notao hngara.
Dados precisam ser representados concretamente no computador. Varivel
um design pattern. Portanto uma abstrao. Dados no podem assumir vrias
formas, no mximo pode ser interpretados de formas diferentes em casos
especficos. Variveis podem se referenciar a tipos de diferentes. Portanto a
tipagem dinmica costuma ser um caso especial da tipagem esttica. Segundo
Bob Harper, um dos criadores da linguagem Standard ML, "uma linguagem
dinamicamente tipada uma linguagem estaticamente tipada com apenas um tipo
esttico".
Na prtica a tipagem dinmica uma abstrao tambm. H uma iluso que voc
pode se referenciar a um dado que possui diferentes tipos mas na prtica existe
apenas um marcador e h um apontamento para um dado esttico diferente.
As tcnicas mais comuns para alcanar esta iluso o uso de um tipo unio
(union em C/C++) e/ou ponteiros sem especificao de tipo ( void * em C/C++).
Todos os dados tero algum overhead de memria.
Exemplo (est em JavaScript mas poderia ser pseudocdigo, note que a sintaxe
idntica ao exemplo anterior mas a semntica diferente)
var x = 1;
x = "1"; //operao normal, o tipo que era um number passar ser string
Performance
Outra grande diferena em relao a performance. Embora seja possvel fazer
otimizaes em um programa escrito com "linguagem dinmica" para aproximar ou
at ultrapassar a performance dos programas escritos em "linguagens estticas",
pela dificuldade de alcanar isto normalmente no feito com eficcia. Em teoria
um compilador JIT tem mais condies de otimizar cdigo com informaes
precisas de como o programa ser executado e mesmo na prtica pode at
conseguir algum resultado melhor isoladamente.
Por outro lado se voc j sabe com o que vai lidar, no precisa ter nada no cdigo
gerado auxiliando o funcionamento no programa e o prprio programa no precisa
ter certas verificaes escritas pelo programador. Se a verificao feita antes da
execuo um programa com tipagem esttica no precisa ter este trabalho durante
a execuo.
No ajuda tambm o fato de que a maioria dos programas com tipagem dinmica
vo rodar em uma mquina virtual j que isto facilita o desenvolvimento da
linguagem e permite algumas flexibilidades extras normalmente desejveis em
"linguagens dinmicas".
Na prtica as linguagens no costumam ser 100% qualquer coisa. Ferramentas
pragmticas sabem quando fugir um pouco de um conceito para dar melhor
vantagem para o programador.
Linguagens hbridas
Existem as linguagens hbridas. Na prtica no possvel ter as duas formas de
tipagem mas possvel usar parte de um ou de outro conceito.
Tipagem manifesta
possvel uma "linguagem dinmica" usar tipagem manifesta sem mudar sua
caracterstica de tipagem dinmica. A vantagem pequena ou at questionvel.
Mas tambm h casos de linguagens que conseguem compilar partes do cdigo
com tipagem esttica e partes com tipagem dinmica. A interface entre as partes
precisam ser normalizadas para um jeito ou outro. Curiosamente algumas
preferem se definir como estticas ou dinmicas para tentar incutir uma cultura
predominante e usar a outra como exceo. Os puristas, para o bem ou para o
mal, consideram uma escolha ruim. Na verdade existem duas linguagens muito
semelhantes neste caso.
Algumas linguagens estticas possuem referncias para tipos quando os dados
sero armazenados no heap. E mesmo no stack a informao ainda existir no
cdigo para permitir reflexo, mas no haver consumo de memria no stack para
guardar o tipo.
*
Inferncia
Tipagem esttica no significa que todos os tipos precisam ser declarados
explicitamente. comum, na maioria das situaes, que o compilador consiga
inferir o tipo de uma varivel de acordo com sua atribuio ou at mesmo sua
utilizao (menos comum).
A grande vantagem da tipagem esttica est mais no fato que a varivel no poder
mudar seu tipo. Isto realmente ajuda muito o desenvolvimento. Ter que escrever o
tipo explicitamente ajuda pouco ou nada. Alguns acham que fica mais legvel
quando o tipo escrito, outros acham que apenas deficincia do compilador.
Ento possvel ter uma "linguagem esttica" que usa tipagem implcita reduzindo
parcialmente a cerimnia que estas linguagens costumam ter.
Hack
O PHP possui a possibilidade de fazer uma verificao de tipos antes da execuo
mas isto ajuda pouco porque a linguagem costuma ser executada de forma
interpretada e principalmente porque ela no pode verificar todos os tipos, todas as
situaes, portanto voc no tem segurana alguma. A segurana definida pelo
elo mais fraco. Durante a execuo tudo dinmico.
No conheo a linguagem Hack o suficiente para dizer como ela funciona mas
parece que ela possui tipagem esttica.
Eventualmente pode-se usar o tipo mixed que aquela estrutura de dados que
permitir que qualquer dado seja guardado ali. provvel que o compilador trate
este tipo de forma diferente. O programa trata dados de forma dinmica por
exceo, o programador diz que ali tudo pode acontecer porque isto que ele
quer.
Por vrias razes parece que Hack o PHP que bebe na gua do C#, me parece
que o mixed se comporta como o dynamic do C#.
Vantagens e desvantagens
Muitas vezes as vantagens e desvantagens variam de acordo com os olhos de
quem v. Programadores discordam do que realmente seja uma vantagem, at
porque quase tudo uma questo de trade-off, ento [ mais fcil falar em
diferenas. Algumas delas podem ser:
As
principais
vantagens
das
"linguagens
estticas"
so
a segurana, performance e auxlio
em
tempo
de
desenvolvimento (refatorao, completao de cdigo, informao auxiliar,
cobertura de cdigo etc.).
As "linguagens dinmicas" so flexveis, rpidas para prototipar, concisas.
C uma linguagem de tipagem fraca. C++ tambm, apesar dela tentar reforar um
estilo onde isto no seja to usado.
Os compiladores de C/C++ tentam evitar que isto seja usado abusivamente.
Da conclumos que segurana de tipos no uma caracterstica inerente de
linguagens ditas estticas. A segurana pode ser quebrada por outros
fatores. Type safety outro conceito diferente que pode ser confundido
erroneamente com tipagem forte e tipagem esttica.
Muitas "linguagens dinmicas" possuem tipagem forte, mas outras possuem
tipagem fraca, normalmente criando coeres implcitas. comum existir
Linguagens de script
Cada vez mais fica difcil definir linguagens de script. Elas costumam ser
dinmicas mas nada impede que sejam estticas.
A tipagem dinmica d mais flexibilidade e ajuda fazer aplicaes pequenas
rapidamente. Estas linguagens costumam exigir pouca cerimnia e a tipagem
dinmica prov pouca cerimnia na tipagem. Mas mais uma questo de
adequao do que uma exigncia.
Linguagens dinmicas costumam executar mais de forma interpretada do que
compilada e outro fator indireto que ajuda a serem usadas para fazer scripts.
Mas apenas um facilitador, novamente, no uma exigncia.
Nenhuma linguagem quer perder espao por isso cada vez mais as linguagens (de
tipagem) estticas permitem caractersticas de tipagem dinmicas, reflexo,
conciso, e execuo de forma simplificada (iluso de interpretao). Assim elas
podem ser consideradas de script tambm, apesar de no ser seu foco principal.
Alm da adequao, a caracterstica de script est mais ligada implementao
do que linguagem em si.
Uma reflexo
Se uma linguagem permite que seus tipos estticos possuam valores invlidos ou
que no correspondem ao que se espera neste tipo, um null por exemplo, ela
ainda tem tipagem esttica? Parece que sim, mas h dvida se deveriam. Quebra
a segurana de tipos e de uma certa forma pode ser interpretado como o dado
podendo ter dois tipos. Obriga uma verificao em runtime para garantir que no
haver problemas com o tipo.
Qual melhor?
A pergunta que no quer e provavelmente nunca vai calar : qual melhor?