Qual é o foco principal do Java? Por que demora tanto tempo para obter novos recursos?


10

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?


4
Tudo isso pode se transformar em uma guerra de fogo sobre o passado dos tempos do Java.
Michael K

5
The evidence suggests- compartilhe sua pesquisa.

2
Nenhum dos recursos em Java ou na JVM ou no JRE era novo. E mesmo a combinação de recursos não é nova, a Eiffel tinha todos esses em 1985 (GC, OO, segurança de tipo e até genéricos que Java não conseguiu até 2003). De fato, tem sido um objetivo expresso dos designers de Java não introduzir nada de novo.
Jörg W Mittag

2
@ MichaelK - eu concordo que isso poderia se transformar em uma guerra de chamas. Também pode se transformar em uma resposta válida em relação à desafiadora história da Sun; Aquisição da Sun e Java pela Oracle; e como os atuais mantenedores de Java estão tentando conduzir a linguagem. Minha esperança é que as respostas se concentrem nos aspectos construtivos desta questão.

@ MichaelT: Espero que não se transforme em uma guerra de chamas e que algumas idéias interessantes possam surgir. Por exemplo, geralmente assumimos que um idioma que não evolui constantemente está atrasado. Na IMO, isso não é verdade porque supõe que a evolução da linguagem é linear (que todos os novos recursos que se tornam populares são bons e devem ser adotados por todas as linguagens modernas). Mas os mantenedores de um idioma podem decidir que um novo recurso não se encaixa com o restante do idioma. Além disso, considere que existem linguagens padronizadas e estáveis ​​que definitivamente não estão atrasadas (por exemplo, Common Lisp).
Giorgio

Respostas:


12

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):

  1. O Java foi projetado como uma linguagem orientada a objetos sem funções, portanto, não era muito natural ter funções anônimas em uma linguagem sem funções. Ou pelo menos, isso teria influenciado muito o design da linguagem.
  2. As funções anônimas não eram populares nas comunidades de programadores que o Java deveria atrair (C, C ++, Pascal?). Mesmo agora, muitos programadores de Java parecem considerar esses recursos bastante exóticos (mas isso provavelmente mudará muito rapidamente com o Java 8).

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

  • a política original de estabilidade de linguagem e simplicidade de design, uma enorme base de códigos e comunidade de desenvolvedores, por um lado, e
  • a pressão de linguagens concorrentes que poderiam atrair programadores de Java, C # a princípio, e depois Scala, Clojure, F # (eu cito os que tenho conhecimento, pode haver outros).

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.


+1 E eu gostaria de poder lhe dar mais pontos, porque esta é a melhor resposta até agora para a pergunta.
edalorzo

Com base na sua resposta, investiguei mais sobre o que Mark Reinhold havia dito que encontrei um artigo interessante. Vou postá-lo aqui com sua resposta para referência futura: Closures for Java by Mark Reinhold .
edalorzo

E esse artigo na verdade se refere a esse outro Closures for Java .
edalorzo

11
No link que você enviou, encontrei este ibm.com/developerworks/java/library/j-jtp03048/index.html#4.0 , dizendo que o Java pode usar classes internas anônimas, mas elas são muito detalhadas. No entanto, o fechamento do Java 8 não é apenas um açúcar sintático para classes internas anônimas. Portanto, agora o Java terá DOIS (semântica) tipos diferentes de fechamento: classes internas anônimas e expressões lambda.
Giorgio

11

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).


"O Lisp pode ter lambda desde 1958, sua popularidade está no platô há décadas e apenas recentemente a programação funcional foi considerada seriamente na programação" mainstream ": a popularidade de uma linguagem não parece ser um bom indicador de sua eficácia. A programação funcional é defendida por muitos anos, mas a maioria das pessoas do setor considera o tipo de material com o qual os pesquisadores gostam de brincar para escrever sua tese de doutorado. Agora, de repente, a indústria está acordando e dando uma chance, talvez porque agora que a OOP esteja dominando eles estejam procurando a próxima grande novidade.
Giorgio

11
A razão pela qual os fechamentos não foram originalmente incluídos no Java de acordo com: Noções básicas sobre o debate sobre fechamentos . James Gossling disse: "Os fechamentos foram deixados de fora do Java inicialmente mais por causa da pressão do tempo do que qualquer outra coisa. Nos primeiros dias de Java, a falta de fechamentos era bastante dolorosa, e assim nasceram as classes internas: um compromisso desconfortável que tentava evitar uma série de problemas difíceis. Mas, como é normal em muitos problemas de design, as simplificações realmente não resolveram nenhum problema, apenas as mudaram. "
edalorzo

"A inclusão de lambdas em Java é discutida desde aquela época e só foi exacerbada pela tendência atual de programação funcional.": Acho interessante que em algumas comunidades (C ++, Java, ...) "usar lambdas" geralmente signifique " fazendo programação funcional ".
Giorgio

8

Evidentemente, nenhum desses recursos é novo no mundo da programação e isso surpreendeu por que todas essas coisas estão em Java até agora.

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.


11
OTOH, você também tem os ingredientes para padrões realmente fortes e amplamente aceitos. Contraste, por exemplo, o JPA com a situação do PHP, em que toda estrutura da web tem seu próprio ORM de meia-boca.
Michael Borgwardt 22/03

Posso estar errado, mas meu entendimento é que Haskell também é uma linguagem "design by commission" e é uma linguagem de ponta. Então talvez não seja isso que esteja impedindo o Java?
Andres F.

@AndresF. Sim, mas imagino que você não tenha grandes empresas monolíticas no comitê de Haskell. Veja também a conversa nos comentários aqui .
Robert Harvey

1

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.


Eu concordo com você (+1): eu valorizo ​​muito o Java (como linguagem e por seu imenso ecossistema), mas eu consideraria mais apropriado congelar a linguagem no Java 6. Não vou fazer nenhum esforço para aprender Java 7 ou 8, a menos que eu seja obrigado (algum projeto muito interessante no qual o Java 7 ou 8 seja obrigatório), prefiro gastar meu tempo aprendendo Scala e Clojure.
Giorgio
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.