O último dia do JavaOne 2014 trouxe uma extensa discussão da comunidade (Community Keynote) apresentando um material técnico que foi omitido da abertura principal. Desde então, aquelas ideias apresentadas evoluíram consideravelmente. O InfoQ.com chamou Brian Goetz (arquiteto da linguagem Java) e John Rose (arquiteto da JVM) para uma discussão sobre as tecnologias e funcionalidades que vêm sendo discutidas para o Java 9 e versões posteriores.
InfoQ.com: No discurso de abertura do JavaOne você apresentou uma distinção entre a reificação de tipos genéricos e a especialização primitiva de tipos genéricos. Isto é, uma comparação entre disponibilizar em tempo de execução o valor de um tipo parametrizado ou permitir ter coleções de tipos primitivos, tal como asArrayList<int>. Você pode explicar um pouco mais sobre isso?
Goetz: Os desenvolvedores têm um desgosto emocional pela remoção de informação de tipos (type erasure), ficando com o sentimento de estar fazendo algo inapropriado. Na verdade essa é uma técnica bem prática e sua aplicação leva a poucos problemas.
Boxing é ineficiente, usa mais memória, enfraquece a localidade e demanda mais do Garbage Collector. É ótimo que algo como ArrayList<T> possa abstrair diversos T's, mas não é tão ótimo que o desenvolvedor tenha que pagar o preço do boxing para obter a agradável abstração que os tipos genéricos trazem, quando tudo o que ele precisa é de um Array de tipos inteiros primitivos.
InfoQ.com: E sobre as formas de remoção de tipos de interfaces que tem perda de informação, tal como as sobrecargas? Por exemplo, não será possível que List<String> e List<Map<String, Integer>> sejam tipos distintos no Java 10, será?
Goetz: List<String> e List<Integer> sempre foram tipos diferentes, mas esses dois tipos são representados pela mesma classe em tempo de execução. A remoção de informação de tipos impede descobrir se um dado tipo List foi definido como List<String> ou um List<Integer> antes da informação ser removida.
Uma tradução heterogênea completa de tipos genéricos, tal como a usada pelos templates em C++, mapearia cada um desses tipos para uma classe separada e sem relação entre elas. Não estamos propondo isso. Mas alguns tipos genéricos, tal como List<int>, pode ser representado por uma classe diferente de List<String>.
Isto é, o mapeamento de tipos em tempo de compilação para classes em tempo de execução pode trabalhar de forma diferente quando considerando a criação de listas para tipos primitivos e lista para referência de um objeto.
Rose: Isso significa que os equivalentes de tipos valores que tiveram informação removida aparecerão no bytecode.
Goetz: Colocando de outra forma, os desenvolvedores que não entenderam como usar tipos crús (raw types) ou <?> terão que aprender como fazer isso corretamente. Uma vez que nós teremos especialização e value types (valores de tipo) isso se tornará cada vez menos desculpável. Se você realmente não sabe generics, esse é um bom momento para aprender. Nós já vimos alguns desses casos com os lambdas. Se olharmos no Stack Overflow, muitas perguntas são do tipo: "por que eu não consigo fazer o que quero com um lambda?", e na verdade essas questões estão relacionadas ao uso incorreto de tipos genéricos que causam erros de inferência de tipo.
InfoQ.com: Vamos falar um pouco sobre a possibilidade da Optional ser um tipo proto-value.
Goetz: Havia uma pequena otimização potencial com a ideia de migrar um tipo referência(reference type) do Java 8 para um value type no Java 10. Basicamente, nós preparamos o terreno, indicando aos desenvolvedores que não devem depender de certas propriedades (tal como verificação de identidade) como sendo verdadeiras para tipos que podem se tornar value types no futuro. Sempre que essa migração se mostrar útil na prática, ela poderá acontecer.
InfoQ.com: O Ambiente de Execução Nativo do Java (Java Native Runtime - JNR) foi encerrado com a chegada do Projeto Panama?
Goetz: o JNR agora faz parte da história do Panama, mas há muito mais nele do que somente o JNR.
InfoQ.com: Haverá JSRs para o Panama e o Valhalla ou alguma tecnologia vinda deles? Quando saberemos para qual versão do Java elas serão endereçadas?
Rose: é melhor começar uma JSR quando há uma ideia de onde queremos chegar. O início das JSRs deve ser em algum ponto entre conhecermos qual versão do JDK que elas farão parte e ter um protótipo que as pessoas gostem.
Goetz: Isso é parecido ao lambda, que nós iniciamos no começo do projeto OpenJDK e a JSR começou quando nós tínhamos uma definição de sucesso para o projeto e também sabíamos quais eram os especialistas que formariam o Grupo de Especialistas (Expert Group) dessa JSR.
Rose: Há um valor enorme nas JSRs, mas nós precisamos de um bom ponto de partida por várias razões, mas especialmente para não formar um time muito cedo e desperdiçar o tempo dos especialistas.
Goetz: Nós temos sorte que agora todos os aspectos legais para desenvolver as JSRs no OpenJDK está pronta e nós podemos desenvolvê-las de forma aberta desde o início. Para os lançamentos, acompanhe os repositórios do Valhalla. Verifique especialmente por pequenas migrações entre os repositórios do JDK9 e JDK 10, assim como foi feito com os lambdas.
InfoQ.com: Você pode falar sobre os projetos relacionados as novas abordagens para o acesso à dados, tal como o IBM Packed Objects ou o Gil Tene's ObjectLayout?
Rose: O Java é uma linguagem de 20 anos e as pessoas têm reclamado sobre Arrays desde o início da linguagem, então, talvez não seja surpresa que nós chegamos a um consenso sobre o que precisa ser alterado. Muitas dessas queixas e projetos parecem convergir para uma API para obter dados com uma única dimensão (flat data).
Parece que estamos chegando ao ponto onde nós podemos iniciar um protótipo e é para isso que o Projeto Panama serve. A IBM tem se envolvido desde o início e há uma lista de discussão especial que os engenheiro da IBM VM podem participar (tivemos que configurar alguns filtros de IP mas agora está tudo funcionando corretamente).
São necessárias algumas pequenas mudanças na linguagem para, por exemplo, o tipo valor, mas nós queremos também realizar outras alterações como fazer a VM pensar que todos os valores são gerenciados e representados por ponteiros - ambas suposições precisam ser eliminadas. Achamos que agora já temos uma VM multi-linguagem e vamos aguardar por aquilo que o futuro espera.
InfoQ.com: Hazelcast, entre outros, tem pedido por Arrays que usam índices do tipo long. Isso é possível?
Rose: Todas as novas APIs para dados consideram o uso de índices long.
Goetz: Isso é algo que estamos trabalhando, mas considerando as novas funcionalidades temos um número de combinações muito grande em termos de esparsidade, tamanho, leitura e escrita ou somente leitura. Todos têm diferentes necessidades e nós precisamos priorizar.
Rose: Há muitos níveis de liberdade aqui, como uma pizza. A ideia é que nós não queremos tratar uma "pizza de cogumelos e cebolas" como uma combinação completamente diferente de uma "pizza com cebolas e pimentas", o que nos levaria a um número exponencial de combinações. Ao invés disso, queremos algo como "pegue qualquer cobertura". Ainda estamos trabalhando para definir o cardápio.
Um padrão comum é a aplicação de camadas gerenciadas de dados lado a lado. Os usuários têm um custo de gerenciamento incremental então eles vão querer gerenciar os dados. Isso leva a um número grande de bytes pré-formatados que leva diretamente ao acesso nativo aos dados.
Para mais informações sobre o Projeto Panamá visite esse site e para o Projeto Valhalla veja esse artigo. Fique atualizado com a cobertura completa do InfoQ.com sobre as novas funcionalidades do Java 9, incluindo modularidade e muito mais.
Sobre os entrevistados
Brian Goetz tem sido desenvolvedor de software profissional por mais de 25 anos. Brian é o autor do livro Java Concurrency in Practice e escreveu aproximadamente 75 artigos sobre desenvolvimento Java. Ele foi o líder da especificação JSR-335 (Expressões Lamba para a linguagem Java) e participou de vários outros Grupos de Especialistas no JCP. Brian é o Arquiteto da Linguagem Java na Oracle.
John Rose é o Engenheiro líder do Projeto Da Vinci Machine, parte do OpenJDK. Ele também é líder da especificação JSR 292, trabalhando no novo suporte dos padrões da JVM para invocações dinâmicas e facilidades relacionadas, tal como profiling e otimizações avançadas de compilação.
John trabalha com tecnologias Java desde 1997 na Sun, contribuindo com funcionalidades e melhoria de desempenho no HotSpot e OpenJDK, desde a arquitetura de hardware até geradores de código para bibliotecas de linguagens de programação. Entre as atividades já desenvolvidas estão o projeto de classes internas (inner classes), portabilidade inicial do HotSpot para SPARC, a API de UnSafe e várias linguagens dinâmicas, paralelas e híbridas, incluindo Common Lisp, Scheme ("esh") e vínculos dinâmicos para C++.