Eu tenho explorado os novos recursos do JDK8, como as expressões lambda, os métodos de extensão e a nova API de fluxo.
Evidentemente, nenhum desses recursos é novo no mundo da programação e isso surpreendeu por que todas essas coisas estão em Java até agora.
Tivemos expressões lambda em Lisp (1958), SML (1973), Haskell (1990), Python (1991), JavaScript (1994), Ruby (1995), Scala (2003), C # (2007) e 55 anos após Lisp e praticamente todo mundo, em Java (2013).
E eu tinha lido sobre fluxos na SIC (1996).
Eu tenho me perguntado por que agora? A evidência sugere que competir com outras línguas não é a motivação.
Parece que todos os novos recursos interessantes desta versão do Java são apenas um subproduto da implementação do paralelismo. Temos lambdas porque eles simplificam os algoritmos de escrita paralela e temos métodos de extensão porque precisávamos deles para dar suporte às mudanças que as expressões lambda exigiam, etc., etc.
Então, minha pergunta é: podemos afirmar com segurança que o tópico principal nesta próxima versão do Java é realmente paralelismo? Ou podemos justificar outras razões para o aparecimento dos truques mais antigos do livro até agora em Java?
fonte
The evidence suggests
- compartilhe sua pesquisa.Respostas:
Quando o Java foi projetado, foi considerado apropriado excluir funções anônimas. Eu posso pensar em duas razões (mas elas podem ser diferentes das oficiais):
Nos anos seguintes, como Robert Harvey explicou, a política da Sun era sempre manter o Java compatível com versões anteriores e muito estável.
Por outro lado, surgiram outras linguagens concorrentes (a mais importante é o C #, que nasceu como um clone de Java e depois seguiu sua própria direção de desenvolvimento).
As linguagens concorrentes pressionaram o Java por dois motivos:
Poder expressivo
Novos recursos podem facilitar a escrita de certos idiomas de programação, tornando a linguagem mais atraente para os programadores. Normalmente, o conjunto de recursos fornecidos por uma linguagem é um compromisso entre poder expressivo, complexidade da linguagem e coerência do projeto: adicionar mais recursos torna a linguagem mais expressiva, mas também mais complexa e difícil de dominar.
De qualquer forma, nos últimos anos, os concorrentes do Java adicionaram muitos novos recursos que o Java não possuía, e isso pode ser considerado uma vantagem.
Hype
Sim, infelizmente, esse é um fator na escolha da tecnologia, pelo menos pelo que posso ver na minha experiência diária como programador: uma ferramenta deve ter um determinado recurso, mesmo que a maioria dos membros da equipe não saiba como usá-la e aqueles que poderiam usá-lo não precisam disso na maioria das vezes.
O hype pode ser ainda mais importante para pessoas não técnicas, como gerentes, que podem decidir quem é a plataforma para um determinado projeto. Às vezes, os gerentes só lembram algumas palavras-chave como lambda, paralelismo, multicore, programação funcional, computação em nuvem, ... Se nossa tecnologia de escolha tem uma marca verde em cada item da lista, estamos atualizados.
Então, por algum tempo, o IMO Java foi capturado entre
Eventualmente, a Oracle decidiu atualizar o Java para torná-lo mais competitivo. Na minha opinião, os novos recursos tratam especialmente de programadores Java que podem ser tentados a mudar para C # e que veem outras linguagens como Scala e Clojure como muito diferentes de Java. Por outro lado, os desenvolvedores que têm alguma experiência com programação funcional e ainda desejam usar a JVM provavelmente já mudaram para Scala, Clojure ou outro idioma.
Portanto, os novos recursos do Java 8 tornarão o Java mais poderoso como linguagem e o foco declarado é a programação simultânea e paralela, mas a atualização parece abordar também os aspectos de marketing (Mark Reinhold, arquiteto chefe de Java da Oracle, disse: "Alguns diriam digamos que adicionar expressões Lambda é apenas para acompanhar as crianças legais, e há alguma verdade nisso, mas o verdadeiro motivo são processadores com vários núcleos; a melhor maneira de lidar com eles é com o Lambda ", consulte este artigo ).
Portanto, sim, muitos (todos) os recursos do Java 8 já eram bem conhecidos, mas por que e quando um recurso é adicionado a uma linguagem depende de muitos fatores: público-alvo, comunidade existente, base de código existente, concorrentes, marketing etc.
EDITAR
Uma breve observação sobre "... eu tinha lido sobre fluxos na SIC (1996).": Você quer dizer que precisa do Java 8 lambdas para implementar fluxos? Na verdade, você pode implementá-los usando classes internas anônimas.
fonte
Java mudou de foco com o tempo. Inicialmente, foi projetado como uma linguagem simples e poderosa, como uma reação ao C ++ "complexo poderoso". Alguns recursos que estavam em C ++ foram intencionalmente deixados de fora, como sobrecarga de operador, modelos, enumerações que eram consideradas muito complicadas ou relíquias da era C e o POO estava no auge de sua popularidade, tudo foi transformado em um objeto visão de mundo paradigma. Neste momento, as lambdas foram consideradas simplesmente "desnecessárias" desde a introdução de classes internas / anônimas no Java 1.1. O fato de a sintaxe ser muito mais detalhada era quase considerado um recurso .
Como o Java encontrou seu público, não havia incentivo para mudar até a introdução do C # pela Microsoft, que aprendeu com as lições dos erros de design do Java, e lançou uma série de novos recursos de linguagem. Eles não foram limitados pela compatibilidade com versões anteriores. Eu acho que os conceituadores de Java perceberam o perigo da concorrência em C # e lançaram o Java 5 com genéricos, enumerações, etc.
A inclusão de lambdas em Java é discutida desde aquela época e só foi exacerbada pela tendência atual de programação funcional. Mas coisas como essas demoram para corrigir, e isso deve ser correto da primeira vez. Na minha opinião, o Java danificou os genéricos com apagamento de tipo porque a compatibilidade com versões anteriores foi considerada um motivo para implementá-lo como não mais que açúcar sintático. Aparentemente, o fechamento foi pensado com mais detalhes, e será mais do que apenas açúcar sintático.
Em conclusão, qual é o tópico principal do Java 8? Eu não acho que uma versão de idioma tenha um tópico. Como o C ++ 11, a razão de ser do Java 8 é acompanhar a concorrência, introduzindo na linguagem o que cada vez mais programadores estão dando como certo agora. O Lisp pode ter lambda desde 1958, sua popularidade se eleva há décadas e apenas recentemente a programação funcional foi considerada seriamente na programação "mainstream" (por falta de uma palavra melhor).
fonte
Como o Java precisa passar por um processo de aprovação que envolve várias partes interessadas de alta visibilidade em um processo semelhante ao "design por comitê", e esse processo leva tempo, isso é tudo.
Compare isso com outros idiomas e você encontrará um ditador benevolente ou um pequeno comitê de designers de idiomas que trabalham em conjunto e não estão vinculados aos interesses corporativos.
Combine isso com uma base de código estabelecida de milhões de linhas de código Java que deve permanecer compatível com versões anteriores e você terá todos os ingredientes para mudar em um ritmo glacial.
fonte
Eu diria que o objetivo mais importante de uma linguagem de programação deve ser usado; atualmente C e Java não têm expressões lambda e são as linguagens mais usadas (de acordo com o TIOBE, por exemplo).
E para responder à pergunta, acredito que o Java é dirigido à empresa; nesse domínio, as coisas precisam ser muito estáveis e confiáveis; por exemplo, o Java 7 aparece há quase 2 anos e ainda não conheço nenhum projeto diretamente no Java 7. Outra coisa importante é a compatibilidade com versões anteriores, que é muito importante para a empresa.
fonte