Scala vs. Groovy vs. Clojure [fechado]

676

Alguém pode explicar as principais diferenças entre Scala, Groovy e Clojure. Conheço cada uma dessas compilações para executar na JVM, mas gostaria de uma comparação simples entre elas.

James Fassett
fonte

Respostas:

873

Groovy é uma linguagem de tipo dinâmico, cuja sintaxe está muito próxima do Java, com várias melhorias de sintaxe que permitem código mais leve e menos clichê. Ele pode ser executado através de um intérprete, além de ser compilado, o que o torna bom para prototipagem rápida, scripts e aprendizado de linguagens dinâmicas sem precisar aprender uma nova sintaxe (supondo que você conheça Java). A partir do Groovy 2.0, ele também tem suporte crescente à compilação estática . O Groovy suporta fechamentos e suporta programação em um estilo um pouco funcional, embora ainda esteja bastante longe da definição tradicional de programação funcional.

Clojure é um dialeto do Lisp com alguns recursos avançados, como Memória Transacional de Software . Se você gosta do Lisp e gostaria de usar algo parecido na JVM, o Clojure é para você. É possivelmente a linguagem mais funcional em execução na JVM, e certamente a mais famosa. Além disso, ele enfatiza mais a imutabilidade do que outros dialetos Lisp, o que o aproxima do coração dos entusiastas da linguagem funcional.

Scala é uma linguagem totalmente orientada a objetos, mais do que Java, com um dos sistemas de tipos mais avançados disponíveis em linguagens que não são de pesquisa e, certamente, o sistema de tipos mais avançado na JVM. Ele também combina muitos conceitos e características das linguagens funcionais, sem comprometer a orientação do objeto, mas seu comprometimento com as características da linguagem funcional afasta alguns entusiastas desta última.

O Groovy tem boa aceitação e um framework web popular no Grails. Ele também alimenta o sistema de compilação Gradle, que está se tornando uma alternativa popular ao Maven. Pessoalmente, acho que é uma linguagem com utilidade limitada, especialmente quando o Jython e o JRuby começam a fazer incursões no território da JVM, em comparação com os outros.

Clojure, mesmo descontando alguns recursos muito interessantes, tem um forte apelo por ser um dialeto Lisp na JVM. Isso pode limitar sua popularidade, garantido, mas espero que tenha uma comunidade leal por muito tempo.

O Scala pode competir diretamente com o Java e concorrer a dinheiro em quase todos os aspectos. Não pode competir em popularidade no momento, é claro, e a falta de um forte apoio corporativo pode impedir sua aceitação nos ambientes corporativos. É também uma linguagem muito mais dinâmica que Java, no sentido de como a linguagem evolui. Do ponto de vista da linguagem, isso é uma coisa boa. Da perspectiva dos usuários que planejam ter milhares de linhas de código escritas, não é assim.

Como divulgação final, estou muito familiarizado com Scala, e só estou familiarizado com os outros dois.

Daniel C. Sobral
fonte
1
Agradável. Embora eu deva dizer que o Scala tem o apoio corporativo da Lightbend e é usado por grandes nomes como LinkedIn, Twitter, Spark e muitos bancos. Onde trabalho, temos uma base de código de 11 milhões de linhas do Scala, o que não é uma boa ideia, mas funciona.
Joan
219

Scala

O Scala evoluiu de uma linguagem funcional pura conhecida como Funil e representa uma implementação de sala limpa de quase toda a sintaxe do Java, diferindo apenas onde é possível fazer uma melhoria clara ou em que comprometeria a natureza funcional da linguagem. Essas diferenças incluem objetos singleton em vez de métodos estáticos e inferência de tipo.

Muito disso foi baseado no trabalho anterior de Martin Odersky com o idioma Pizza . A integração OO / FP vai muito além de meros fechamentos e levou à descrição do idioma como pós-funcional.

Apesar disso, é o mais próximo do Java de várias maneiras. Principalmente devido a uma combinação de suporte de OO e tipagem estática, mas também devido a um objetivo explícito no design da linguagem de que ele deve se integrar muito bem ao Java.

Groovy

Groovy aborda explicitamente duas das maiores críticas de Java por

  • sendo digitado dinamicamente, o que remove muitos clichês e
  • adicionando fechamentos ao idioma.

Talvez seja sintaticamente mais próximo do Java, não oferecendo algumas das construções funcionais mais ricas que Clojure e Scala fornecem, mas ainda oferecendo uma melhoria evolutiva definitiva - especialmente para escrever programas de scripts.

O Groovy tem o suporte comercial mais forte dos três idiomas, principalmente via springsource.

Clojure

Clojure é uma linguagem funcional da família LISP, também é digitada dinamicamente.

Recursos como o suporte ao STM oferecem o melhor suporte de simultaneidade pronto para uso, enquanto o Scala exige uma biblioteca de terceiros como a Akka para duplicar isso.

Sintaticamente, também é a mais distante das três linguagens do código Java típico.

Eu também tenho que divulgar que eu estou mais familiarizado com Scala :)

Kevin Wright
fonte
11
Eu nunca ouvi falar desse idioma do funil antes. Obrigado por preencher uma pequena lacuna no registro histórico.
Randall Schulz
8
Você realmente não pode chamar o Clojure de uma linguagem funcional pura . É certamente possível escrever um código imperativo.
precisa saber é o seguinte
2
O Scala foi criado na biblioteca Akka para simultaneidade baseada em ator. Já não é uma dependência de terceiros.
Scott M Gardner
2
@Orubel No bytecode, uma classe scala é idêntica à classe Java equivalente - todos os tipos. Como exemplo, toda a API do Akka Java é escrita em Scala. Então, por favor, explique o que você quer dizer com "não pode integrar" aqui - porque me parece um FUD.
Kevin Wright
3
Para resumir esse documento: "Os recursos do Scala que não existem em Java não podem ser usados ​​diretamente em Java". No entanto ... membros do tipo abstrato e tipos mais avançados são recursos bastante avançados que você certamente não é forçado a usar! O Java também não pode usar métodos sem parâmetros, construtores ou módulos de extensão do Groovy, tornando o Groovy "não totalmente integrado" por sua própria definição.
22615 Kevin
68

Eu nunca tive tempo de brincar com clojure. Mas para scala vs groovy, estas são as palavras de James Strachan - criador do Groovy

"Embora minha dica para a substituição a longo prazo de javac seja Scala. Estou muito impressionado com isso! Posso dizer honestamente se alguém me mostrou o livro Programming in Scala de Martin Odersky, Lex Spoon & Bill Venners em 2003. provavelmente nunca teria criado o Groovy ".

Você pode ler a história toda aqui

Thai Tran
fonte
72
Deve-se mencionar que esta declaração não está dizendo que o Scala é melhor que o Groovy. James também é conhecido por dizer que, se soubesse o quanto é difícil criar uma linguagem, nunca teria criado uma. Visto neste contexto, é claro por que ele não teria desenvolvido o Groovy, é claro. E ouso dizer que ele deu muitas boas idéias, mas ele não é o criador do Groovy atual. ele deixou o projeto muito antes do 1.0 em 2007 e não participa desde então. Há pelo menos tanto sem ele no projeto quanto havia com ele.
Blackdag
31
E dado que James Strachan está trabalhando ativamente na língua Kotlin, Scala aparentemente não é impressionante o suficiente para ele.
bdkosher
6
@bdkosher ele está trabalhando nisso porque o Scala é impressionante demais para a maioria dos programadores ... e [o mais importante,] em alguns lugares muito complicados também #
Exibir nome
30

Eles podem ser diferenciados de onde eles vêm ou quais desenvolvedores estão direcionados principalmente.

Groovy é um pouco como a versão de script do Java. Os programadores Java de longa data se sentem em casa ao criar aplicativos ágeis apoiados por grandes arquiteturas. Groovy on Grails é, como o nome sugere, semelhante ao framework Rails. Para pessoas que não querem se preocupar com a verbosidade do Java o tempo todo.

Scala é uma linguagem de programação funcional e orientada a objetos, e os programadores Ruby ou Python podem se sentir mais próximos dessa. Ele emprega muitas boas idéias comuns encontradas nessas linguagens de programação.

Clojure é um dialeto da linguagem de programação Lisp, para que os desenvolvedores Lisp, Scheme ou Haskell possam se sentir em casa enquanto desenvolvem com essa linguagem.

Mehmet Duran
fonte
24
Scala não é realmente uma linguagem de programação funcional. É uma linguagem de programação orientada a objetos primeiro, com recursos funcionais.
227 Daniel C. Sobral
16
Devo dizer que esta resposta parece muito com um tiro no escuro. Acho que é possível argumentar que o Python está mais próximo do Groovy do que do Scala, e Ruby (na minha opinião) não está muito próximo de nenhum dos itens acima, talvez mais próximo do Groovy. Haskell não é muito parecido com Lisp (comum) ou Scheme (e, portanto, não é muito parecido com Clojure). Para mim, essa resposta parece (na melhor das hipóteses!) Como "Eu também não sei, deixe-me ver a Wikipedia para você".
John Y
21
Scala é uma linguagem imperativa com alguns recursos funcionais. Se as pessoas continuarem a chamar uma linguagem funcional assim que ela adotar expressões do mundo funcional, o termo se tornará apenas mais um termo de marketing. É melhor começar a chamar C ++ de funcional e imperativo de Haskell.
jon-Hanson
9
@alanlcode Odersky pode dizer o que quer. O Scala não tem sistema para isolar efeitos colaterais, não é preguiçoso por padrão e não trata o código como dados - trata as chamadas de função como dados, o que é diferente. Esses são grandes problemas se você quiser ser totalmente funcional. Por outro lado, Scala faz todo o possível para garantir que seu Modelo de Objetos não seja falho. Eu amo Scala, mas é claramente funcional em segundo.
227 Daniel C. Sobral
7
Por outro lado, a família de idiomas ML é reconhecida como funcional, mas é rigorosa e permite efeitos colaterais / código imperativo.
GClaramunt 28/10/09
8

Estou lendo o livro Pragmatic Programmers "Groovy Recipes: Greasing the wheels of Java" de Scott Davis, Copyright 2008 e impresso em abril do mesmo ano.

Está um pouco desatualizado, mas o livro deixa claro que o Groovy é literalmente uma extensão do Java. Posso escrever código Java que funciona exatamente como Java e renomear o arquivo * .groovy e funciona bem. Segundo o livro, o inverso é verdadeiro se eu incluir as bibliotecas necessárias. Até agora, a experimentação parece confirmar isso.

Jim Collings
fonte
Esse é o melhor livro para aprender Groovy.
topr
Provavelmente é importante observar que nem todo código se comportará exatamente da mesma maneira. Algumas dessas diferenças incluem a maneira como o Groovy entende as aspas simples e duplas e sua preferência pelo boxe em detrimento do alargamento. A maioria dos códigos funcionará da mesma maneira.
Ontonator 28/09
4

Obviamente, a sintaxe é completamente diferente (o Groovy é o mais próximo do Java), mas suponho que não seja isso que você está pedindo.

Se você estiver interessado em usá-los para criar scripts para um aplicativo Java, o Scala provavelmente não é uma boa escolha, pois não há uma maneira fácil de avaliá- lo a partir do Java, enquanto o Groovy é especialmente adequado para esse fim.

Thilo
fonte
Não entendo seu ponto de vista sobre o uso do Scala para criar scripts em Java. Você certamente pode escrever um script Scala que conduz o código Java; não é evalnecessário.
Daniel Yankowsky
2
@ Daniel, veja a pergunta sobre o uso do Scala para scripts que eu vinculei. A resposta aceita é que a falta de um recurso "eval" e do suporte a javax.scripting torna mais difícil usar o Scala para criar scripts para um aplicativo Java e, por exemplo, no Groovy.
Thilo