Observei que o suporte ao IDE não é nem de longe tão bom, mas a própria linguagem suporta idiomas de programação funcional de maneira muito mais limpa.
Observei que o suporte ao IDE não é nem de longe tão bom, mas a própria linguagem suporta idiomas de programação funcional de maneira muito mais limpa.
Respostas:
Estou programando o Scala há mais de um ano, então tentarei me atrasar um ano para responder a essa pergunta.
Os pontos acima eram mais ou menos o que eu pensava em Scala antes de começar a aprender.
No decorrer de um ano, eis o que eu descobri:
Bem, acho que Scala é muito complexo. Parece C ++, pois ele tem uma infinidade de maneiras diferentes de fazer as coisas. Alguns chamariam isso de "riqueza", "expressividade" ou "poder", mas sua milhagem pode variar. Em muitos projetos do mundo real, você teria que limitar artificialmente quais recursos de idioma você usará e quais não, para que todos os desenvolvedores envolvidos pudessem falar o mesmo subconjunto do idioma.
Para programação funcional, prefiro o Clojure , que é bem mais simples que o Scala.
Que comece a guerra santa ;-)
Há cerca de um ano, quando fiquei cada vez mais frustrado com o futuro dos produtos da minha startup, se continuasse a usar Java, decidi experimentar o Scala. Eu já estava programando em JavaScript e Python na época, Ruby também era uma boa alternativa, mas estava procurando uma linguagem de tipo estaticamente, de preferência uma que pudesse ser executada na JVM.
Eu realmente tentei gostar de Scala, mas realmente achei o código totalmente feio e difícil de entender. Eu me perguntei dramaticamente que, se Scala era nossa melhor resposta para Java, certamente estava ferrado e condenado a continuar trabalhando com uma linguagem que eu não gostava, afinal ...
Felizmente, não muito tempo depois, descobri o Fantom . Oh cara, eu adorei! Para mim, foi como a resposta do esplendor americano à burocracia alemã! Ele correspondia aos requisitos que eu procurava no Scala, mas com muito mais elegância . Tinha integração com Vim , Eclipse e Netbeans , uma boa estrutura da Web , produtos maduros em execução, uma comunidade pequena, mas incrivelmente útil ... Digitação dinâmica e estática! Eu me alegrei!
(Eu poderia continuar, mas este post deve ser sobre Scala, e não Fantom, por isso paro aqui. Minha preferência é clara , no entanto, há este post comparando os dois. Eu nunca conseguia entender por que o Fantom recebe tão pouca atenção quando comparado ao Scala. Mas, aparentemente, eu não sou o único, se você ouvir este podcast [ mp3 ] até o final.)
Quando me envolvi inicialmente com Scala há 2 anos, parecia estranho e intimidador para mim. Em algum momento, descobri que a linguagem principal é realmente muito mais simples que Java, mas sua sintaxe e semântica são tão flexíveis que você pode criar novas construções de linguagem como essa, mesmo sem um recurso de macro. Desde então, mudei completamente para o Scala para todos os meus projetos Java, porque ele me permite escrever sem muito código clichê.
Eu gosto do Clojure, mas há situações em que a plataforma precisa que você compile no bytecode estático (Android, applets, ...) e enquanto você pode fazer isso, no Scala, está lá.
Embora o Scala permita que você resolva muitos problemas de maneira funcional, geralmente encontro problemas em que o uso de classes parece mais natural. Isso torna as coisas um pouco mais complexas, mas nem de longe as complexidades e dores do C ++.
A maior vantagem para mim, quando eu realmente comecei a aprender a linguagem, foi que eu poderia programar exatamente como eu fiz em Java, sem o barulho (um pouco como quando você inicia o Groovy), mas eventualmente você quer tentar mergulhar mais fundo no poder da língua - cresce com você.
Sobre a pergunta do IDE: Depois de usar o Emacs para tudo, todos os meus problemas de IDE desapareceram :-)
Gosto de Scala por muitas razões, mas há uma que é frequentemente esquecida: sua simplicidade.
Scala pode não ser tão simples quanto, digamos, Oberon, mas é muito mais simples do que algumas outras línguas. A Scala Language Specification é ~ 160 páginas, a Java Language Specification é ~ 600 (apenas o idioma, não a JVM ou as bibliotecas!), A ECMA-334 C # Language Specification (que AFAIK corresponde a um subconjunto do Visual C # 2.0) é ~ 440 páginas (isso não inclui coisas como compreensão de consultas LINQ, expressões lambda, métodos de extensão, co-violação e contravariância genéricas dynamic
, argumentos opcionais com valores padrão, argumentos de palavras-chave var
). Até o rascunho atual do ECMAScript 5.1 é maior em ~ 210 páginas. E, claro, minha própria linguagem "padrão", Ruby, cujo atual rascunho ISO pesa em ~ 310 páginas, que apenas especificam um subconjunto quase inusitavelmente pequeno da interseção do Ruby 1.8.6, 1.9.1 e 1.9.2.
Aqui está o que é péssimo em Scala:
O ponteiro nulo era uma péssima idéia para começar. Hoare chamou seu "erro de bilhão de dólares", mas Scala é ainda pior. Possui objetos nomeados nulo, Nulo, Nenhum e Nulo. null é para interoperabilidade com Java. Nulo é a especificação DOM do W3C do ponteiro nulo, Nenhum é o que nulo deveria ter sido substituído e Nil é algo vazio.
Quando as construções de linguagem se tornam hacky, geralmente é o programador quem deve culpar, e não a linguagem. No Scala, no entanto, a linguagem principal já contém classes de biblioteca cujo único comportamento documentado é "Isso é um hack". Não acredita nisso? Pesquise no scaladoc por scala.xml.Group.
Por último, não menos importante, Scala está mal documentado. Quase nenhuma das classes scala na documentação oficial vem com código de exemplo. O Scala é significativamente mais difícil de aprender que o Java e requer profundo conhecimento em ciência da computação.
Para evitar ser confundido com um odiador de Scala, aqui está o que eu amo sobre isso:
null
é o ponteiro nulo de Java, Null
é o "tipo" dele. None
é um "estado" possível de Option[T]
uma coleção com um ou zero elementos. Nil
é uma lista vazia. Embora você queira parecer assustador, não é. Esses tipos não são substituíveis ou intercambiáveis entre si e se comportam exatamente como deveriam.
Scala é complexo. De jeito nenhum! Sua sintaxe é extremamente flexível e pode ser personalizada de várias maneiras (acima de todos os operadores / notação infix) - e o sistema de tipos tem mais recursos diferentes do que qualquer outro idioma que eu conheça.
Portanto, as coisas não são tão corretas como, por exemplo, em Haskell: Typeclasses para cobrir todos eles.
Como o Scala tenta reunir programação funcional, OO, programação procedural e bibliotecas java, além de idéias próprias, finalmente acabamos com muitos conceitos que de alguma forma parecem "ir na mesma direção":
Escolher entre eles parece difícil no começo e pode-se facilmente perguntar se encontrou a solução correta para algum problema. É facilmente possível produzir coisas hacky abusando de implicit
s.
Mas o interessante é: Scala funciona. Às vezes, é difícil entender por que (especialmente descobrir através de quais conversões implícitas + herança + ... algum objeto tem funcionalidade X
), mas você não precisa se preocupar com isso na maioria das vezes.
Escreva Scala o mais direto possível e funcionará. Não se confunda com tudo o que é possível e use apenas o que você precisa. E se você precisar de algo, pode ter certeza de que, de alguma forma, Scala o possui;)
E quanto melhor você obtiver, mais poderá personalizar o Scala com operadores, implícitos, mônadas, sintaxe descolada ... e finalmente obter algo próximo a uma DSL que resolverá perfeitamente o seu problema.
Afinal, você sempre tem a possibilidade de usar o Scala como um Java muito melhor, com sintaxe mais limpa e fácil, inferência de tipos e alguns recursos funcionais.
É uma excelente linguagem que é mais simples que Java de várias maneiras.
A maioria das pessoas não gosta, programador Java ou não, pelas mesmas razões que a maioria, programador ou não, não gosta de aprender novas linguagens de programação. Eu suspeito que a maioria das pessoas que aprendeu uma linguagem de programação nem gostava de aprender isso.
Se você está preocupado com uma linguagem tão complicada quanto o C ++, eu evitaria o Clojure como uma praga. Lamentar que Scala seja mais complicado que Clojure se tornou o argumento de retorno para pessoas que são completamente ignorantes em relação a um ou ambos os idiomas.
O Clojure possui macros, o que significa que você pode alterar a sintaxe da linguagem o quanto quiser, fornecendo não apenas "uma infinidade de maneiras diferentes de fazer as coisas", mas um número quase infinito de maneiras de fazer as coisas. E nenhuma dessa nova sintaxe que os programadores estão criando com as macros será documentada em qualquer lugar da especificação da linguagem.
"Mas podemos evitar o uso de macros ou regular quais são permitidas em nosso código", você diz. Parabéns, agora você está tendo "de limitar artificialmente quais recursos de idioma você usará e o que não usará", que é exatamente o que os idiotas tagarelas que estão usando Clojure of Scala usaram como razão para evitar o Scala para começar.
Eu realmente gosto dos tipos mais granulares da biblioteca Scala. Parece que a nova biblioteca de coleções foi bem pensada. Também gosto de como ele reduz a quantidade de código necessária para classes simples e os conceitos funcionais que ele adiciona. Sua inferência de tipo também é muito útil. Parece Java sem as rodinhas. Depois de usar o C # por um tempo, o Scala realmente parece um concorrente, com o Java ainda útil, mas sendo deixado para trás.
Como programador Java, inicialmente achei o Scala interessante. No entanto, depois de mexer com ele por um tempo (e deparar com quase todos os aspectos positivos / negativos já listados por outros), fiquei me sentindo muito "meh" em relação a isso. As melhorias de idioma são compensadas pela menor disponibilidade de conjuntos de ferramentas. Eu simplesmente não conseguia pensar em nenhuma razão para mudar. É bom, mas não é "melhor o suficiente" para defender a mudança. Também não possui esse fator de excitação subjetiva (como Clojure parece ter).