Palabra reservada
En un lenguaje informático, una palabra reservada (también conocida como identificador reservado) es una palabra que no se puede utilizar como identificador, como el nombre de un variable, función o etiqueta: está "reservado de uso". Esta es una definición sintáctica y una palabra reservada puede no tener un significado definido por el usuario.
Una noción estrechamente relacionada ya menudo combinada es una palabra clave, que es una palabra con un significado especial en un contexto particular. Esta es una definición semántica. Por el contrario, los nombres en una biblioteca estándar pero que no están integrados en el idioma no se consideran palabras reservadas ni palabras clave. Los términos "palabra reservada" y "palabra clave" a menudo se usan indistintamente: se puede decir que una palabra reservada está "reservada para usar como palabra clave" – y el uso formal varía de un idioma a otro; para este artículo distinguimos como arriba.
En general, las palabras reservadas y las palabras clave no tienen por qué coincidir, pero en la mayoría de los idiomas modernos, las palabras clave son un subconjunto de las palabras reservadas, lo que facilita el análisis, ya que las palabras clave no se pueden confundir con los identificadores. En algunos lenguajes, como C o Python, las palabras reservadas y las palabras clave coinciden, mientras que en otros lenguajes, como Java, todas las palabras clave son palabras reservadas, pero algunas palabras reservadas no son palabras clave: están "reservadas para uso futuro". En otros lenguajes, como los lenguajes más antiguos ALGOL, FORTRAN y PL/I, hay palabras clave pero no palabras reservadas, y las palabras clave se distinguen de los identificadores por otros medios.
Distinción
Los conjuntos de palabras reservadas y palabras clave en un idioma a menudo coinciden o son casi iguales, y la distinción es sutil, por lo que los términos a menudo se usan indistintamente. Sin embargo, en el uso cuidadoso se distinguen.
Hacer que las palabras clave sean palabras reservadas facilita la lectura, ya que una cadena de caracteres será inequívocamente una palabra clave o un identificador, sin depender del contexto; por lo tanto, las palabras clave suelen ser un subconjunto de palabras reservadas. Sin embargo, las palabras reservadas no necesitan ser palabras clave; por ejemplo, en Java, goto
es una palabra reservada, pero no tiene significado y no aparece en ninguna regla de producción de la gramática. Esto generalmente se hace por compatibilidad con versiones anteriores, por lo que una palabra reservada puede convertirse en una palabra clave en una versión futura sin romper los programas existentes.
Por el contrario, no es necesario que las palabras clave sean palabras reservadas, cuya función se comprenda a partir del contexto, o se pueden distinguir de otra manera, como por ejemplo, abriéndolas paso a paso. Por ejemplo, la frase if = 1
no es ambigua en la mayoría de las gramáticas, ya que una declaración de control de una cláusula if no puede comenzar con =
y, por lo tanto, está permitida en algunos idiomas. como FORTRAN. Alternativamente, en ALGOL 68, las palabras clave se deben marcar (marcar de alguna manera para que se distingan) en el lenguaje estricto al enumerarlas en negrita y, por lo tanto, no son palabras reservadas. Por lo tanto, en el lenguaje estricto, la siguiente expresión es legal, ya que la palabra clave en negrita if no entra en conflicto con el identificador ordinario if
:
- si si eq 0 entonces 1 fi
Sin embargo, en ALGOL 68 también hay un régimen de stropping en el que las palabras clave son palabras reservadas, un ejemplo de cómo estos conceptos distintos a menudo coinciden; esto se sigue en muchos idiomas modernos.
Sintaxis
Una palabra reservada es aquella que "parece" una palabra normal, pero no se permite su uso como palabra normal. Formalmente, esto significa que cumple con la sintaxis léxica habitual (sintaxis de las palabras) de los identificadores, por ejemplo, ser una secuencia de letras, pero no puede usarse donde se usan identificadores. Por ejemplo, la palabra if
suele ser una palabra reservada, mientras que x
generalmente no lo es, por lo que x = 1
es una asignación válida, pero si = 1 no lo es.
Las palabras clave tienen usos variados, pero principalmente pertenecen a algunas clases: parte de la gramática de frases (específicamente una regla de producción con símbolos no terminales), con varios significados, a menudo se usa para controlar el flujo, como la palabra if
en la mayoría de los lenguajes de procedimiento, que indica un condicional y toma cláusulas (los símbolos no terminales); nombres de tipos primitivos en un lenguaje que admita un sistema de tipos, como int
; valores literales primitivos como true
para Boolean true; o, a veces, comandos especiales como exit
. Otros usos de palabras clave en frases son para entrada/salida, como print
.
Las distintas definiciones son claras cuando un idioma se analiza mediante una combinación de un léxico y un analizador sintáctico, y la sintaxis del idioma se genera mediante una gramática léxica para las palabras y una gramática independiente del contexto de las reglas de producción para el frases Esto es común en el análisis de idiomas modernos y, en este caso, las palabras clave son un subconjunto de palabras reservadas, ya que deben distinguirse de los identificadores a nivel de palabra (por lo tanto, palabras reservadas) para analizarse sintácticamente de manera diferente a nivel de frase (como palabras clave).
En este caso, las palabras reservadas se definen como parte de la gramática léxica y cada una se tokeniza como un tipo separado, distinto de los identificadores. En la notación convencional, las palabras reservadas if
y then
, por ejemplo, se tokenizan como tipos IF
y THEN
, respectivamente, mientras que x
y y
se tokenizan como tipo Identifier
.
Las palabras clave, por el contrario, aparecen sintácticamente en la gramática de frases, como símbolos terminales. Por ejemplo, la regla de producción para una expresión condicional puede ser IF Expression THEN Expression
. En este caso, IF
y THEN
son símbolos terminales, lo que significa "un token de tipo IF
o THEN
, respectivamente" – y debido a la gramática léxica, esto significa la cadena if
o then
en la fuente original. Como ejemplo de un valor constante primitivo, true
puede ser una palabra clave que represente el valor booleano "true", en cuyo caso debería aparecer en la gramática como una posible expansión de la producción. BinaryExpression
, por ejemplo.
Rangos reservados
Más allá de reservar listas específicas de palabras, algunos idiomas reservan rangos completos de palabras, para usar como espacios privados para versiones futuras 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.
La mayoría de las veces, esto se hace usando un prefijo, a menudo uno o más guiones bajos. C y C ++ son notables a este respecto: C99 reserva identificadores que comienzan con dos guiones bajos o un guión bajo seguido de una letra mayúscula, y además reserva identificadores que comienzan con un solo guión bajo (en los espacios ordinarios y de etiquetas) para uso en el alcance del archivo; con C++03 se reservan además los identificadores que contienen un doble guión bajo en cualquier lugar; esto permite el uso de un doble guión bajo como separador (para conectar los identificadores de usuario), por ejemplo.
El uso frecuente de guiones bajos dobles en los identificadores internos en Python dio lugar a la abreviatura dunder; esta fue acuñada por Mark Jackson e independientemente por Tim Hochberg, con minutos de diferencia, ambos en respuesta a la misma pregunta en 2002.
Especificación
La lista de palabras reservadas y palabras clave en un idioma se definen cuando se desarrolla un idioma y ambas forman parte de la especificación formal de un idioma. Generalmente, uno desea minimizar el número de palabras reservadas, para evitar restringir nombres de identificadores válidos. Además, la introducción de nuevas palabras reservadas rompe los programas existentes que usan esa palabra (no es compatible con versiones anteriores), por lo que esto se evita. Para evitar esto y brindar compatibilidad hacia adelante, a veces se reservan palabras sin tener un uso actual (una palabra reservada que no es una palabra clave), ya que esto permite que la palabra se use en el futuro sin interrumpir los programas existentes. Alternativamente, las nuevas características del idioma se pueden implementar como predefinidas, que se pueden anular, por lo que no se rompen los programas existentes.
Las razones de la flexibilidad incluyen permitir que los proveedores de compiladores amplíen la especificación al incluir funciones no estándar, diferentes dialectos estándar del lenguaje para ampliarla o versiones futuras del lenguaje para incluir funciones adicionales. Por ejemplo, un lenguaje procedimental puede anticipar la adición de capacidades orientadas a objetos en una versión futura o en algún dialecto, momento en el que se pueden agregar palabras clave como class
o object
. Para dar cabida a esta posibilidad, la especificación actual puede hacer estas palabras reservadas, incluso si no se utilizan actualmente.
Un ejemplo notable es en Java, donde const
y goto
son palabras reservadas; no tienen significado en Java pero tampoco se pueden usar como identificadores. Al reservar los términos, se pueden implementar en futuras versiones de Java, si se desea, sin romper el código fuente antiguo de Java. Por ejemplo, hubo una propuesta en 1999 para agregar const
similar a C++ al lenguaje, lo que era posible usando la palabra const
, ya que estaba reservada pero actualmente no se usa; sin embargo, esta propuesta fue rechazada, especialmente porque, aunque agregar la función no rompería ningún programa existente, usarla en la biblioteca estándar (especialmente en las colecciones) rompería la compatibilidad. JavaScript también contiene una serie de palabras reservadas sin funcionalidad especial; la lista exacta varía según la versión y el modo.
Los idiomas difieren significativamente en la frecuencia con la que introducen nuevas palabras reservadas o palabras clave y cómo las nombran. Algunos idiomas son muy conservadores e introducen nuevas palabras clave rara vez o nunca, para evitar romper los programas existentes, mientras que otros idiomas introducen nuevas palabras clave más libremente., requiriendo que los programas existentes cambien los identificadores existentes que entran en conflicto. Un caso de estudio lo brindan las nuevas palabras clave en C11 en comparación con C++11, ambas de 2011; recuerde que en C y C++, los identificadores que comienzan con un guión bajo seguido de una letra mayúscula están reservados:
El comité 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 antiguos. En comparación, el comité C++ (WG21) prefiere hacer nuevas palabras clave como las viejas palabras clave. Por ejemplo, C+11 define un nuevo
thread_local
palabra clave para designar almacenamiento estático local a un hilo. C11 define la nueva palabra clave como_Thread_local.
En la nueva cabecera C11 se indica que hay una definición macro que proporciona el nombre normal:
#define thread_local _Thread_local
Es decir, C11 introdujo la palabra clave _Thread_local
dentro de un conjunto existente de palabras reservadas (aquellas con un determinado prefijo), y luego usó una función separada (procesamiento de macros) para permitir su uso como si fuera eran una nueva palabra clave sin ningún prefijo, mientras que C++11 introduce la palabra clave thread_local
a pesar de que no es una palabra reservada existente, rompiendo cualquier programa que la use, pero sin requerir procesamiento de macros.
Nombres predefinidos
Una noción relacionada con las palabras reservadas son las funciones, métodos, subrutinas, tipos o variables predefinidos, particularmente las rutinas de biblioteca de la biblioteca estándar. Estos son similares en el sentido de que son parte del lenguaje básico y pueden usarse para propósitos similares. Sin embargo, estos difieren en que el nombre de una de estas entidades normalmente se clasifica como un identificador en lugar de una palabra reservada, y no se trata de manera especial en el análisis sintáctico. Además, es posible que el programador no redefina las palabras reservadas, pero las predefinidas a menudo se pueden anular para la extensión de algún ámbito.
Los idiomas varían en cuanto a lo que se proporciona como palabra clave y lo que es predefinido. Algunos lenguajes, por ejemplo, proporcionan palabras clave para operaciones de entrada/salida mientras que en otros son rutinas de biblioteca. En Python (versiones anteriores a la 3.0) y muchos dialectos BASIC, print
es una palabra clave. Por el contrario, los equivalentes de C, Lisp y Python 3.0 printf
, format
y print
son funciones de la biblioteca estándar. De manera similar, en Python anterior a 3.0, None
, True
y False
eran variables predefinidas, pero no palabras reservadas, pero en Python 3.0 sí lo eran. convertido en palabras reservadas.
Definición
Algunos usan los términos "palabra clave" y "palabra reservada" indistintamente, mientras que otros distinguen el uso, por ejemplo, usando "palabra clave" para referirse a una palabra que es especial solo en ciertos contextos pero "palabra reservada" para referirse a una palabra especial que no se puede utilizar como un nombre definido por el usuario. El significado de las palabras clave (y, de hecho, el significado de la noción de palabra clave) difiere mucho de un idioma a otro. Concretamente, en ALGOL 68, las palabras clave se abrochan (en lenguaje estricto, se escriben en negrita) y no son palabras reservadas; la palabra sin abrochar se puede usar como un identificador ordinario.
La "Especificación del lenguaje Java" utiliza el término "palabra clave". El estándar ISO 9899 para el lenguaje de programación C utiliza el término "palabra clave".
En muchos lenguajes, como C y entornos similares como C++, una palabra clave es una palabra reservada que identifica una forma sintáctica. Las palabras utilizadas en construcciones de flujo de control, como if
, then
y else
son palabras clave. En estos lenguajes, las palabras clave tampoco se pueden usar como nombres de variables o funciones.
En algunos idiomas, como ALGOL y Algol 68, las palabras clave no se pueden escribir palabra por palabra, sino que se deben cortar. Esto significa que las palabras clave deben marcarse de alguna manera. P.ej. citándolos o prefijándolos con un carácter especial. Como consecuencia, las palabras clave no son palabras reservadas y, por lo tanto, se puede usar la misma palabra como un identificador normal. Sin embargo, un régimen de definición era no definir las palabras clave y, en su lugar, hacer que fueran simplemente palabras reservadas.
Algunos lenguajes, como PostScript, son extremadamente liberales en este enfoque, lo que permite que las palabras clave principales se redefinan para fines específicos.
En Common Lisp, el término "palabra clave" (o "símbolo de palabra clave") se usa para un tipo especial de símbolo o identificador. A diferencia de otros símbolos, que normalmente representan variables o funciones, las palabras clave son autocomillas y autoevaluación:98 y están internas en el paquete KEYWORD
. Las palabras clave generalmente se usan para etiquetar argumentos con nombre para funciones y para representar valores simbólicos. Los símbolos que nombran funciones, variables, formas especiales y macros en el paquete denominado COMMON-LISP son básicamente palabras reservadas. El efecto de redefinirlos no está definido en ANSI Common Lisp. Vincularlos es posible. Por ejemplo, la expresión (if if case or)
es posible, cuando if
es una variable local. El if
más a la izquierda se refiere al operador if
; los símbolos restantes se interpretan como nombres de variables. Dado que hay un espacio de nombres separado para funciones y variables, if
podría ser una variable local. En Common Lisp, sin embargo, hay dos símbolos especiales que no están en el paquete de palabras clave: los símbolos t
y nil
. Cuando se evalúan como expresiones, se evalúan a sí mismas. No se pueden utilizar como nombres de funciones o variables, por lo que están reservados de facto. (let ((t 42)))
es una expresión bien formada, pero el operador let
no permitirá el uso.
Normalmente, cuando un programador intenta usar una palabra clave para una variable o nombre de función, se activará un error de compilación. En la mayoría de los editores modernos, las palabras clave se configuran automáticamente para tener un color de texto particular para recordar o informar a los programadores que son palabras clave.
En lenguajes con macros o evaluación perezosa, las construcciones de flujo de control como if
se pueden implementar como macros o funciones. En idiomas sin estas características expresivas, generalmente son palabras clave.
Comparativa por idiomas
No todos los idiomas tienen el mismo número de palabras reservadas. Por ejemplo, Java (y otros derivados de C) tiene un complemento bastante escaso de palabras reservadas, aproximadamente 50, mientras que COBOL tiene aproximadamente 400. En el otro extremo del espectro, Prolog puro y PL/I no tienen ninguna.
Desventajas
La definición de palabras reservadas en un idioma plantea problemas. El idioma puede ser difícil de aprender para los nuevos usuarios debido a una larga lista de palabras reservadas para memorizar que no se pueden usar como identificadores. Puede ser difícil ampliar el idioma porque la adición de palabras reservadas para nuevas funciones podría invalidar los programas existentes o, por el contrario, "sobrecargar" de palabras reservadas existentes con nuevos significados puede ser confuso. Portar programas puede ser problemático porque una palabra no reservada por un sistema/compilador puede estar reservada por otro.
Debido a que las palabras reservadas no se pueden usar como identificadores, los usuarios pueden elegir errores ortográficos deliberados de palabras reservadas como identificadores, como clazz
para variables Java de tipo Clase.
Palabras reservadas e independencia de idioma
La especificación de infraestructura de lenguaje común (CLI) de.NET de Microsoft permite combinar código escrito en más de 40 lenguajes de programación diferentes en un producto final. Debido a esto, las colisiones de identificador/palabra reservada pueden ocurrir cuando el código implementado en un idioma intenta ejecutar el código escrito en otro idioma. Por ejemplo, una biblioteca de Visual Basic.NET puede contener una definición de clase como:
Definición de esta clase en Visual Basic. NET:Público Clase esto ' Esta clase hace algo...Final Clase
Si 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&# 39;
es una palabra reservada en C#. Por lo tanto, lo siguiente no se compilará en C#:
// Usando esta clase en C#:esto x = nuevo esto(); // ¡No va a compilar!
Surge un problema similar al acceder a miembros, anular métodos virtuales e identificar espacios de nombres.
Esto se resuelve atropellando. Para solucionar este problema, la especificación permite que el programador (en C#) coloque el signo de arroba antes del identificador, lo que obliga a que el compilador lo considere un identificador en lugar de una palabra reservada:
// Usando esta clase en C#:@ this x = nuevo @ this(); // Will compilar!
Para mantener la coherencia, este uso también está permitido en configuraciones no públicas, como variables locales, nombres de parámetros y miembros privados.
Contenido relacionado
Llamada al sistema
Codificación Huffman
Quatro Pro