Projeto Java Valhalla
1. Visão geral
2. Motivação e razões para o projeto Valhalla
Em um de seustalks, Brian Goetz, arquiteto de linguagem Java da Oracle, disse que uma das principais motivações para o Projeto Valhalla é o desejo deadapt the Java language and runtime to modern hardware. Quando a linguagem Java foi concebida (cerca de 25 anos atrás, no momento da escrita),the cost of a memory fetch and an arithmetic operation was roughly the same.
Atualmente, isso mudou, com as operações de busca de memória sendo de 200 a 1.000 vezes mais caras que as operações aritméticas. In terms of language design, this means that indirections leading to pointer fetches have a detrimental effect on overall performance.
Como a maioria das estruturas de dados Java em um aplicativo são objetos, podemos considerar Java uma linguagem com muitos ponteiros (embora geralmente não os vejamos ou manipulemos diretamente). Essa implementação de objetos baseada em ponteiro é usada para habilitar a identidade do objeto, que por sua vez é aproveitada para recursos de linguagem como polimorfismo, mutabilidade e bloqueio. Esses recursos vêm por padrão para todos os objetos, independentemente de serem realmente necessários ou não.
Seguindo a cadeia de identidade que leva a ponteiros e os ponteiros que levam a indenizações, com os indiretos apresentando desvantagens de desempenho, uma conclusão lógica é remover as estruturas de dados que não precisam deles. É aqui que os tipos de valor entram em jogo.
3. Tipos de valor
A ideia dos tipos de valor érepresent pure data aggregates. Isso ocorre com a eliminação dos recursos de objetos regulares. Portanto, temos dados puros, sem identidade. Isso significa, é claro, que também estamos perdendo recursos que poderíamos implementar usando a identidade do objeto. Consequentemente,equality comparison can only happen based on state. Assim, não podemos usar polimorfismo representacional e não podemos usar objetos imutáveis ou não anuláveis.
Uma vez que não temos mais identidade de objeto, podemos desistir de ponteiros e alterar o layout geral da memória de tipos de valor, em comparação com um objeto. Vejamos uma comparação do layout da memória entre a classePointe o tipo de valor correspondentePoint.
O código e o layout de memória correspondente de uma classePoint regular seriam:
final class Point {
final int x;
final int y;
}
Por outro lado, o código e o layout de memória correspondente de um tipo de valorPoint seriam:
value class Point {
int x;
int y
}
This allows the JVM to flatten value types into arrays and objects, as well as into other value types. No diagrama a seguir, apresentamos o efeito negativo dos meios indiretos quando usamos a classePoint em uma matriz:
Por outro lado, aqui vemos a estrutura de memória correspondente de um tipo de valorPoint[]:
Também permite que a JVM passe tipos de valor na pilha em vez de precisar alocá-los no heap. In the end, this means that we’re getting data aggregates that have runtime behavior similar to Java primitives, such as int or float.
Mas, diferentemente das primitivas, os tipos de valor podem ter métodos e campos. Também podemos implementar interfaces e usá-las como tipos genéricos. Então, podemos olhar para os tipos de valor de dois ângulos diferentes:
-
Objetos mais rápidos
-
Primitivas definidas pelo usuário
Como cobertura adicional no bolo, podemos usar tipos de valor como tipos genéricos sem boxe. Isso nos leva diretamente ao outro grande recurso do Project Valhalla: genéricos especializados.
4. Genéricos especializados
Quando queremos generificar sobre os primitivos de linguagem, atualmente usamos tipos em caixas, comoInteger paraint ouFloat parafloat. Esse boxe cria uma camada adicional de indireção, anulando, assim, o propósito de usar primitivas para melhorar o desempenho.
Portanto, vemos muitas especializações dedicadas para tipos primitivos em estruturas e bibliotecas existentes, comoIntStream<T> ouToIntFunction<T>. Isso é feito para manter a melhoria de desempenho do uso de primitivas.
Portanto, genéricos especializados são um esforço para remover as necessidades desses "hacks". Em vez disso, a linguagem Java se esforça para habilitar tipos genéricos para basicamente tudo: referências de objeto, primitivos, tipos de valor e talvez atévoid.
5. Conclusão
Demos uma olhada nas mudanças que o Projeto Valhalla trará à linguagem Java. Two of the main goals are enhanced performance and less leaky abstractions.
Os aprimoramentos de desempenho são resolvidos nivelando gráficos de objetos e removendo indiretos. This leads to more efficient memory layouts and fewer allocations and garbage collections.
A melhor abstração vem com primitivos e objetos tendo um comportamento mais semelhante quando usados como tipos genéricos.
Um protótipo inicial do Projeto Valhalla, introduzindo tipos de valor no sistema de tipos existente, tem o nome de códigoLW1.
Podemos encontrar mais informações sobre o Projeto Valhalla na página do projeto e nos JEPs correspondentes: