jdk - ¿Cuál es la diferencia conceptual entre una "palabra clave restringida" y un "nombre de tipo reservado" en Java 10?
jdk 10 download (1)
Java 10 viene con la nueva inferencia de tipo de variable local. El token var
se puede usar para reducir la placa de calderas requerida al declarar una variable. p.ej
var s = "hello";
De acuerdo con ¿Qué tipo de token es exactamente "var" en Java 10? este nuevo token no es una "palabra clave", sino un "nombre de tipo reservado". Como tal, la palabra "var" todavía se puede utilizar como un nombre de variable que mantiene la compatibilidad hacia atrás con el código existente.
var var = "you can do this";
Cuando se introdujo la característica "módulo" en Java 9, el tipo de este nuevo token (junto con sus otros 9 tokens relacionados) se denominó "palabras clave restringidas". Lo que quiere decir que solo se consideraron palabras clave en ciertas restricciones específicas del contexto. Por ejemplo, todavía puede tener variables llamadas módulo.
Cuando se agregaron nuevas características de lenguaje a C ++ de tal manera que no se pegaban a los símbolos definidos por el usuario existentes, se llamaban "palabras clave sensibles al contexto".
¿Existe una diferencia conceptual entre el nuevo token var
"nombre de tipo reservado" en Java 10 y una "palabra clave sensible al contexto" o "palabra clave restringida". Lo que quiere decir es que no es el nuevo token var
realmente una palabra clave bajo ciertas restricciones específicas del contexto. Si ese es el caso, ¿por qué no se agregó simplemente a la lista de "palabras clave restringidas"?
Para agregar a mi confusión, el borrador actual de JLS dice que:
La secuencia de caracteres var generalmente se trata como un identificador, pero en ciertos casos especiales actúa como si fuera una palabra clave.
Esa definición ciertamente suena como una "palabra clave restringida".
La siguiente oración de la sección que cita (3.8: Palabras clave) es:
Otras diez secuencias de caracteres son palabras clave restringidas: abrir, módulo, requiere, transitivo, exportar, abre, utiliza, proporciona y con.
Tenga en cuenta que var
no está en esta lista. La mención de var
en esta sección se incluyó precisamente para dejar claro que, aunque en algunos casos puede actuar como una palabra clave restringida, y si bien puede parecerle así en su lectura informal de la especificación, no lo es.
Las palabras clave sensibles al contexto son una de las herramientas que tenemos a nuestra disposición para desarrollar el lenguaje de una manera compatible; Los identificadores reservados son otro. En este caso particular, cualquiera de los dos podría haber sido aplicado, y al final, la última herramienta fue considerada (a los efectos de la especificación y la implementación del compilador) como preferible.
La especificación, como la mayoría de las implementaciones de compiladores, separa las preocupaciones léxicas, sintácticas y tipográficas. Las palabras clave se manejan principalmente a nivel de las producciones de léxer y analizador; Los nombres de tipo reservados se verifican más adelante en el proceso de compilación, durante el análisis de tipo, y pueden compartir las producciones del analizador con nombres no reservados.
Desde la perspectiva de un desarrollador que no es ni un autor de especificaciones ni un implementador de compiladores, la diferencia es en gran medida teórica; El efecto deseado se puede lograr con cualquier camino.