Não é por que é dinâmico que a tipagem é fraca.
Há algum tempo atrás recebi o seguinte comentário em um dos primeiros posts quer escrevi aqui no blog:
Bom artigo amigo, porém penso que esteja havendo alguma confusão sobre o que é “tipagem forte” e o que é “type casting implícito”, em minha opinião a linguagem é fracamente tipada, haja visto que se pode atribuir uma referência de qualquer TIPO de objeto a uma variável, porém a linguagem não realiza o TypeCasting de tipos de forma implícita e arbritária como caso de algumas “Linguagens Chatas” (tomei a liberdade de utilizar seu termo…).
Como o post era antigo acabei demorando para ver o comentário e consequentemente enviar uma respota, porém o comentário aborda um assunto tão interessante, que resolvi escrever um post para esclarecer o assunto, por tanto gostaria antes de mais nada agradecer o seu comémtario, e aqui vai a minha resposta
O Fato de não precisar definir um tipo para uma variavél, não é necessáriamene uma caracterísica de uma tipagem fraca, pois quando estamos atribuindo algo a uma variável, estamos apenas passando uma refêrencia, por exemplo:
nome = "Iuri" puts nome >> "Iuri"
O que eu fiz no exemplo acima, foi atribuir a instancia de um objeto do tipo string a variavel nome, não preciso dizer que a variavel nome é do tipo string, isso é uma característica de uma linguagem dinâmica. porém as vezes as pessoa confundem isso com tipagem fraca por causa do exemplo abaixo:
nome = "Iuri" puts nome >> "Iuri" nome = 1 puts nome >> 1
Nesse exemplo o que eu fiz foi atribuir a referência de um objeto string “Iuri” para a variavel nome, imprimir seu valor na tela, em seguida atribui a referência de um objeto FixNum 1 para o varivel nome e imprimir o seu valor. O fato de eu conseguir passar um valor string para uma variavel e em seguida um valor FixNum, não quer dizer que a minha linguagem tem tipagem fraca, ruby tem tipagem implicita o que é bem diferente de tipagem fraca, o minha variavel apenas trocou de referência no processo acima e por ela ser dinâmica automaticamente trocou de tipo.
Agora vamos ver outro exemplo para provar de vez que Ruby possui tipagem forte:
nome = "Iuri" soma = nome + 1 >> TypeError: can't convert Fixnum into String
Viu?? deu erro!
Isso por que Ruby tem tipagem forte, eu não posso somar um objeto do tipo string com um objeto do tipo FixNum. Isso é tipagem forte ![]()
Se excutarmos o mesmo algoritimo em javascript ,que esse sim possui tipagem fraca, o resultado seria bem diferente:
nome = "Iuri" soma = nome + 1 document.write(soma)
O resultado desse exemplo será Iuri1
Referencias:
http://en.wikipedia.org/wiki/Type_system#Duck_typing
http://en.wikipedia.org/wiki/Type_system#Dynamic_typing
http://en.wikipedia.org/wiki/Type_system#Strong_and_weak_typing
ótimo post , várias vezes já sofri ao tentar explicar para as pessoas essa peculiaridade da linguagem.
Exelente topico.
Aproveitando o andar da carroagem, prq q Ruby nao tem tipagem fraca? ja que, no meu ponto de vista, é otimo para uma linguagem de programação.
Oi Mauricio, obrigado pelo comentario, na minha opnião o grande lance da linguagem é ser dinamica, acho bom ter tipagem forte, ajuda a não fazer M rs.. mas vou te devolver a pergunta hehe pq vc acha que é bom ter tipagem fraca?
Vc tem razao qndo disse que protege o codigo contra M… mas por outro lado, quando vc esta num textfield para valores, eu odeio ter que ficar reescrendo classes para tratar numeros com virgula, com ponto, com R$, nunca se sabe como o usuario ira digitar. nesse caso a tipagem fraca ajuda muito. existem outros casos, mas esse foi oq lembrei no momento.
Vale lembrar que nao trabalho com programacao, sou apenas um amante e minha opniao nao deve ser levada muito a serio. um grande abraço.
Legal. Falou pouco e disse muito.
Uia!
Muito bom! Assim já tira minhas dúvidas de iniciante!
Abrass e continue assim!
Ruby pode não ter tipagem fraca mas possui meios de lidar com isso em alguns casos importantes.
Por exemplo:
numero = 42
“A resposta é #{numero}” => “A resposta é 42″
Ou seja, em interpolações de string ele chama o método to_s automaticamente, convertendo para string (até strings tem).
Em primeiro lugar, parabéns pelo artigo. Porém não concordo com a sua argumentação.
Conversão implícita não significa tipagem fraca. Em tipagem fraca a referência não tem um tipo definido. Ou seja, o interpretador ou seja lá o que estiver rodando, olha para aquela porção de memória e não é capaz de dizer: isto é um inteiro ou isto é uma string.
Isto é bem diferente de coerção implícita.
Em javascript o que ocorre é coerção implícita, que inclusive pode se construída com Ruby, pois antes de uma adição, o método coerce é chamado e você pode criar coerções implícitas escrevendo métodos coerce específicos.
Essa é minha opinião, mas acho que preciso estudar mais teoria de compiladores pois para mim não está muito claro o conceito de tipagem fraca.
O artigo da Wikipedia não é muito esclarecedor, pois segundo a argumentação do artigo, tanto C quando C++ podem ser consideradas linguagens com tipagem fraca:
“One of the more common definitions states that weakly typed programming languages are those that support either implicit type conversion (nearly all languages support at least one implicit type conversion), ad-hoc polymorphism (also known as overloading) or both.”
O próprio artigo diz isso no final:
“Two commonly used languages that support many kinds of implicit conversion are C and C++, and it is sometimes claimed that these are weakly typed languages.”
Apenas para completar, o parceiro que comentou o seu primeiro post disse:
“(…) em minha opinião a linguagem é fracamente tipada, haja visto que se pode atribuir uma referência de qualquer TIPO de objeto a uma variável”
Isso se chama tipagem dinâmica.
Excelente post, e muito bom comentario do Daniel. Tambe acredito que hoje em dia seja melhor falar de linguagens mais ou menos tipadas que outras, sempre comparando. C sempre fica numa grande discussao, ja que podemos atribuir ints a qualquer variáveis por exemplo…. é fracamente tipada? é fortemente tipada?