Na busca contínua por produtividade e desempenho na linguagem Java, Brian Goetz, arquiteto de linguagem Java da Oracle, juntamente com Alex Buckley, líder de especificação da linguagem Java e do Java Virtual Machine da Oracle, propuseram um conjunto de palavras-chave com hífen para o Java. O objetivo é fornecer um caminho para desenvolver um idioma maduro, no qual a adição de novos recursos pode ser um desafio devido ao conjunto atual de palavras-chave, conforme definido na Especificação da Linguagem Java do Java SE 12.
Os objetivos da implementação de palavras-chave com hífen, conforme especificado no JDK-8223002, são:
- Explorar as opções de sintaxe abertas aos designers de linguagem Java para denotar novos recursos;
- Resolver o problema permanente dos tokens de palavras-chave serem tão escassos e caros para que os projetistas de linguagem precisem restringir ou corromper o modelo de programação Java para se ajustarem às palavras-chave disponíveis;
- Aconselhar os designers de linguagem sobre o estilo de palavra-chave adequado para diferentes tipos de recursos.
Diversas técnicas foram usadas ao longo dos anos para evoluir a linguagem: [a] domínio eminente, reclassificando um identificador como uma palavra-chave (como assert
no Java 1.4 e enum
in Java 1.5); [b] overload, reutilizando uma palavra-chave existente para um novo recurso; [c] distorção, criando uma sintaxe usando uma palavra-chave existente (como @interface
); [d] fumaça e espelhos, criando a ilusão de uma nova palavra-chave usada em um novo contexto (como var
com limites a variáveis locais). Todas essas técnicas foram problemáticas de alguma forma. Por exemplo, a adição de assert
como uma palavra-chave quebrou quase todos os frameworks de teste.
O conceito de palavra-chave com hifenização complementaria essas técnicas existentes e usaria uma combinação de palavras-chave clássicas e/ou contextuais. As palavras-chave clássicas são "uma sequência de letras em Java que é sempre tokenizada como uma palavra-chave, nunca como um identificador". Já as palavras-chaves contextuais são "uma sequência de letras em Java que é simbolizada como uma palavra-chave em determinados contextos, mas como um identificador em todos os outros". Alguns exemplos de palavras-chave clássicas com hifenização em potencial incluem: non-final
, break-with
e value-class
. Os exemplos de possíveis palavras-chave contextuais com hífen incluem: non-null
, read-only
e eventually-true
.
Um dos desafios da implementação de palavras-chave hifenizadas envolve a maneira como um lookahead arbitrário ou lookahead léxico fixo deve analisar uma expressão como a-b
como três tokens (identificador, operador, identificador) ou uma palavra-chave com hífen.
Uma conversa por e-mail do OpenJDK no início deste ano propôs a introdução da palavra-chave hifenizada break-with
para o JDK 13 (prevista para setembro de 2019). No entanto, em última análise, foi decidido abandonar a palavra-chave break-with em favor de uma nova palavra-chave, yield
e fazer uma nova revisão das expressões switch
. A eventual finalização do novo construtor da expressão do switch
deve limpar o caminho para a introdução do conceito de correspondência de padrões que está em discussão há quase dois anos.
Goetz e Buckley comentaram os prós e contras do conceito de palavras-chave com hífen:
Deixar um recurso fora do Java por razões de simplicidade, é algo bom. Deixar de fora porque não há maneira de denotar uma semântica óbvia, não é. Esse é um problema constante na evolução da linguagem e um custo contínuo pago por todos os desenvolvedores de Java.
Uma maneira de viver sem criar novas palavras-chave é parar completamente de desenvolver o Java. Embora existam alguns que pensam que esta é uma boa ideia, cessar por causa da falta de possibilidades disponíveis seria um motivo estúpido. O Java tem uma longa vida pela frente e os desenvolvedores estão empolgados com os novos recursos que permitem que escrevam códigos mais expressivos e confiáveis.
Goetz falou com o InfoQ sobre as palavras-chave com hífen:
InfoQ: Qual é a resposta da comunidade para palavras-chave com hífen na linguagem Java?
Brian Goetz: Como poderíamos esperar, cobriu uma boa amostra de desenvolvedores. Alguns ficaram satisfeitos em ver o cuidado que tivemos com questões sobre a melhor forma de evoluir para uma linguagem madura. Já outros, reclamavam que estávamos filosofando tentando encontrar chifre em cabeça de cavalo e prefeririam que trabalhássemos em outro recurso que achavam mais proveitoso.
InfoQ: Qual é a probabilidade de que as técnicas existentes, "domínio eminente", "sobrecarga", "distorção" e "fumaça e espelhos" sejam usadas novamente para expandir o conjunto de palavras-chave na linguagem Java se a proposta de palavra-chave com hífen não for aceita?
Goetz: Vejo isso como um menu de opções, com uma nova opção interessante e flexível sendo adicionada às opções existentes. Ainda assim, em qualquer situação, uma das outras opções ainda pode ser melhor. Não estamos descartando nada.
InfoQ: De acordo com o JEP 354, a proposta de break-with como uma palavra-chave hifenizada foi descartada em favor da nova palavra-chave, yield no JDK 13. O que levou à decisão de não usar a primeira palavra-chave com hífen na linguagem Java?
Goetz: O principal candidato hifenizado foi o
break-with
, mas nos grupos focais com usuários, as pessoas ainda achavam que era complicado e não muito óbvio. As palavras-chaves com hífen estão no menu, mas isso não significa que tenhamos de pedi-las cada vez que escolhemos algo. No geral, as pessoas acharam oyield
mais natural (embora, é claro, alguns não gostassem disso, já que isso os lembra de retorno - yield em inglês - de um valor de uma co-rotina). Descobriu-se que oyield
, na posição gramatical específica em que se encontrava, era um candidato razoável para uma palavra-chave contextual, nem todas as posições gramaticais possuem essa característica.
InfoQ: À medida que o Java evolui mais rapidamente com o ciclo de lançamento de seis meses, qual a probabilidade de uma palavra-chave com hífen ser introduzida na linguagem Java?
Goetz: Quando precisarmos de um, estará no menu. É provável que o Sealed Types exijam uma maneira de desativar o sealed, como um
non-sealed
.
InfoQ: Qual é a mensagem mais importante que gostaria que os leitores soubessem sobre palavras-chave com hífen?
Goetz: Que estamos falando sério sobre equilibrar a necessidade de evoluir a compatibilidade de linguagem, mantendo-a legível.
Referências
- Brian Goetz fala ao InfoQ sobre o padrão de correspondência para o Java por InfoQ (September 17, 2017).
- break-with por Brian Goetz (January 17, 2019).
- Gerenciamento de palavras-chave para a linguagem Java por Alex Buckley (April 25, 2019).