Seguindo a idéia do post passado, segue um post para aguçar a discussão sobre linguagens, segue algumas comparações entre as duas linguagens, seguindo as características mencionadas no post anterior.
Obs: A conclusão do post não fica em cima do muro =)
- Performance
Java ? Scala: Código de Scala é convertido para bytecodes que são executados pela JVM, mas sempre tem um pequeno código adicional que afeta um pouco a performance, mas nada comparado com Groovy que é interpretada. Desta forma, apenas para não ser injusto com Java, vale a pena enfatizar isso, mas não é nada significante para deixar de usar em um ambiente de produção. Um ponto positivo de Scala é que o suporte a processadores multi-core existe, por isso programas paralelos em Scala tem potencial para serem mais rápicos que em Java.
- Produtividade
Java > Scala: A sintaxe de Scala torna a linguagem muito mais produtiva que Java, por outro lado as ferramentas e IDEs de Java até o momento propiciam uma maior produtividade, por isso por enquanto Java ainda é mais produtiva.
- Sintaxe bonita
Scala > Java: Scala é uma linguagem com tipagem estática esperta, que minimiza a escrita de definição de tipos quando possível. Ao contrário de Java, que é verbosa e repetitiva, compare os exemplos abaixo:
Java: Aluno aluno = new Aluno
Scala: aluno = new Aluno ou aluno:Aluno = _
Java: String string = "x"
Scala: string = "x"
- Boas IDEs
Java > Scala: O plugin do Eclipse para Scala está muito bugado, mas é questão de tempo para que ele fique estável, pois existe um time muito ativo na comunidade. Os plugins do Eclipse também não estão estáveis, por exemplo o arcabouço do JUnit que é super estável em Java, para Eclipse não funciona muito bem. Já o TestNG tem um melhor suporte no momento. O JUnitMax ainda não funciona para Scala, mas ainda está em versão Alpha mesmo para Java.
O NetBeans e o Intellij tem um suporte muito bom a Scala, bem melhor que do Eclipse, mas com certeza não estão tão estáveis quanto o suporte a Java. Mas novamente, questão de tempo para obter a estabilidade das IDEs de Java.
- API completa, extensível e fácil de usar
Scala > Java: Scala possui uma API extra, além de suportar toda API do Java, desta forma não tem como Scala ficar para trás.
- Ferramentas e Frameworks produtivos e completos
Java > Scala: Suas aplicações Web escritas com Lift rodam em cima de um Tomcat ou JBoss tranquilamente. Por outro lado, JPA, arcabouços de mocks, JUnitMax etc, não funcionam com Scala ou exigem alguns cuidados e adaptações. Por isso, temporariamente, Scala ainda tem um défict em relação a estabilidade das ferramentas e frameworks de Java.
- Suporte a orientação a objetos
Scala > Java:
- Scala obriga a escrita de override (em Java a opcional anotação @Override), obrigando esta boa prática de programação OO.
- Scala subistitui a noção de Interface com Trait, que é uma Interface mais poderosa, que aceita implementação, como uma classe abstrata. Com traits é possível escrever uma Interface, já com Interface não é possível escrever traits. Desta forma, o suporte a herança múltipla em Scala é mais rico que em Java, sem o problema do Diamante em herança múltipla.
- Como Java, Scala também possui suporte a generics.
- Em Scala é possível escrever mais de uma classe pública em um mesmo arquivo. Isto é útil para evitar infinitos arquivos para aqueles casos que temos que escrever diversas classes pequenas (que algumas vezes pode indicar um erro de design).
- Scala não possui switch, que estimula a escrita na forma de programação modular.
- Scala não possui métodos estáticos, que complicam o uso de mocks e atrapalham muitas vezes o design da aplicação.
- Suporte a orientação a aspectos
Java > Scala: Devido a estabilidade do AspectJ em Java.
- Suporte a programação funcional
Scala > Java: Java ainda não suporta blocos. A escrita de blocos a partir de classes anônimas em Java é muito precário. Já Scala possui suporte nativo a programação funcional.
- Suporte a reflexão
Scala ?<>? Java: Scala não possui a palavra reservada class. Temos que usar getClass como em Java ou classOf[], Ponto chato é que para instanciar classes em Scala é necessário adicionar o termo $class, que suja o código. De resto, não conheço alguma grande vantagem ou desvantagem, alguém já estudou isso?
- Tipagem estática ou dinâmica ou as duas
É possível rodar Scala com JRuby ou Jython, mas não com a estabilidade de Java, então se preferir unir os dois paradigmas, ainda Java é preferível sobre Scala. Mas pensando apenas em tipagem estática, Scala supera Java já que sua sintaxe é muito mais inteligente, ou não verbosa como a de Java.
- Bom suporte a programação concorrente ou paralela
Scala > Java: Java trabalha com threads enquanto Scala com atores, como Erlang. Criar threads é muito mais barato do que criar Processos no SO, por isso muitas linguagens trabalham com threads. Por outro lado, com threads não é possível aproveitar todo potencial que os novos processadores multi-core possuem. Por isso Scala trabalha com Mini-Processos, que são mais leves que os processos tradicionais e possibilitam o aproveitamento dos vários processadores da máquina.
- Interpretada ou compilada
Scala = Java: Código em Scala é convertido em bytecodes, como Java. Existem compiladores pagos para bytecodes, mas não importa de qual linguagem veio.
- Multi-plataforma
Scala = Java: Todos os SOs que JVM suporta.
- Código aberto
Scala > Java: Scala já nasceu com o código aberto, isto deve agilizar sua evolução desde o princípio, assim como aconteceu com Ruby.
Conclusão: Apesar de todos benefícios de Scala sobre Java, até o momento, ainda é preferível utilizar Java em um ambiente real de produção, mas isto pode mudar drásticamente nos próximos meses, por isso, quem gosta de linguagem com tipagem estática já pode ir estudando e fuçando Scala para chegar com tudo =)
No comments:
Post a Comment