Quais são as principais diferenças entre Scala e Groovy? [fechadas]

128

Na superfície, Groovy e Scala parecem muito semelhantes, além de Scala ser digitado estaticamente e dinâmico Groovy.

  • Quais são as outras principais diferenças e vantagens que cada uma tem sobre a outra?
  • Quão parecidos eles são realmente?
  • Existe concorrência entre os dois?
    • Se sim, quem você acha que vencerá a longo prazo?
Leif
fonte
Groovy 2.0 também inclui tipagem estática: infoq.com/articles/new-groovy-20
HDave

Respostas:

230

Ambas são linguagens orientadas a objetos para a JVM que possuem lambdas e fechamentos e interoperam com Java. Fora isso, eles são extremamente diferentes.

O Groovy é uma linguagem "dinâmica", não apenas no sentido de que é digitada dinamicamente, mas também em suporte a metaprogramação dinâmica.

Scala é uma linguagem "estática", pois é digitada estaticamente e praticamente não possui metaprogramação dinâmica além das coisas desajeitadas que você pode fazer em Java. Observe que o sistema de tipo estático do Scala é substancialmente mais uniforme e sofisticado que o do Java.

O Groovy é influenciado sintaticamente por Java, mas semanticamente influenciado mais por linguagens como Ruby.

Scala é sintaticamente influenciado por Ruby e Java. É semanticamente influenciado mais por Java, SML, Haskell e uma linguagem OO muito obscura chamada gBeta.

O Groovy possui despacho múltiplo "acidental" devido à maneira como lida com a sobrecarga de Java.

O Scala é apenas de despacho único, mas possui correspondência de padrões inspirada em SML para lidar com alguns dos mesmos tipos de problemas que o despacho múltiplo deve tratar. No entanto, onde o despacho múltiplo só pode despachar no tipo de tempo de execução, a correspondência de padrões do Scala pode despachar nos tipos, valores ou ambos de tempo de execução. A correspondência de padrões também inclui ligação variável sintaticamente agradável. É difícil enfatizar quão agradável esse recurso único torna a programação no Scala.

O Scala e o Groovy suportam uma forma de herança múltipla com mixins (embora Scala os chame de características).

O Scala suporta aplicativos de funções parciais e curry no nível da linguagem, o Groovy possui um método "curry" estranho para executar aplicativos de funções parciais.

Scala faz otimização direta da recursão da cauda. Não acredito que o Groovy acredite. Isso é importante na programação funcional, mas menos importante na programação imperativa.

Scala e Groovy são avidamente avaliados por padrão. No entanto, o Scala suporta parâmetros de chamada por nome. O Groovy não - chamada por nome deve ser emulada com fechamentos.

O Scala tem "para compreensões", uma generalização das compreensões de lista encontradas em outros idiomas (tecnicamente são compreensões de mônada mais um pouco - em algum lugar entre o fazer de Haskell e o LINQ do C #).

O Scala não tem conceito de campos "estáticos", classes internas, métodos etc. - ele usa objetos singleton. Groovy usa o conceito estático.

A Scala não construiu na seleção de operadores aritméticos da mesma maneira que o Groovy. No Scala, você pode nomear métodos de maneira muito flexível.

Groovy tem o operador elvis para lidar com null. Os programadores do Scala preferem usar os tipos Option ao usar null, mas é fácil escrever um operador elvis no Scala, se você quiser.

Finalmente, existem mentiras, existem malditas mentiras e, depois, há referências. O jogo de benchmarks de linguagem de computador classifica o Scala como sendo substancialmente mais rápido que o Groovy (variando de duas a 93 vezes mais rápido), mantendo aproximadamente o mesmo tamanho de fonte. benchmarks .

Tenho certeza de que existem muitas, muitas diferenças que não cobri. Mas espero que isso lhe dê uma essência.

Existe uma competição entre eles? Sim, é claro, mas não tanto quanto você imagina. A verdadeira concorrência de Groovy é JRuby e Jython.

Quem vai ganhar? Minha bola de cristal está tão quebrada quanto a de qualquer outra pessoa.

James Iry
fonte
21
que seria uma vitória para ambos, se pode-se obter universidades para começar a ensinar línguas em vez de apenas java =)
Chii
13
A imutabilidade não é uma característica fundamental do Scala? E a concorrência e os atores? Conte-nos um pouco mais ...
Leonel
4
Se houver alguma competição, seria com Clojure, mas Clojure não está interessado em competição.
21411 Rayne
2
Dado que o Scala usa o mesmo método de despacho estático do tipo java (que o ponto de acesso pode ser facilmente incorporado) e o groovy faz o despacho dinâmico do método, será realmente difícil para o Groovy se aproximar do desempenho do Scala. Particularmente com o @specialised para otimizar a caixa automática de java, o Scala pode ser mais rápido que o java às vezes. No entanto, o caso de uso do Groovy é semelhante ao uso do Ruby / Python - é uma linguagem de script de tipo dinâmico e fácil de usar, na qual o desempenho normalmente não é um problema. por exemplo, muitos frameworks Groovy conter uma tonelada de código Java para o desempenho (como Grails)
James Strachan
4
Como esta resposta tem muitos votos, há uma parte que gostaria de corrigir. É certo que os multimétodos baseados em herança no Groovy começaram como acidente, mas em uma Groovy Developers Conference, que incluiu James e muito antes do Groovy 1.0, decidimos manter isso. Não teria sido difícil mudar isso. Também a acrescentar ao que James escreveu ... invokedynamic derrubou essa barreira que está falando
blackdrag
12

O scala deve ser uma linguagem híbrida funcional / oo e é muito bem planejado e projetado. groovy é mais como um conjunto de aprimoramentos que muitas pessoas gostariam de usar em java. olhei mais de perto para os dois, para que eu saiba :)

nenhum deles é melhor ou pior que o outro. groovy é muito bom em metaprogramação, scala é muito bom em tudo que não precisa de metaprogramação, então ... eu costumo usar os dois.

hamsterofdeath
fonte
11

A Scala possui atores, que facilitam a implementação da concorrência. E traços que dão herança múltipla verdadeira e segura.

jasonnerothin
fonte
9
Para referência futura, o Groovy também usa GPars ou Akka.
Xorlev 28/11/2012
4
Para referência futura, o mesmo acontece com Groovy através de traços
vicsz
7

Você acertou na cabeça com a digitação estática e dinâmica. Ambos fazem parte da nova geração de linguagens dinâmicas, com fechamentos, expressões lambda e assim por diante. Também existem algumas diferenças sintáticas entre os dois, mas, funcionalmente, não vejo uma grande diferença entre Groovy e Scala.

Scala implementa Listas um pouco diferente; no Groovy, praticamente tudo é uma instância do java.util.List, enquanto o Scala usa Lists e matrizes primitivas. Groovy tem (eu acho) melhor interpolação de strings.

Scala é mais rápido, ao que parece, mas o pessoal do Groovy está realmente pressionando o desempenho para a versão 2.0. O 1.6 deu um enorme salto de velocidade em relação à série 1.5.

Não acho que nenhum dos idiomas realmente 'vença', pois tem como alvo duas classes diferentes de problemas. Scala é uma linguagem de alto desempenho que é muito parecida com Java, sem ter o mesmo nível de clichê que Java. O Groovy é para prototipagem e desenvolvimento rápidos, onde a velocidade é menos importante do que o tempo necessário para os programadores implementarem o código.

Don Werve
fonte
3
"O Groovy é para prototipagem e desenvolvimento rápidos" - isso sugere que o Groovy não é adequado para uso em produção com o qual eu discordo. Existem muitos sites Grails em uso de produção, por exemplo
Dónal 17/07/2009
10
Scala não é uma linguagem dinâmica.
John Oxley
2
"O Groovy tem (acho) melhor interpolação de cordas." - com o Scala-2.10.0, isso não é mais verdade (o Scala obteve uma interpolação legal de cordas).
VasiliNovikov 01/08/13
5

Scala tem uma curva de aprendizado muito mais íngreme que o Groovy. O Scala tem muito mais suporte para programação funcional com sua correspondência de padrões e recursão baseada em cauda, ​​o que significa mais ferramentas para FP puro.

Mais de cinco
fonte
0

O Scala também possui compilação dinâmica e eu fiz isso usando o twitter eval lib ( https://github.com/twitter/util ). Eu mantive o código scala em um arquivo simples (sem nenhuma extensão) e usando a classe scal eval criada em tempo de execução. Eu diria que scala é meta-programação e tem característica de complicação dinâmica

Veerbhan Tahlani
fonte