Smalltalk x Java
Não é nenhuma novidade que eu programo em Java, amo Java e blá blá blá, o que não impede que eu escreva posts controversos quanto a isso. Então, este texto definitivamente não é bom para aqueles que gostam de ler que o Java é a melhor linguagem do mundo e etc. Por isso, já vou avisando: se você sofre de algum problema estomacal que surge quando alguém aponta defeitos no Java, este post definitivamente não é para você.
Agora, se você gosta de Java, conhece alguma coisa de Smalltalk ou pode enriquecer este post com comentários pertinentes e inteligentes, sua contribuição é mais do que bem-vinda!
Tentarei mostrar aqui a implementação de alguns algoritmos e trechos de código em Java e Smalltalk, para fins de comparação e julgando qual das alternativas eu achei mais interessante.
UPDATE: devido ao excelente feedback que obtive neste post, eu o atualizei com mais algumas comparações entre Java e Smalltalk.
Problema: cálculo de fatorial
Em Java
Java não fornece nenhum método para cálculo de fatorial, sendo então necessário definir um método para tal. O método pode ser implementado tanto usando um a abordagem iterativa quanto recursiva.
Fatorial - iterativo:
-
-
public static long factorialNonRecursive(long n) {
-
long v = n, i = n;
-
while (i-\- > 1) {
-
v *= i;
-
}
-
return (n < 0) ? 0 : (n == 0) ? 1 : v;
-
}
-
Fatorial - recursivo:
-
-
public static long factorialRecursive(long n) {
-
if (n < 0) return 0;
-
if (n == 0) return 1;
-
return n * factorialRecursive(n-1);
-
}
-
Como ninguém costuma implementar um método para cálculo de fatorial utilizando o método iterativo, então vamos considerar o método recursivo na comparação.
Em Smalltalk
Não é necessário definir um método para fazer o cálculo. No Smalltalk, tudo é um objeto, o que fica claro no código abaixo:
-
-
5 factorial
-
Neste exemplo, enviamos a mensagem factorial para o objeto 5, que é uma instância de SmallInteger, classe esta que estende Integer (que é quem define a mensagem factorial).
Não fique espantado, pois o código acima é tudo o que você precisa fazer para obter uma instância de Integer = 120. Nada mais.
Mas, supondo que Smalltalk não fornecesse tal funcionalidade pronta, como este método poderia ser escrito? (ver comentário de Carlos Heuberger, logo abaixo na página)
-
-
factorial: aNumber
-
aNumber = 0 ifTrue: [^ 1].
-
aNumber > 0 ifTrue: [^ aNumber * (self factorial: aNumber - 1)].
-
^ 0.
-
Neste código, definimos um método factorial que recebe um número como parâmetro. Veja que a característica dinâmica da linguagem torna a declaração do método e uso de variáveis muito simples. O que vale frizar é que, embora Smalltalk seja uma linguagem dinâmica, ela possui tipagem forte. Por isso, utilizar um objeto como sendo outro gera erros.
Voltando à explicação, utilizamos a mensagem ifTrue no objeto Boolean resultante da expressão (aNumber = 0), fazendo com que o bloco seja executado caso a condição seja verdadeira. Neste caso, retornamos o Integer 1 (através do caractere ^). De modo análogo, chamamos o método recursivamente caso o número for maior que zero, retornando o resultado do fatorial. Caso o número seja negativo, o método retorna 0. Perceba também o uso do caractere . (ponto), usado para demarcar o fim de uma instrução.
O interessante neste algoritmo é que tudo se resume à troca de mensagens entre objetos, e não ao uso de comandos da linguagem (como no caso do Java). Bastante intuitivo.
Vencedor
Considerando que existe uma mensagem prontinha para calcular fatoriais (e outras várias mensagens para cálculos matemáticos dos mais diversos), o Smalltalk leva a melhor.
Aliás, mesmo se desconsiderarmos o fato de que Smalltalk fornece tal método pronto, eu acho a versão do algoritmo em Smalltalk mais fácil de se entender, principalmente porque não é necessário que os programadores decorem sintaxes particulares à diversos tipos de construções da linguagem (if, for, while, do e switch como exemplos da linguagem Java). Basta saber enviar mensagens aos objetos (e saber utilizar o básico do Class Browser oferecido pelo ambiente Smalltalk).
Reforçando…
O Smalltalk fornece um número bastante reduzido de construções, já que o objetivo da linguagem foi literalmente imitar o mundo real. Como assim? Bom, todo processamento ocorre através da troca de mensagens entre objetos, seguindo um padrão <receiver> message <arg>. Por exemplo:
-
-
album play.
-
album playFromTrack: 1.
-
album playFromTrack: 1 to: 6.
-
O código mostrado na listagem anterior soa bem mais natural (ou menos “computacional”) do que o que vemos em Java, não?! Bom, pelo menos para mim, soa!
-
-
album.play(1, 6);
-
Se você não conhece Smalltalk (assim como eu não conhecia, a alguns dias atrás), tudo ficará mais claro nos próximos exemplos.
Problema: imprimir os números de 1 a 10
Em Java
A forma mais simples de se implementar isso é através da utilização de um loop for:
-
-
for (int i = 1; i <= 10; i++) {
-
}
-
Em Smalltalk
Veja a grande diferença:
-
-
1 to: 10 do: [ :elem |
-
Transcript show: elem; cr.
-
].
-
Em ambas versões, o código poderia ter sido colocado em uma única linha, mas por questões de legibilidade, preferi dividir.
Um objeto Number possui um método to: <stop> do: <aBlock>. O parâmetro stop seria um outro objeto Number que indica o final da iteração e o parâmetro aBlock recebe um bloco de código (ou closure) que deve ser chamado a cada iteração. A cada iteração, o método passa o elemento sendo iterado para a closure, que é recebido através do objeto elem.
Continuando com a explicação, a linha de código dentro da closure é igualmente interessante, onde enviamos a mensagem show para o objeto Transcript, para que o valor seja impresso no terminal, seguido de uma quebra de linha. O trecho de código abaixo se comporta da mesma forma:
-
-
Transcript show: elem.
-
Transcript cr.
-
Isso nos leva a crer que o caractere ; é usado quando se deseja enviar várias mensagens a um mesmo objeto. O cr é uma mensagem enviada a Transcript que faz com que uma quebra de linha (carriage return) seja impressa.
Vencedor
Na minha opinião, o trecho escrito em Smalltalk é mais intuitivo que o trecho escrito em Java. Talvez, para programadores C e C++, o trecho escrito em Java seja mais intuitivo do que o trecho em Smalltalk, pelo fato de que Java, C e C++ são muito parecidas sintaticamente, pelo menos em relação ao código em comparação aqui.
Problema: trabalhando com Collections
Quem trabalha constantemente com Collections em Java, deve odiar. Eu particularmente, odeio, pois as assinaturas de métodos e construtores foram cuidadosamente projetados para não serem práticos.
Em Java
Abaixo, um código para adicionar elementos em uma Collection e imprimí-los no terminal:
-
-
List<String> l = new LinkedList<String>();
-
l.add("Trabalhar ");
-
l.add("com Collections ");
-
l.add("em Java ");
-
l.add("é chato pra ");
-
l.add("cacete.");
-
}
-
Se você ainda não deu um tiro na própria cabeça, já é alguma coisa. Gostaria de deixar claro que eu adoro Java, mas convenhamos: isso é podre.
Em Smalltalk
Abaixo, o mesmo código portado para Smalltalk (quer dizer, quase o mesmo, visto que mudei as Strings que são adicionadas à Collection):
-
-
|c|
-
c := OrderedCollection with: ‘Trabalhar ‘ with: ‘com Collections ‘ with: ‘em Smalltalk ‘ with: ‘é bem melhor’.
-
c do: [:str |
-
Transcript cr; show: str ].
-
Neste programa utilizamos a classe OrderedCollection para armazendar os elementos. Para criar o objeto já com os objetos, enviamos a mensagem with:with:with:with: com os objetos que queremos adicionar à Collection.
A classe OrderedCollection é utilizada quando se deseja trabalhar com arrays de tamanho variável. Uma coisa interessante de ser dita (que costuma confundir a cabeça de novatos, como eu): o “Ordered” no nome não indica que os elementos dentro da Collection serão classificados; um array ordenado é diferente de um array classificado (conceito este que também é utilizado na API de Collections do Java, mais informações aqui).
Ok, uma vez que a Collection foi populada, utilizamos a mensagem do para mostrar os elementos da Collection no terminal, um a um.
Vencedor
Neste caso, é óbvio que eu prefiro o Smalltalk. E nem pensei duas vezes antes de escrever isto.
Problema: mostrar os pares e ímpares entre 1 e 10
Ver comentário do Icaro, logo abaixo na página.
Em Java:
-
-
for (int i = 1; i <= 10; i++) {
-
if (i % 2 == 0) {
-
}
-
else {
-
}
-
}
-
Nenhuma novidade para quem conhece o básico da sintaxe da linguagem Java.
Agora, a versão Smalltalk:
-
-
1 to: 10 do: [ :n |
-
n even ifTrue: [
-
Transcript show: n; show: ‘ is even’; cr]
-
ifFalse: [
-
Transcript show: n; show: ‘ is odd’; cr] ]
-
Novamente pergunto: qual das versões soa mais “natural”? Na minha opinião, a versão Smalltalk. Neste código, iteramos entre os números 1 e 10. Para cada número, enviamos a mensagem even para verificar se o mesmo é par (even). Se sim, mostramos a mensagem 'x is even' (x é par) e, caso contrário, mostramos a mensagem 'x is odd' (x é ímpar).
Ah mais as diferenças entre a versão Java e a versão Smalltalk são mínimas.
Talvez sim… o que eu quis mostrar com este exemplo é que a linguagem Java fornece diversos comandos (para iterar, comparar etc, cada qual com sua estrutura sintática) que, no Smalltalk, são simples mensagens enviadas a objetos capazes de tratá-las. Mais detalhes podem ser vistos neste documento.
Vencedor
Na minha opinião, Smalltalk.
Problema: invocar um método via Reflection
Vamos supor a existência de uma classe chamada MyClass e, via reflexão, precisamos invocar o método showMessage().
Em Java
-
-
MyClass obj = new MyClass();
-
Class clazz = obj.getClass();
-
Method method = null;
-
-
try {
-
method = clazz.getMethod("showMessage", null);
-
method.invoke(obj, null);
-
}
-
A API de reflexão do Java é muito boa, adoro ela. Se não fosse por ela, provavelmente ainda estaríamos programando aplicativos para a web utilizando Servlets e JSPs. Entretanto, veja que, para casos simples como este, ela costuma ser chata de se trabalhar; várias exceções precisam ser tratadas e o código em si é bastante “verboso”.
Em Smalltalk
Pá-pum:
-
-
myObj perform: #message
-
Aqui estamos utilizando a mensagem perform:, que serve para requisitarmos o processamento de um seletor representado pelo parâmetro. Aqui, ao contrário do Java, não precisei agir defensivamente com blocos catch; se a mensagem em questão não existir, o objeto recebe uma notificação doesNotUnderstand:.
Vencedor
Nem vou responder.
Conclusão
Claro que aqui estamos apenas comparando as partes “sintaxe e API” do Java com a parte “sintaxe e API” do Smalltalk. Se entrarmos no mérito de discutir a comparação da parte “plataforma” do Java com a parte “ambiente” do Smalltalk, creio que a coisa fica ainda pior para o lado do Java.
Mas enfim, comparar a sintaxe de uma linguagem que conhecemos com uma que desejamos aprender é, na minha opinião, o melhor caminho a seguir para facilitar o aprendizado (e claro, caso as diferenças entre tais linguagens não sejam tão grandes a ponto de impossibilitar esta abordagem).
Tags: comparação, java, linguagens, opinião, problemas, sintaxe31 Comentários
Trackbacks
- fechaTag » Python X Java X Smalltalk - XML, XHTML, CSS, Tableless, Desenvolvimento Web, Python, Linux
- Comparação de sintaxes básicas em PHP X Phyton X Smalltalk X Java « Marcelio Leal
- Comparações podem ser enriquecedoras « CØdeZØne!


4 de maio de 2007 às 8:42 pm
Muito bom ver posts sobre smalltalk aparecendo no infoblog. Parabenizo a iniciativa! Quem sabe as pessoas se interessem mais por esta linguagem/ambiente e sua história.
Bons estudos,
Thiago
4 de maio de 2007 às 9:34 pm
Confesso que comecei a ver por que, geralmente, não consigo controlar minha curiosidade
Mas, até agora, só tenho elogios… é uma linguagem incrivelmente simples e poderosa ao mesmo tempo. Mas ainda falta bastante coisa pra aprender! hehe
[]s!
6 de maio de 2007 às 9:30 pm
olá. achei que esses exemplos simplesmente nao convencem. o que há de dificil ou confuso nos exemplos de java que deu? particularmente nao gosto de linguagens onde nao há rigor (desde que ponderado) na forma de programacao, tal como em php…
ps: nao sei se é o caso, pois nao conheco smalltalk, estou dizendo baseando nos exemplos que listou.
6 de maio de 2007 às 10:36 pm
Olá Icaro!
Primeiramente, obrigado pelo comentário, pois a questão levantada por você é bastante pertinente. Na realidade, a intenção não foi dizer que criar um método para calcular fatorial em Java é difícil. Você com certeza concorda que qualquer um com uma pequena noção da linguagem é capaz de implementar tal método sem muitos problemas.
Gostaria de frisar que ainda estou lendo sobre Smalltalk, mas, até onde sei, a linguagem é bastante simples pelo pequeno número de construções existentes, resumindo-se basicamente ao envio de mensagens a objetos. Para citar um exemplo, não existe um comando
ifeelse, mas existem objetos que recebem mensagensifTrueeifFalse. Veja só o exemplo abaixo, onde o algoritmo imprime os números de 1 a 10, dizendo se são pares ou ímpares:Qual é a dificuldade de se implementar isso em Java? Nenhuma:
“Onde eu estou querendo chegar?”, você deve estar se perguntando. Primeiro, vamos analizar o trecho de código Java. A grosso modo, para implementar o algoritmo você precisa:
for‘;%‘);==‘, ‘<=‘);++‘) e atribuição (’=‘);ifeelse;Strings(concatenação);System.out.println, para escrever dados no terminal.Ok, acho que deu pra ver que, mesmo para um probleminha simples como esse, temos de recorrer a diversos tipos de ‘construções’ da linguagem.
Beleza, e quanto ao trecho em Smalltalk? Você precisa:
objeto <mensagem>.) . Por exemplo: as mensagensto,do,evensão mensagens que umSmallIntegeré capaz de processar;ifTrueeifFalsesão mensagens que umBooleanpode processar etc;Transcript.Pois bem. Além do número de construções/comandos/operadores ser bem menor, o algoritmo escrito em Smalltalk soa mais natural para mim do que o mesmo em Java, embora cada um seja livre para ter sua própria opinião.
Espero que tenha ficado claro que a linguagem Java fornece diversos comandos (para iterar, comparar etc) que, no Smalltalk, são simples mensagens enviadas a objetos capazes de tratá-las. Mais detalhes podem ser vistos neste documento.
Quanto ao ‘rigor’ que você preza em uma linguagem de programação, o Smalltalk é sim uma linguagem dinâmica, embora possua tipagem forte. Então você não tem motivo para não gostar de Smalltalk (como não gosta de PHP).
Além do mais, os ambientes Smalltalk são tipo as IDEs do Java: fornecem code-completion, class browsers, menus de refactoring, documentação e muitas outras coisas.
Só queria terminar esse comentário dizendo que eu imaginava sim que o Smalltalk fosse legal e tudo mais… só não imaginava que fosse tanto! Chega ser difícil de acreditar que um troço tão bom não seja tão utilizado hoje (como o Java é, por exemplo)… talvez o que falta seja uma empresa influente (como a Sun com o Java) para fazer a coisa avançar de verdade.
[]s!
7 de maio de 2007 às 12:13 am
Realmente gostei muito da sintaxe do SmallTalk. Primeira vez que vi um código escrito nessa tão famosa linguagem. Espero ler outras comparações sobre Java e Smaltalk aqui.
7 de maio de 2007 às 12:20 am
Mas quanto a isso, pode ficar tranqüilo!
Eu aproveitei o fim de semana para continuidade ao meu ‘estudo’ da linguagem… portanto, pode crer que logo terá um novo post sobre o assunto.
Valeu pelo comentário!
[]s
7 de maio de 2007 às 9:09 am
Olá,
pelo que ví - parei depois de ver a primeira comparação - a única vantagem do Smalltalk é o fato do Integer ter a mensagem factorial… Seria muito mais interessante ver como se implementa o fatorial no Smalltalk; tambem posso comparar um caminhão com um porsche e provar que o caminhão é muito melhor pois não necessita de carreta para fazer transportes…
Obs: Smalltalk foi a primeria linguagem OO que aprendi e sempre gostei dela.
7 de maio de 2007 às 12:06 pm
Segundo o Class Browser do Squeak, o método fatorial é igual ao seguinte trecho (classe
Integer):[]s!
7 de maio de 2007 às 11:24 pm
Talvez, mas lembre-se que perl, ruby e python não precisaram. Enfim, pelo que ja li e conversei a respeito, o problema foi complicado. Dê uma olhada na história pós-Xerox do smalltalk, a partir do momento que ela se tornou pública. Aconteceram muitas coisas desafortunadas que impediram sua inserção no meio popular.
Entre estes infortúnios, pode-se supor que C++ e Java fizeram sua parte em ofuscar smalltalk, quando se inseriram no mercado. Porém, o grande problema costuma ser associado a fragmentação da comunidade: as implementações são incompatíveis e os padrões não tem força. Inclusive, acho que uma parcela dos motivos que levaram a Sun a adiar a abertura dos códigod da JVM foi este: medo de fragmentar a comunidade, como aconteceu com smalltalk.
Além do mais, creio que dois outros fatores aparecem como barreiras: a natureza da tecnologia e seu propósito. Pela natureza, me refiro a sintaxe e imagem. Especialmente o último (”seu sistema é sua imagem”). Smalltalk não se encaixa bem no SO como perl/python/ruby/shell. Ela não é amigável com seus vizinhos. Fazer com que smalltalk converse com algo que não seja smalltalk pode ser lamentável, pois o sistema e seu código fonte devem estar a disposição a todo momento, nos mesmos termos. Portanto, saindo de seu mundo, a coisa foge do esperado. Aqui é bom lembrar que, no início, smalltalk era o próprio sistema operacional, sendo assim, não havia preocupação em interoperabilidade com outras linguagens, etc.
Quanto ao propósito, ninguém melhor que o próprio Alan Kay para explicar a visão que eles tinham - espero que sua curiosidade o leve a ele. Penso que isto é um obstáculo pois não acho que seja fácil de entender. Pelo contrário, é fácil limitar smalltalk à sua sintaxe e, por conseguinte, rebaixá-la (mas, claro, não acho que é o que você fez neste post, embora muitos leitores podem ter tido este sentimento), e é fácil desmerecer o poder de suas inspirações (como Lisp). Talvez ainda mais fácil, pensar que todas as “inovações” que vieram depois (não darei exemplos) são, a rigor, evoluções ou, de fato, inovações. Mas pode ser difícil entender os insights e visões por traz de cada conceito.
Muitos ainda olham rapidamente para o sol “se movimentando” e insistem em afirmar que ele gira em torno da Terra. Um pouco mais de dedicação e investigação cuidadosa pode mostrar que as aparências enganam. Da mesma forma, pode se dizer que smalltalk não se trata de sua linguagem, assim como Croquet não se trata de engines 3D (muito embora a linguagem e o engine tenham papeis relevantes). Ambos compartilham esta tragédia do sol: são vistos superficialmente, mas incompreendidos.
Portanto, para nós, programadores, smalltalk nem sempre é o que parece. É necessário superar as aparências e encontrar os tesouros escondidos. E, para apreciá-los, pode ser necessário sacrificar a caverna em que se vive e desejar ver a vastidão do horizonte. Mas fazer este sacrifício enquanto se ama a caverna pode ser um problema (alguém ai viu matrix?).
Não pretendo dizer que smalltalk é o tesouro ou a vastidão do horizonte. Mas tenho certeza que é um dos grandes caminhos (uma pílula vermelha, se assim o preferir) que pode levar uma pessoa até eles.
Thiago
8 de maio de 2007 às 12:14 am
Olá Thiago! Cara, que
comentáriopost foi esse! Sensacional!!Em casos como este que eu considero interessante que uma organização, sem fins lucrativos claro, trabalhe juntamente com a comunidade afim de definir padrões consistentes e que sejam também interessantes ao mercado. Algo que seja para o Smalltalk o que o JCP é para a tecnologia Java. (claro que existem algumas coisas que eu não gosto no JCP, mas isso não vem ao caso).
Uma entidade dessa natureza no mundo Smalltalk (SCP - Smalltalk Community Process, talvez?!
), ajudaria a integrar empresas e desenvolvedores no intuito de melhor guiar a tecnologia rumo a melhorias que a tornasse atraente ao mercado. Então, com uma comunidade alinhada aos objetivos da tecnologia - e aos objetivos das empresas como consumidores de tecnologia - acaba-se criando um ambiente legal para que a tecnologia cresça de forma consistente.
Com certeza irei procurar algo a respeito, afinal, estou bastante empolgado com as coisas que vi até então. No entanto, como disse várias vezes durante meus comentários e meu post, estou apenas iniciando meus estudos. É perfeitamente normal que eu, numa situação como esta, escreva algumas bobagens ou exponha as informações de uma forma inadequada. Você com certeza entendeu, mas pode não ter ficado claro que a única coisa que eu tenho condições de falar a respeito agora é sobre a sintaxe… mas espero futuramente escrever novos textos onde o tema em questão seja algo mais prático e interessante!
Só para constar: mais um comentário igual o seu e eu caio duro aqui no chão!
Muito obrigado mesmo pela força e, principalmente, pelas dicas que você vêm passando pra gente.
Um abraço!
8 de maio de 2007 às 9:00 am
Pessoal, apenas um alerta:
- Smalltalk vicia!
Desenvolvo ‘profissionalmente’ java a cerca de 6 anos, mas não consigo deixar de admirar e ‘brincar’ em casa com essa linguagem (uso o Squeak).
Uma dica para estudo é o framework web Seaside, que utiliza conceito de continuations de fato , não faz gambiarra como outros frameworks…..vale a pena
Parabéns pela iniciativa de escrever esse blog, temos poucos ‘comentários’ em português sobre o assunto.
8 de maio de 2007 às 6:47 pm
Uma coisa que me deixa deprê sobre smalltalk é que até tem iDEs boas mas não da pra gerar um executável, a não ser que se pague…
14 de maio de 2007 às 10:14 am
Olá Fabio.
Eu acredito que esse conceito de “programa executável” não é algo interessante, principalmente pela filosofia do Smalltalk.
Mais informações sobre isso você pode encontrar neste link.
Um abraço!
22 de maio de 2007 às 4:30 pm
Peraí, você sabe usar genéricos (Java 5+) mas não sabe iterar por coleções?
Sei muito bem das vantagens das linguagens dinâmicas (apesar de ser mais fã de Python e Ruby que de Smalltalk), mas justiça seja feita!
E, para a comparação feita (um número fixo de elementos pra apenas iterar), acho que seria mais justo usar um array no Java:
E o loop de iteração permanece exatamente o mesmo.
22 de maio de 2007 às 5:04 pm
Interessante como o seu argumento, que, à primeira vista parece ser a favor do Java, mas que resulta em uma deficiência, pelo menos no contexto deste post. Em outras palavras, você acaba de mostrar mais uma construção Java (na verdade uma variação de uma construção já existente) para fazer a mesma coisa, que é iterar em uma coleção de objetos!
E sim, eu também sei que trabalhar com um array fixo em Java simplifica o problema descrito aqui. Mas, um dos objetivos que eu quis atacar (além de mostrar o quanto o Java é mais complexo que Smalltalk) foi mostrar, neste exemplo, o quanto a API Collections pode melhorar.
A propósito, modifiquei o post com o código postado no seu comentário!
Valeu!
22 de maio de 2007 às 6:02 pm
“A API de reflexão do Java é muito boa, adoro ela. Se não fosse por ela, provavelmente ainda estaríamos programando aplicativos para a web utilizando Servlets e JSPs. No entanto, para casos simples como este, ela costuma ser chata de se trabalhar.”
Fiquei curioso ao ler essa frase sua acima, não sou nenhum programador Java avançado, mas já tenho alguma experiência com o mesmo e não conheço essa “API de reflexão”. Dei uma pesquisada no Google e no seu Blog, mas não achei muita coisa, seria bom se escrevesse algo sobre o assunto ou se pelo menos me desse uma esclarecida (pode ser um bom link) se possível.
Abraços!
22 de maio de 2007 às 6:09 pm
Olá!
Você provavelmente não encontrou nada pelo fato de que eu optei por traduzir o termo
Para saber mais sobre o assunto, pesquise por “java reflection”… ou leia este tópico.
Abraços.
22 de maio de 2007 às 6:19 pm
Olha, embora eu entenda seu ponto em ter que aprender mais uma construção na linguagem, não acho esse exemplo mais tão ruim. As únicas coisas que complicam o exemplo são o fato de você dar um tipo à variável (o que se enquadra em tipagem dinâmica vs estática, mas que sabemos que cada uma tem suas vantagens) e você precisar especificar o tipo de implementação (ArrayList vs LinkedList), mas, assim como a questão de tipagem estática, isso é para que você consiga obter um desempenho melhor nas ocasiões apropriadas, algo que a grande maioria das linguagens dinâmicas tira de você. A parte que realmente trata de collections, não vi nada de mais… mas no exemplo original, concordo, o loop do #hasNext()/next() era deprimente. Tanto que só comecei a respeitar o Java justamente com o 5.0, que teve a chegada dos generics (que ainda podem melhorar bastante) e do novo
forMas não pense que mesmo defendendo o Java aqui eu troque minhas linguagens dinâmicas por ele
Cada ferramenta para sua ocasião!
4 de junho de 2007 às 10:01 pm
Se Python estivesse na briga, todo mundo tinha apanhado.
4 de junho de 2007 às 10:33 pm
Hmm.. já ouvi isso antes!
12 de junho de 2007 às 6:26 pm
quero implementar fatorial no netbeans, alguém aí poderia me ajudar, e mandar para meu emaill?? Obrigado!!
12 de junho de 2007 às 6:51 pm
Não entendi… você quer implementar ou quer que alguém implemente?? Bom.. já adianto que a segunda opção tá fora de cogitação.
[]s!
2 de setembro de 2007 às 11:07 pm
Muito bom o POST.
Dá pra ver claramente que a sintaxe do Java está ultrapassada comparado com as linguagens que começam com a letra P e R
Mas é óbvio que esse tipo de comparação abrange somente uma ambiente restrito de aplicações.
3 de setembro de 2007 às 1:17 am
Opa Marcelio!
Com certeza.. foi só uma brincadeira que fiz enquanto aprendia a executar meus primeiros comandos no Smalltalk. Por isso os exemplos são bem idiotas mesmo.
Mas, se antes eu já “puxava a sardinha” pro lado do Smalltalk, hoje então…
11 de novembro de 2007 às 2:08 pm
Smalltalk lixo, o squeak é um lixo.
IDE escrota.
Se tivesse um ambiente mais normal essa linguagem tinha dado certo
11 de novembro de 2007 às 2:31 pm
O que de fato te incomoda no Squeak (além da interface gráfica, claro)?
De quais recursos você sente falta nele - ou em outros ambientes Smalltalk?
Eu particularmente discordo do que você disse. A realidade é que, mesmo considerando o pouco que aprendi a respeito da linguagem e de seus ambientes, eu ainda estou para ver ambientes tão poderosos quanto os disponíveis para Smalltalk. De fato, se a linguagem não “virou”, os motivos certamente são outros.
Mas enfim… não se incomode em permanacer anônimo nesta discussão, mas seria mais interessante se você nos expusesse argumentos que apoiam suas afirmações.
26 de dezembro de 2007 às 3:07 pm
O Squeak é realmente muito interessante. A IDE não é escrota mas, realmente, uma das deficiências é a “mania” da comunidade Smalltalk em associar a aplicação ao ambiente de desenvolvimento (coisa absolutamente desnecessária).
Mas eu creio que os fatores que levaram o Smalltalk a ainda não virar são outros:
* Falta de uma documentação decente
* Necessidade de padronização nas “bibliotecas” de objetos
* Marketing à altura do realizado pela Sun para o Java
Os críticos do Smalltalk e entusiastas do Java procuram esconder que a VM do Java é um lixo (desempenho, escalabilidade, consumo de memória, etc… etc… etc…) o que implica na inexistência de grandes aplicações usando esta tecnologia. E isto com grandes empresas (como a Oracle) patrocinando desenvolvimento na plataforma.
Ao contrário, existem diversas aplicações de médio/grande porte desenvolvidas utilizando o Smalltalk da Cincom em ambiente comercial.
26 de dezembro de 2007 às 3:18 pm
Só extendendo um pouco mais, o fato do Smalltalk ser atrelado a um “ambiente” gráfico próprio é que em seu início as interfaces de usuário eram deficientes e tal “ambiente” supria muitas das deficiências.
Lembrem-se que por volta de 1984 o “Windows” não tinha superposição de janelas e a portabilidade entre ambientes Microsoft e Apple (para não falar de outros sistemas da época que “entraram para a história” como CPM) era inexistente.
Hoje com as padronizações e portabilidades entre Windows, X-11 e Aqua e com a multitude de recursos oferecidos, o atrelamento ao ambiente oferecido pelo IDE é desnecessário.
Mas a comunidade Smalltalk é um tanto quanto “messiânica”…