En un lenguaje de programación , una palabra reservada (a veces conocida como identificador reservado ) es una palabra que un programador no puede usar como identificador , como el nombre de una variable, función o etiqueta ; está "reservada para su uso". En resumen, un identificador comienza con una letra, seguida de cualquier secuencia de letras y dígitos (en algunos lenguajes, el guion bajo '_' se considera una letra).
En los lenguajes de programación imperativos y en muchos lenguajes de programación orientados a objetos , además de las asignaciones y las llamadas a subrutinas, se suelen usar palabras clave para identificar una instrucción específica , como `if` , ` while` , `do` , `for` , etc. Muchos lenguajes tratan las palabras clave como palabras reservadas, entre ellos Ada , C , C++ , COBOL , Java y Pascal . El número de palabras reservadas varía considerablemente de un lenguaje a otro: C tiene unas 30, mientras que COBOL tiene unas 400.
Algunos lenguajes no tienen palabras reservadas; Fortran y PL/I identifican las palabras clave por contexto, mientras que Algol 60 y Algol 68 generalmente usan stropping para distinguir las palabras clave de los identificadores definidos por el programador, por ejemplo, .ifo 'ifo 'if'o ifes una palabra clave distinta del identificador if.
La mayoría de los lenguajes de programación tienen una o varias bibliotecas estándar, por ejemplo, para las funciones matemáticas seno, coseno, etc. Los nombres que proporciona una biblioteca no están reservados y pueden ser redefinidos por un programador si no se requiere la funcionalidad de la biblioteca.
Distinción
Al usar un Entorno de Desarrollo Interactivo (IDE) para desarrollar un programa, este suele resaltar las palabras reservadas mostrándolas en un color diferente. En algunos IDE, los comentarios también pueden resaltarse (en otro color). Esto facilita que el programador detecte el uso inesperado de una palabra reservada o un error al finalizar un comentario.
Puede haber palabras reservadas que no sean palabras clave. Por ejemplo, en Java, true y falseson palabras reservadas que se utilizan como literales booleanos (lógicos). Como otro ejemplo, en Pascal, divy modson palabras reservadas que se utilizan como operadores (división entera y resto).
También puede haber palabras reservadas que no tienen un significado definido. Por ejemplo, en Java, gotoy constse enumeran como palabras reservadas, pero no se mencionan de ninguna otra manera en las reglas de sintaxis de Java . [ 1 ]
Una palabra clave como if o while se utiliza durante el análisis sintáctico para determinar qué tipo de instrucción se está considerando. Este análisis es mucho más sencillo si las palabras clave están reservadas o bloqueadas. Considere la complejidad de usar el análisis contextual en Fortran 77 para distinguir:
SI (B) l1,l2 ! rama de dos vías, donde B es una expresión booleana SI (N) l1,l2,l3 ! bifurcación de tres vías, donde N es una expresión numérica SI (B) ENTONCES ! inicio bloque condicional SI (B) ENTONCES = 3.1 ! asignación condicional a variable ENTONCES SI (B) X = 10 ! sentencia condicional simple SI (B) IR A l4 ! salto condicional SI (N) = 2 ! asignación a una variable con subíndice llamada SI
PL/I también puede permitir algunas construcciones aparentemente confusas:
SI SI = ENTONCES ENTONCES ... /* (la segundaIFy la primeraTHENson variables */
Ventajas
Los programas pueden ser más legibles en comparación con un lenguaje de programación que utiliza stratos.
Para un IDE es más fácil resaltar las palabras clave, sin tener que realizar un análisis contextual para determinar cuáles son realmente palabras clave (véanse los ejemplos de Fortran en la sección anterior).
Un compilador puede ser más rápido, ya que puede determinar rápidamente si una palabra es una palabra clave, sin tener que realizar un análisis contextual de toda una instrucción arbitrariamente larga.
Desventajas
Un lenguaje de programación puede ser difícil de aprender para los nuevos usuarios debido a una lista (posiblemente larga) de palabras reservadas que deben memorizar y que no pueden usarse como identificadores. [ 2 ]
Puede resultar difícil ampliar el lenguaje, ya que la adición de palabras reservadas para nuevas funciones podría invalidar los programas existentes o, por el contrario, la "sobrecarga" de palabras reservadas existentes con nuevos significados puede resultar confusa.
La portabilidad de programas puede resultar problemática porque una palabra no reservada por un sistema o compilador podría estar reservada por otro.
Reserva adicional
Además de reservar listas específicas de palabras, algunos idiomas reservan rangos completos de palabras para usarlos como espacios privados para futuras versiones del idioma, diferentes dialectos, extensiones específicas del proveedor del compilador o para uso interno de un compilador, especialmente en la modificación de nombres .
Esto se suele hacer usando un prefijo, a menudo uno o más guiones bajos . C y C++ son notables en este sentido: C99 reserva identificadores que comienzan con dos guiones bajos o un guion bajo seguido de una letra mayúscula, y además reserva identificadores que comienzan con un solo guion bajo (en los espacios ordinarios y de etiquetas) para su uso en el ámbito del archivo ; [ 3 ] con C++03 reserva además identificadores que contienen un doble guion bajo en cualquier lugar [ 4 ] – esto permite el uso de un doble guion bajo como separador (para conectar identificadores de usuario), por ejemplo.
El uso frecuente de guiones bajos dobles en identificadores internos en Python dio origen a la abreviatura dunder; esta fue acuñada por Mark Jackson [ 5 ] e independientemente por Tim Hochberg, [ 6 ] con minutos de diferencia, ambos en respuesta a la misma pregunta en 2002. [ 7 ] [ 8 ]
Especificación
La lista de palabras reservadas y palabras clave de un lenguaje se define durante su desarrollo y forma parte de su especificación formal . Generalmente, se busca minimizar el número de palabras reservadas para evitar restringir los nombres de identificadores válidos. Además, la introducción de nuevas palabras reservadas provoca fallos en los programas existentes que las utilizan (no es compatible con versiones anteriores), por lo que se evita. Para prevenir esto y garantizar la compatibilidad con versiones futuras , a veces se reservan palabras sin que tengan un uso actual (palabras reservadas que no son palabras clave), lo que permite su uso futuro sin afectar a los programas existentes. Otra alternativa es implementar nuevas características del lenguaje como predefinidas, que pueden sobrescribirse, sin afectar a los programas existentes.
Entre las razones para la flexibilidad se incluyen permitir que los proveedores de compiladores extiendan la especificación mediante la inclusión de características no estándar, diferentes dialectos estándar del lenguaje para extenderla, o futuras versiones del lenguaje para incluir características adicionales. Por ejemplo, un lenguaje procedimental puede prever la incorporación de capacidades orientadas a objetos en una versión futura o algún dialecto, en cuyo caso se podrían añadir palabras clave como `<object>` classo `<object> object`. Para contemplar esta posibilidad, la especificación actual puede reservar estas palabras, incluso si no se utilizan actualmente.
Un ejemplo notable se encuentra en Java , donde consty gotoson palabras reservadas: no tienen significado en Java, pero tampoco pueden usarse como identificadores. Al reservar los términos, se pueden implementar en futuras versiones de Java, si se desea, sin romper el código fuente de Java anterior . Por ejemplo, en 1999 se propuso agregar constal lenguaje una funcionalidad similar a C++, lo cual era posible usando la constpalabra, ya que estaba reservada pero no se usaba en ese momento; sin embargo, esta propuesta fue rechazada, principalmente porque, aunque agregar la característica no rompería ningún programa existente, usarla en la biblioteca estándar (especialmente en colecciones) rompería la compatibilidad. [ 9 ] JavaScript también contiene varias palabras reservadas sin funcionalidad especial; la lista exacta varía según la versión y el modo. [ 10 ]
Los lenguajes difieren significativamente en la frecuencia con la que introducen nuevas palabras reservadas o palabras clave y en cómo las nombran. Algunos lenguajes son muy conservadores e introducen nuevas palabras clave rara vez o nunca, para evitar romper programas existentes, mientras que otros las introducen con mayor libertad, lo que obliga a los programas existentes a cambiar los identificadores existentes que entran en conflicto. Un ejemplo de estudio lo constituyen las nuevas palabras clave en C11 en comparación con C++11 , ambas de 2011. Recordemos que en C y C++, los identificadores que comienzan con un guion bajo seguido de una letra mayúscula están reservados: [ 11 ].
El comité de C prefiere no crear nuevas palabras clave en el espacio de nombres de usuario, ya que generalmente se espera que cada revisión de C evite romper programas C más antiguos. En comparación, el comité de C++ (WG21) prefiere que las nuevas palabras clave tengan una apariencia tan normal como las antiguas. Por ejemplo, C++11 define una nueva
thread_localpalabra clave para designar almacenamiento estático local a un hilo. C11 define la nueva palabra clave como_Thread_local.En el nuevo encabezado de C11 < threads.h > , hay una definición de macro para proporcionar el nombre de apariencia normal: [ 12 ]
#define thread_local _Thread_local
Es decir, C11 introdujo la palabra clave _Thread_localdentro de un conjunto existente de palabras reservadas (aquellas con un cierto prefijo) y luego utilizó una función separada (procesamiento de macros) para permitir su uso como si fuera una nueva palabra clave sin ningún prefijo, mientras que C++11 introduce la palabra clave thread_locala pesar de que no es una palabra reservada existente, lo que rompe cualquier programa que la utilice, pero sin requerir procesamiento de macros.
Palabras reservadas e independencia lingüística
La especificación .NET Common Language Infrastructure (CLI) de Microsoft permite combinar código escrito en más de 40 lenguajes de programación diferentes en un producto final. Debido a esto, pueden producirse colisiones de identificadores/palabras reservadas cuando el código implementado en un lenguaje intenta ejecutar código escrito en otro. Por ejemplo, una biblioteca de Visual Basic (.NET) puede contener una definición de clase como la siguiente:
' Definición de la clase This en Visual Basic.NET:Clase pública this ' Esta clase hace algo... Fin de la claseSi esto se compila y distribuye como parte de una caja de herramientas, un programador de C# que desee definir una variable de tipo " this" se encontraría con un problema: 'this'es una palabra reservada en C#. Por lo tanto, lo siguiente no compilará en C#:
// Uso de esta clase en C#:this x = new this (); // ¡No compilará!Un problema similar surge al acceder a los miembros, sobrescribir métodos virtuales e identificar espacios de nombres.
Esto se resuelve mediante el stropping . Para solucionar este problema, la especificación permite colocar (en C#) el signo arroba antes del identificador, lo que obliga al compilador a considerarlo un identificador en lugar de una palabra reservada:
// Uso de esta clase en C#:@this x = new @this (); // ¡Compilará!Para mayor coherencia, este uso también está permitido en entornos no públicos, como variables locales, nombres de parámetros y miembros privados.
Véase también
Referencias
- ↑ "Palabras clave del lenguaje Java" . Oracle Corporation .
- ↑ Sebesta, Robert W. (2012). Conceptos de lenguajes de programación (PDF) (10.ª ed.). Addison-Wesley. págs. 206–207 . ISBN 978-0-13-139531-2.
- ↑ Especificación C99, 7.1.3 Identificadores reservados
- ↑ Especificación C++03, 17.4.3.2.1 Nombres globales [lib.global.names]
- ↑ Jackson, Mark (26 de septiembre de 2002). "¿Cómo se pronuncia "__" (doble guion bajo)?" . python-list (Lista de correo) . Consultado el 9 de noviembre de 2014 .
- ↑ Hochberg, Tim (26 de septiembre de 2002). "¿Cómo se pronuncia "__" (doble guion bajo)?" . python-list (Lista de correo) . Consultado el 9 de noviembre de 2014 .
- ↑ "DunderAlias - Wiki de Python" . wiki.python.org .
- ↑ Notz, Pat (26 de septiembre de 2002). "¿Cómo se pronuncia "__" (doble guion bajo)?" . python-list (Lista de correo) . Consultado el 9 de noviembre de 2014 .
- ↑ "ID de error: JDK-4211070 Java debería admitir parámetros constantes (como C++) para el mantenimiento del código [ sic ] " . Bugs.sun.com . Consultado el 4 de noviembre de 2014 .
- ↑ "Gramática léxica - JavaScript | MDN" . developer.mozilla.org . 8 de noviembre de 2023.
- ↑ Especificación C99, 7.1.3 Identificadores reservados: "Todos los identificadores que comienzan con un guion bajo y una letra mayúscula u otro guion bajo están siempre reservados para cualquier uso."
- ↑ C11: El nuevo estándar C , Thomas Plum, "Una nota sobre las palabras clave"
- Estructuras de programación
- Temas de lenguajes de programación