Tipagem Fraca, Forte, Estática, Dinâmica e Inferência de Tipo Tipo por Perera em em Jun 5, 201
Na súl t i mass eman ast en hodes c ob er t oqueex i s t eum dé bi t ot éc ni c omu mui t o gr andeem r el açãoapr ogr ama mação.
Dé bi t ot é cni c o:l e i a s eumaf or maboni t aquea pr e ndiaf a l a rp ar amos t r a r quet enhoumagr andecapaci dadedepr ogr ama marsem saberdef at oa a pl i c aç ão,t e or i a ,fil os ofiada qui l oquee st ás endoe sc r i t o. Ti page mf r ac a,f or t e,di nâmi ca ,e st át i caei nf e r ê nc i adet i poss ão5 -s óp r afi c arbem c l ar o . conc ei t osdi f er ent e s
I nf er ênc i adeTi po Ai nf er ênc i adet i poséac apac i dadedoc ompi l adorent ender / ’ adi v i nhar ’ qualé ot i podedadosdede t er mi nadav ar i áv el s em el at ers i dodec l ar adanoc ódi go es c r i t o.I s s o,ma s t i g ueoc onc ei t oc om c al mat oma ndoas uac er v e j a . Vamosaose x emp l o s.NoC#t emosi nf e r ên ci ad et i p oa od ec l ar arv a r i á v ei s l oc ai sc om o“ v a r ”ant esdonomedanos s av ar i áv e l ,t i po: 10; ; //Nossa variá vari ável 'inferencia inferencia' ' ter terá á seu var inferencia = 10 tipo setado em tempo de compila çã ção o
Al á,quebel eza.Nãodecl ar amo most i ponenhum, m,masnahor aqueocomp mpi l ador enx e r gaov al orel eent endequeéumav ar i áv e ldot i poi nt ,eées s ac apac i dade quedefinequeuma mal i nguagem i emosPHP ,Py t hon,J av as c r i pt , nf er et i pos.T et c .Um e x empl oc ont r ár i os er i aoJ av a,nel aot i pode v es erdet er mi nadona d ec l ar aç ã od av a r i á v el ( Pe l oquep es qu i s e ies t át en dou m es f o r ç og r ad ual em c ol oc arai nf er ênc i adet i ponoj a v aháal gum t empov erJ EP286:Loc al Var i abl e T ypeI nf er ec en) .
Ti pagem For t eeFr ac a Umaf or mas i mpl esdedefi ni rat i pagem f or t eef r ac aéque,c as oel as ej af or t e, t er emo mosaver i ficaçãodet i posem t odasasoper açõesem t emp mpodeexecução o uc o mp mp i l aç ã o,j áaf r ac anã ot emo ses s av e r i fi c aç ão.
Po re x e mp l o ,t e mo sn os s oa mi g oJ a v a s c r i p tq ueéu mat i p ag em f r a c a,o us e j a , a l é m denã ot erac ap ac i dad ed ed et e ct arer r ose mo per a çõ esd et i p os di f er ent es ,el anosdáum r es ul t adonasoper aç õesdet i posdi f er ent es ,mas co moas si m? Em J a v a s c r i p tp od emo sf a z er : '1' + 1 // o resultado será '11' '1' + true // o resultado será 1true
Abr aseunavegadoret est eami gui nho.O PHPéumaout r al i nguagem de t i pagem f r ac a. Um Ex empl odet i pagem f or t eser i aoPyt hon.Fazendoasmesmasoper ações d oJ a v as c r i p tn op y t ho nt emos : '1' + 1 Traceback (most recent call last! "ile # $stdin%#& line 1& in
Tperror! cannot concatenate 'str' and 'int' ob)ects
'1' + True Traceback (most recent call last! "ile # $stdin%#& line 1& in
Tperror! cannot concatenate 'str' and 'bool' ob)ects
Not equePHPt em t i pagem f r acaeoPyt hont em t i pagem f or t emasas duasl i nguagenst em I nf er ênci adeTi pos.
Ti pagem Es t át i c aeDi nâmi c a Ti pagem Est át i caéacapaci dadedeumal i nguagem aj udarnasegur ançade t i p os ,o nd e,apa r t i rd omo me nt oqu eu mal i n gu ag em d et e r mi n aot i p od eu ma v ar i áv el es s et i ponãopodes eral t er adodur ant eacompi l aç ão,f az endoc om q ueoj o v e mp r o gr a ma do rn ãos ep r e oc u pet a nt opo i soc omp i l a do ra c us a r á er r oc as os ej aal t er adoot i podeumav ar i áv el .
Porex empl o,em C#: var i = 1; //Note que terá a inferência do tipo inteiro
i = '*'; //+ará erro de compila ção pois o tipo da vari ável , inteiro
J án aTi pa ge m Di nâ mi c at emosapo ss i bi l i d adedea l t er arot i pod an os s a var i ávelem t empodeexecução.Aessacapaci dadedefini mosumal i nguagem c o moDi n âmi c a ,c o mop ore x e mp l o ,on os s ov el h oa mi g oJ a v a s c r i p t ,v e j a : var i = 1; //Note que terá a inferência do tipo inteiro
i = '*'; //A partir desse momento sua variável é do tipo string com o valor 'A'. Lance normal, segue o jogo.
Not equeoC#t em i nf er ênci adet i po,éf or t eeées t á t i c a,j áoj a vas cr i pt t e mi nf e r ê nc i adet i po,éf r a caeédi nâ mi c a. Vej aqueumal i nguagem com t i pagem di nâmi ca,nãoi mpl i caem uma l i ng ua gem d i nâ mi c a,eem r el aç ãoai s s oj áde i x oopos tdoak i t aqueéuma t r aduç ãodopos tdeSt ev enDev i j v erqueanal i s aum t er c ei r opos t !: ) Um out r oob j e t i v odobl o gér epa ss arc o nc ei t oqu ede v er i am s erb ás i c os ,ma s pel omenosnami nhaci dade,amai or i adaspessaosqueconver sam j ávão d i r e t opr aum f r ame wo r kep as s am b at i dosn es s et i poded i f er e nç a,oqu e ac abai nfl uenc i andonaqual i dadedospr ofi s s i onai s ,ac r edi t oeu. Ea e,v o c êss a bi a me s s asd i f e r e nç a s ?Eudu v i d o!
Tipagem fraca/forte e inferência de tipo Em desenvolvimento de software muito se fala de tipagem forte e fraca, mas é uma coisa que muita gente ainda não entende, o mesmo quanto a inferência de tipo, que por muitas das vezes é confundido com tipagem e vice-versa. Frequentemente pessoas falam mal de uma linguagem de programação porque não entendem estes conceitos, por isso resolvi fazer este post para explicar melor. !rimeiro inferência de tipo. " que é isso# $uando estamos programando em um linguagem est%tica como &ava ou '( devemos declarar os tipos das vari%veis o)rigatoriamente. Em &ava declaramos o tipo da vari%vel e somente podemos atri)uir valores deste tipo para esta, em '( porém, além
desta forma podemos usar a palavra reservada var que no momento da atri)uição o compilador ir% verificar o tipo do valor que est% sendo atri)u*do e automaticamente ir% entender que aquela vari%vel é do mesmo tipo do valor que queremos guardar. +ea o exemplo a)aixo nos arquivos InferenciaDeTipo.java e InferenciaDeTipo.cs. epare que em &ava não temos o recurso de inferência de tipo fazendo com que o arquivo não sea compilado, % em '( ele desco)rir% o tipo pra você, desde que use o var na declaração da vari%vel. inguagens como !/!, u)0, !0ton, &avascript e muitas outras inferem o tipo sempre, nessas linguagens você não declara os tipos. 1 partir deste momento começa a confusão, onde muita gente começa a falar mal das linguagens din2micas por confundir inferência de tipo com tipagem fraca. !ois )em vamos l%, são duas coisas completamente diferentes, s3 porque infere o tipo não quer dizer que tena tipagem fraca. " que é tipagem forte e fraca# 4em, vea o &ava e o '(, eles te o)rigam a declarar os tipos das vari%veis. Em &ava você sempre ter% de declarar os tipos. Em '( você pode usar o var para inferir o tipo e deixar o seu c3digo mais limpo mas nem todos os lugares poder% fazer isso, com vari%veis que pertencem a uma classe por exemplo é o)rigat3ria a declaração do tipo. 5as o que torna estas linguagens fortemente tipadas não é s3 a declaração expl*cita de tipo, mas sim o fato de que você não conseguir% realizar alguns tipos de operaç6es com vari%veis de tipos diferentes, como somar um n7mero int com )oolean, ou su)trair um float de uma string e por a* vai. inguagens como u)0 e !0ton inferem o tipo para você mas são fortemente tipadas. +ea o exemplo a)aixo no arquivo tipagem_forte.rb e tipagem_forte.py . Execute e ver% que não consegue somar8su)trair n7mero com texto, se tentar outras operaç6es com tipos diferentes ver% que o interpretador ir% acusar um erro. &% linguagens como !/! e &avascript os tipos tam)ém são inferidos porém sua tipagem é fraca o que faz com que anomalias aconteçam quando se executam operaç6es com valores de tipos diferentes. !rimeiro execute o c3digo do arquivo tipagem_fraca.php, nele estamos somando um int com string que por coincidência tem um n7mero no meio, e o que o interpretador faz# 1o executar você ver% que ele converteu sua string para int e somou ao outro valor sem nem acusar nada. 'om o arquivo tipagem_fraca.js acontece a mesma coisa, aqui estamos somando um int com )oolean, ele não acusa pro)lema, ele simplesmente realiza a conversão do )oolean para 9 e soma com o outro valor. 'om strings o &avascript não apresenta o pro)lema do !/! porque ele as trata de forma diferente, realizando a operação de concatenação. Em &ava e '( ao somar uma string com outro valor tam)ém é realizada uma concatenação pois strings tam)ém são tratadas de forma diferente onde o operador de soma é so)recarregado com outro comportamento. 'omo podem ver, algumas linguagens tem tratamentos especiais para certos recursos, sea por quest6es de desempeno ou praticidade. using System;
public class InferenciaDeTipo { public static void Main(String[] args) { int valor ! ";
String valor# ! $%alor$;
var permitido ! ; var permitido# ! $&ermitido$; ' ' view rawInferenciaDeTipo.cs osted it
by GitHub
public class InferenciaDeTipo { public static void main(String[] args){ int valor ! "; String valor# ! $%alor$;
nao&ermitido ! *#; ' ' view rawInferenciaDeTipo.java osted it
by GitHub
print *#+" , $ resposta pra tudo no universo $ view rawtipagem_forte.py osted it
by GitHub
puts *# - $tipagem forte$ view rawtipagem_forte.rb osted it
by GitHub
.. /T0 console+log(" - true); view rawtipagem_fraca.js osted it
by GitHub
12pp .. /T0 eco $3 laran4as$ - " + $5n$; eco " - $3 laran4as$ + $5n$; .. 67 eco " + $3 laran4as$ + $5n$; 28 view rawtipagem_fraca.php osted it
Espero que mina explicação tena sido concisa.
by GitHub
$ualquer d7vida contri)ua com um coment%rio para que eu possa melorar8corrigir o post.
Há uma certa confusão em vários termos sobre este assunto. Em alguns casos não há uma definição formal aceita universalmente. Popularmente as linguagens são classificadas pela sua tipagem, então linguagens estáticas formalmente são linguagem que possuem tipagem estática. E linguagens dinâmicas possuem tipagem dinâmica. Algumas linguagens podem ser classificadas como dinâmicas por terem outras caractersticas. Elas permitem e!ecução de c"digo arbitrário # eval$ o u a transformação de c"digos e!istentes em tempo de e!ecução. %ada ve& ' mais comum as linguagens modernas permitirem estas fle!ibilidades. (ão importa a tipagem, então formalmente e!istem linguagens que são dinâmicas por esta definição e estáticas pela tipagem.
)efinição Estática
A definição básica da tipagem estática que uma linguagem de programação pode ter como caracterstica ' que há uma verificação dos tipos usados em dados e variáveis para garantir que sempre está sendo usado um tipo que ' esperado em todas as situaç*es. Esta verificação ' feita no c"digo fonte pelo processo de compilação. Esta análise a+uda na chamada segurança de tipos na utili&ação dos dados pelo programa permitindo que o programador se preocupe menos com esta questão. compilador fornece garantias que alguns problemas não poderão ocorrer ap"s o programa passar por esta verificação, ou se+a, erros são detectados logo, antes do programa ser efeticamente e!ecutado. -ma variável não pode mudar seu tipo. (o entanto a tipagem estática pode causar uma falsa sensação de segurança. " uma parte dos erros podem ser descobertos antecipadamente. E!emplo #está em %/ mas poderia bem ser pseudoc"digo$0 var 9 ! ; 9 ! $$; ..erro de compila:o< no pode trocar o tipo da vari=vel
Dinâmica
(a tipagem dinâmica esta verificação tamb'm ocorre mas ela ' feita em cima do dado em si, +á que as variáveis podem conter qualquer tipo de dado. %laro que em determinado momento uma variável s" pode conter um tipo de dado e isto ' verificado. 1as a principal diferença ' que a esta verificação ' feita em tempo de
e!ecução. 2sto ' feito atrav's de uma infraestrutura au!iliar #uma máquina virtual ou uma biblioteca normalmente chamada de runtime$. 3 comum o programador ter que fa&er suas pr"prias verificaç*es no programa ou em c"digos e!ternos de teste para garantir que todos os tipos estão corretos nos momentos certos. programador tem que se preocupar mais com os tipos embora em soluç*es simples pode parecer que a preocupação não se+a necessária. que ' dinâmico efetivamente ' o tipo da variável. Entender e documentar os tipos ainda são necessários. Há linguagens que incentivam fa&er a documentação no c"digo com notação h4ngara. )ados precisam ser representados concretamente no computador. 5ariável ' um design pattern . Portanto ' uma abstração. )ados não podem assumir várias formas, no má!imo pode ser interpretados de formas diferentes em casos especficos. 5ariáveis podem se referenciar a tipos de diferentes. Portanto a tipagem dinâmica costuma ser um caso especial da tipagem estática. egundo 6ob Harper, um dos criadores da linguagem tandard 17, 8uma linguagem dinamicamente tipada ' uma linguagem estaticamente tipada com apenas um tipo estático8. (a prática a tipagem dinâmica ' uma abstração tamb'm. Há uma ilusão que voc9 pode se referenciar a um dado que possui diferentes tipos mas na prática e!iste apenas um marcador e há um apontamento para um dado estático diferente. As t'cnicas mais comuns para alcançar esta ilusão ' o uso de um tipo união #union em %:%;;$ e:ou ponteiros sem especificação de tipo # void > em %:%;;$.
Performance
utra grande diferença ' em relação a performance. Embora se+a possvel fa&er otimi&aç*es em um programa escrito com 8linguagem dinâmica8 para apro!imar ou at' ultrapassar a performance dos programas escritos em 8linguagens estáticas8, pela dificuldade de alcançar isto normalmente não ' feito com eficácia. Em teoria um compilador =2< tem mais condiç*es de otimi&ar c"digo com informaç*es precisas de como o programa será e!ecutado e mesmo na prática pode at' conseguir algum resultado melhor isoladamente. Por outro lado se voc9 +á sabe com o que vai lidar, não precisa ter nada no c"digo gerado au!iliando o funcionamento no programa e o pr"prio programa não precisa ter certas verificaç*es escritas pelo programador. e a verificação ' feita antes da e!ecução um programa com tipagem estática não precisa ter este trabalho durante a e!ecução.
(ão a+uda tamb'm o fato de que a maioria dos programas com tipagem dinâmica vão rodar em uma máquina virtual +á que isto facilita o desenvolvimento da linguagem e permite algumas fle!ibilidades e!tras normalmente dese+áveis em 8linguagens dinâmicas8. (a prática as linguagens não costumam ser >??@ qualquer coisa. erramentas pragmáticas sabem quando fugir um pouco de um conceito para dar melhor vantagem para o programador.
7inguagens hbridas E!istem as linguagens hbridas. (a prática não ' possvel ter as duas formas de tipagem mas ' possvel usar parte de um ou de outro conceito.
7inguagem estática com tipos dinâmicos Buando uma linguagem ' considerada estática, formalmente ela tem tipagem estática, ela pode ter a infraestrutura necessária para guardar dados diferentes em uma variável. 1as os dados são guardados de uma forma diferente dos outros tipos. 5oc9 terá um tipo estático que pode guardar dados dinamicamente, mas a linguagem ainda tem tipagem estática em sua ess9ncia. A grosso modo a linguagem usa uma estrutura de dados e!tra para guardar o seu tipo e indicar onde está o dado real. (ormalmente ' feito na biblioteca e costuma ter au!lio do compilador apenas para indicar que a verificação normalmente feita deve ser rela!ada +á que a verificação será feita por esta biblioteca at' certo ponto e tamb'm pelo programador para evitar que determinados erros serão gerados em runtime atrav's desta biblioteca.
7inguagem dinâmica com tipos estáticos 7inguagem com tipagem dinâmica não pode efeticamente ser parcialmente estáticas. Afinal uma linguagem dinâmica, formalmente que a tipagem se+a dinâmica, deve sempre esperar qualquer tipo. e ela começar esperar um tipo especfico e fa&er a verificação antes da e!ecução, ela se transforma em 8linguagem estática8. (ão ' possvel redu&ir o nvel de abstração. 3 at' possvel prover uma verificação de tipos anterior como recurso adicional da linguagem mas não fa& muito sentido se não vier acompanhado da mudança na forma com que os dados são gerenciados na mem"ria. e o programa precisa ter seus tipos fi!os e garantidos antecipadamente seria um desperdcio ele usar uma estrutura que permita ter vários tipos. Esta estrutura tem custo de mem"ria # tag do tipo, refer9ncias para o tipo em todas situaç*es C$ e de processamento #indireção e!tra, seleção do dado:m'todo especfico a ser utili&ado$.
Tipagem manifesta
3 possvel uma 8linguagem dinâmica8 usar tipagem manifesta sem mudar sua caracterstica de tipagem dinâmica. A vantagem ' pequena ou at' questionável. 1as tamb'm há casos de linguagens que conseguem compilar partes do c"digo com tipagem estática e partes com tipagem dinâmica. A interface entre as partes precisam ser normali&adas para um +eito ou outro. %uriosamente algumas preferem se definir como estáticas ou dinâmicas para tentar incutir uma cultura predominante e usar a outra como e!ceção. s puristas, para o bem ou para o mal, consideram uma escolha ruim. (a verdade e!istem duas linguagens muito semelhantes neste caso. C Algumas linguagens estáticas possuem refer9ncias para tipos quando os dados serão arma&enados no heap. E mesmo no stack a informação ainda e!istirá no c"digo para permitir refle!ão, mas não haverá consumo de mem"ria no stack para guardar o tipo.
2nfer9ncia
Hac PHP possui a possibilidade de fa&er uma verificação de ti pos antes da e!ecução mas isto a+uda pouco porque a linguagem costuma ser e!ecutada de forma interpretada e principalmente porque ela não pode verificar todos os tipos, todas as situaç*es, portanto voc9 não tem segurança alguma. A segurança ' definida pelo elo mais fraco. )urante a e!ecução tudo ' dinâmico. (ão conheço a linguagem Hac o suficiente para di&er como ela funciona mas parece que ela possui tipagem estática. Eventualmente podeFse usar o tipo mi9ed que ' aquela estrutura de dados que permitirá que qualquer dado se+a guardado ali. 3 provável que o compilador trate este tipo de forma diferente. programa trata dados de forma dinâmica por
e!ceção, o programador di& que ali tudo pode acontecer porque ' isto que ele quer. Por várias ra&*es parece que Hac ' o PHP que bebe na água do %/, me parece que o mi9ed se comporta como o dynamic do %/.
5antagens e desvantagens 1uitas ve&es as vantagens e desvantagens variam de acordo com os olhos de quem v9. Programadores discordam do que realmente se+a uma vantagem, at' porque quase tudo ' uma questão de trade-off , então G' mais fácil falar em diferenças. Algumas delas podem ser0
As principais vantagens das 8linguagens estáticas8 são a segurança, performance e auxílio em tempo de desenvolvimento #refatoração, completação de c"digo, informação au!iliar, cobertura de c"digo etc.$. As 8linguagens dinâmicas8 são flexíveis, rápidas para prototipar , concisas.
3 bom entender que os bugs mais complicados continuam complicados igualmente nas duas tipagens. %ertamente há uma vantagem nas 8linguagens dinâmicas8 quando se pensa no desenvolvimento da pr"pria linguagem. )efinir a linguagem e criar uma implementação básica ' muito mais simples que uma 8linguagem estática8. Por'm para criar uma implementação poderosa, que possa resolver algumas das suas desvantagens, se torna um trabalho dificlimo. At' ho+e ningu'm resolveu todas desvantagens.
•
•
•
ravar um int e acessáFlo como se fosse um ponteiro. ravar um @oat e acessar como se fosse um int. 3 certo que o resultado será catastr"fico neste caso, mas ' possvel. bter um ? ser considerado falso ou outros n4meros #não importa de que tipo$ serem interpretados como verdadeiro em operaç*es que e!igem um booliano. ravar dois sort em sequ9ncia e ler como um int. Provavelmente nada 4til será obtido mas ' possvel. ravar 8pt8 e ler isto como se fosse um int, sei lá porque.
% ' uma linguagem de tipagem fraca. %;; tamb'm, apesar dela tentar reforçar um estilo onde isto não se+a tão usado. s compiladores de %:%;; tentam evitar que isto se+a usado abusivamente. )a conclumos que segurança de tipos não ' uma caracterstica inerente de linguagens ditas estáticas. A segurança pode ser quebrada por outros fatores. Type safety ' outro conceito diferente que pode ser confundido erroneamente com tipagem forte e tipagem estática. 1uitas 8linguagens dinâmicas8 possuem tipagem forte, mas outras possuem tipagem fraca, normalmente criando coerções implícitas. 3 comum e!istir
coerção em algumas situaç*es sob regras definidas. E!emplo0 verdadeiro e - $$ dá $$.
$$ !! '
A coerção implcita tem a vantagem de tornar o c"digo ligeiramente mais curto. 2sto costuma ser caracterstica de linguagens de script , onde o tamanho do c"digo fa& diferença. Então, linguagens feitas para desenvolver aplicaç*es, em oposição I scripts, não deveriam ter esta caracterstica # helloPHP$. A definição destes termos não a+udam muito e di&er que uma linguagem ' fracamente ou fortemente tipada de forma e!clusiva tamb'm não costuma ser verdade.
7inguagens de script %ada ve& mais fica difcil definir linguagens de script . Elas costumam ser dinâmicas mas nada impede que se+am estáticas. A tipagem dinâmica dá mais fle!ibilidade e a+uda fa&er aplicaç*es pequenas rapidamente. Estas linguagens costumam e!igir pouca cerimDnia e a tipagem dinâmica prov9 pouca cerimDnia na tipagem. 1as ' mais uma questão de adequação do que uma e!ig9ncia. 7inguagens dinâmicas costumam e!ecutar mais de forma interpretada do que compilada e ' outro fator indireto que a+uda a serem usadas para fa&er scripts. 1as ' apenas um facilitador, novamente, não ' uma e!ig9ncia. (enhuma linguagem quer perder espaço por isso cada ve& mais as linguagens #de tipagem$ estáticas permitem caractersticas de tipagem dinâmicas, refle!ão, concisão, e e!ecução de forma simplificada #ilusão de interpretação$. Assim elas podem ser consideradas de script tamb'm, apesar de não ser seu foco principal. Al'm da adequação, a caracterstica de script está mais ligada I implementação do que I linguagem em si.
-ma refle!ão e uma linguagem permite que seus tipos estáticos possuam valores inválidos ou que não correspondem ao que se espera neste tipo, um null por e!emplo, ela ainda tem tipagem estáticaJ Parece que sim, mas há d4vida se deveriam. Buebra a segurança de tipos e de uma certa forma pode ser interpretado como o dado podendo ter dois tipos. briga uma verificação em runtime para garantir que não haverá problemas com o tipo.
Bual ' melhorJ A pergunta que não quer e provavelmente nunca vai calar '0 qual é melhor
3 "bvio que não há universalmente uma melhor que a outra. empre podemos falar o clich9 que e!iste uma ferramenta melhor para um problema. (a prática eu ve+o que a escolha recai, na maioria das ve&es, em gosto e e!peri9ncia. E isto ' bom. Eu costumo di&er que antes de escolher a melhor ferramenta para o problema, escolha algo que voc9 saiba e se sente confortável em usar0 !a melhor ferramenta é aquela que voc" sa#e usar! . 3 a velha disputa entre engenheiros que querem que tudo se+a perfeito e administradores que querem que venha o melhor resultado. -ma serra el'trica corta madeira mais rápido e com mais precisão. -m marceneiro de fim de semana pode se machucar com uma serra el'trica. %laro que há casos que tecnicamente uma ' melhor que a outra mas isto está cada ve& mais sutil. 1inha obervação pessoal ' que programadores de 8linguagens dinâmicas8 costumam pensar menos no problema e criam designs e!cessivamente simplificados tra&endo problemas futuros. 1as há casos que um design melhor não ' vantagem. Por outro lado ve+o que programadores de 8linguagens estáticas8 tendem a pensar demais nos problemas e criam designs e!cessivamente complicados sem tra&er muitas vantagens futuras e não resolvendo todos os problemas futuros. (ote que isto não define a qualidade do programador e muito menos que >??@ dos programadores são assim em >??@ dos casos. Há casos que o oposto acontece. E deveria mesmo. Buando se programa em 8linguagens dinâmicas8 o plane+amento antecipado costuma ser mais importante. (ão posso afirmar que a tipagem em si se+a responsável pela tend9ncia #se ela for verdadeira$. Pode ser o tipo de programador que a tipagem atrai. 3 o surfista indo ao mar com ondas e não o mar com ondas fa&endo o su+eito virar surfista.