stringtranslate.com

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 una variable, función o etiqueta ; está "reservada para su uso". Esta es una definición sintáctica y es posible que una palabra reservada no tenga un significado definido por el usuario.

Una noción estrechamente relacionada y a menudo combinada es la de palabra clave , que es una palabra con un significado especial en un contexto particular. Ésta es una definición semántica . Por el contrario, los nombres de una biblioteca estándar pero no integrados en un idioma no se consideran palabras reservadas ni palabras clave. Los términos "palabra reservada" y "palabra clave" se utilizan a menudo indistintamente (se puede decir que una palabra reservada está "reservada para su uso 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 lenguajes modernos las palabras clave son un subconjunto de palabras reservadas, ya que esto 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, quedando reservadas para uso futuro. En otros idiomas, 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, con un uso cuidadoso se distinguen.

Hacer que las palabras clave sean palabras reservadas facilita la lectura , ya que una cadena de caracteres será sin ambigüedades una palabra clave o un identificador, sin depender del contexto; por tanto, las palabras clave suelen ser un subconjunto de palabras reservadas. Sin embargo, las palabras reservadas no tienen por qué ser palabras clave. Por ejemplo, en Java, gotoes 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 dañar los programas existentes.

Por el contrario, las palabras clave no tienen por qué ser palabras reservadas, cuya función se entiende a partir del contexto, o pueden distinguirse de otra manera, como por acentuación . Por ejemplo, la frase if = 1no 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 deben estar delimitadas (marcadas de alguna manera para distinguirlas) en el lenguaje estricto enumerándolas en negrita y, por lo tanto, no son palabras reservadas. Así, en el lenguaje estricto la siguiente expresión es legal, como palabra clave en negrita si 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 delimitación 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 utilizarla como palabra normal. Formalmente, esto significa que satisface la sintaxis léxica habitual (sintaxis de palabras) de los identificadores (por ejemplo, ser una secuencia de letras), pero no se puede utilizar cuando se utilizan identificadores. Por ejemplo, la palabra ifes comúnmente una palabra reservada, aunque xgeneralmente no lo es, por lo que x = 1es una asignación válida, pero if = 1no lo es.

Las palabras clave tienen usos variados, pero principalmente se dividen en algunas clases: parte de la gramática de la frase (específicamente una regla de producción con símbolos no terminales ), con varios significados, que a menudo se usa para controlar el flujo , como la palabra ifen la mayoría de los lenguajes procedimentales, que indica una cláusula condicional y toma (los símbolos no terminales); nombres de tipos primitivos en un lenguaje que soporta un sistema de tipos , como por ejemplo int; valores literales primitivos como truebooleanos verdaderos; 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 lexer y un analizador, y la sintaxis del idioma se genera mediante una gramática léxica para las palabras y una gramática libre de contexto de reglas de producción para las 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 de ellas se tokeniza como un tipo separado, distinto de los identificadores. En notación convencional, las palabras reservadas ify, thenpor ejemplo, se tokenizan como tipos IFy THEN, respectivamente, mientras que xy yambas se tokenizan como tipo Identifier.

Las palabras clave, por el contrario, aparecen sintácticamente en la gramática de la frase, 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 THENson símbolos terminales, que significan "un token de tipo IFo THEN, respectivamente", y debido a la gramática léxica, esto significa la cadena ifo thenen la fuente original. Como ejemplo de un valor constante primitivo, truepuede ser una palabra clave que represente el valor booleano "verdadero", 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 su uso 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 manipulación de nombres .

La mayoría de las veces, esto se hace mediante el uso de 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 su uso en el ámbito del archivo ; [1] con C++03 reserva aún más identificadores que contienen un guión bajo doble en cualquier lugar [2] ; esto permite el uso de un guión bajo doble como separador (para conectar identificadores de usuario), por ejemplo.

El uso frecuente de guiones bajos dobles en identificadores internos en Python dio lugar a la abreviatura dunder; esto fue acuñado por Mark Jackson [3] e independientemente por Tim Hochberg, [4] con minutos de diferencia, ambos en respuesta a la misma pregunta en 2002. [5] [6]

Especificación

La lista de palabras reservadas y palabras clave en un idioma se define cuando se desarrolla un idioma y ambas forman parte de la especificación formal de un idioma . Generalmente se desea 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 interrumpe los programas existentes que usan esa palabra (no es compatible con versiones anteriores), por lo que 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, se pueden implementar nuevas características del lenguaje como predefinidas, que pueden anularse, sin dañar los programas existentes.

Las razones de la flexibilidad incluyen permitir a los proveedores de compiladores ampliar la especificación incluyendo características no estándar, diferentes dialectos estándar del lenguaje para ampliarla o versiones futuras del lenguaje para incluir características 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 cual se podrían agregar palabras clave como classo object. Para dar cabida a esta posibilidad, la especificación actual puede incluir estas palabras reservadas, incluso si no se utilizan actualmente.

Un ejemplo notable es 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 hubo una propuesta para agregar un lenguaje similar a C++ constal lenguaje, lo cual era posible usando la constpalabra, ya que estaba reservada pero actualmente no se usaba; sin embargo, esta propuesta fue rechazada, en particular 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. [7] 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. [8]

Los idiomas difieren significativamente en la frecuencia con la que introducen nuevas palabras reservadas o palabras clave y en 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 las existentes. programas para cambiar los identificadores existentes que entran en conflicto. Un estudio de caso lo ofrecen 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: [9]

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 más antiguos. En comparación, el comité C++ (WG21) prefiere que las nuevas palabras clave tengan un aspecto tan normal como las palabras clave antiguas. Por ejemplo, C++ 11 define una nueva thread_localpalabra clave para designar almacenamiento estático local para un subproceso. C11 define la nueva palabra clave como _Thread_local.En el nuevo encabezado C11 <threads.h>, hay una definición de macro para proporcionar el nombre de apariencia normal: [10]

#define thread_local _Thread_local

Es decir, C11 introdujo la palabra clave _Thread_localdentro 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 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, rompiendo cualquier programa que la use, pero sin requerir procesamiento de macros.

Nombres predefinidos

Una noción relacionada con las palabras reservadas son funciones, métodos, subrutinas, tipos o variables predefinidos, particularmente rutinas de biblioteca de la biblioteca estándar. Son similares en el sentido de que forman parte del lenguaje básico y pueden usarse para propósitos similares. Sin embargo, 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 especialmente en el análisis sintáctico. Además, es posible que el programador no redefina las palabras reservadas, pero las predefinidas a menudo pueden anularse hasta cierto punto .

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 BASICprint , es una palabra clave. Por el contrario, los equivalentes de C, Lisp y Python 3.0 printf, formaty printson funciones de la biblioteca estándar. De manera similar, en Python anterior a 3.0, None, Truey Falseeran variables predefinidas, pero no palabras reservadas, pero en Python 3.0 se convirtieron en palabras reservadas. [11]

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 usar. como un nombre definido por el usuario. El significado de las palabras clave y el significado de la noción de palabra clave difieren ampliamente de un idioma a otro. Concretamente, en ALGOL 68, las palabras clave están delimitadas (en lenguaje estricto, escritas en negrita) y no son palabras reservadas: la palabra sin delimitar se puede utilizar como un identificador ordinario.

La " Especificación del lenguaje Java " utiliza el término "palabra clave". [12] El estándar ISO 9899 para el lenguaje C utiliza el término "palabra clave". [13]

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, theny elseson palabras clave. En estos idiomas, las palabras clave tampoco se pueden utilizar como nombres de variables o funciones.

En algunos lenguajes, como ALGOL y ALGOL 68 , las palabras clave no se pueden escribir palabra por palabra, sino que se deben acortar . Esto significa que las palabras clave deben marcarse de alguna manera. Por ejemplo, citándolos o anteponiéndolos con un carácter especial. Como consecuencia, las palabras clave no son palabras reservadas y, por lo tanto, la misma palabra se puede utilizar como identificador normal. Sin embargo, un régimen de limitación consistía en no limitar las palabras clave y, en su lugar, hacer que fueran simplemente palabras reservadas.

Algunos lenguajes, como PostScript , son extremadamente liberales en este enfoque, permitiendo redefinir las palabras clave principales para propósitos específicos.

En Common Lisp , el término "palabra clave" (o "símbolo de palabra clave") se utiliza para un tipo especial de símbolo o identificador. A diferencia de otros símbolos, que normalmente representan variables o funciones, las palabras clave se citan y se autoevalúan [14] :98 y están internadas en el KEYWORDpaquete. [15] Las palabras clave se utilizan generalmente para etiquetar argumentos con nombre de 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. [16] Es posible vincularlos. Por ejemplo, la expresión (if if case or)es posible cuando ifes una variable local. El extremo izquierdo ifse refiere al ifoperador; los símbolos restantes se interpretan como nombres de variables. Dado que existe un espacio de nombres separado para funciones y variables, ifpodrí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 ty nil. Cuando se evalúan como expresiones, se evalúan a sí mismos. No se pueden utilizar como nombres de funciones o variables, por lo que de facto están reservados. (let ((t 42)))es una expresión bien formada, pero el letoperador no permitirá su uso.

Normalmente, cuando un programador intenta utilizar 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 que tengan un color de texto particular para recordar o informar a los programadores que son palabras clave.

En lenguajes con macros o evaluación diferida , las construcciones de flujo de control como se ifpueden implementar como macros o funciones. En idiomas sin estas características expresivas, generalmente son palabras clave.

Comparación por idiomas

Los diferentes idiomas suelen tener un número muy variable de palabras reservadas. Por ejemplo, COBOL tiene alrededor de 400. Java y otros derivados de C tienen un conjunto bastante escaso, alrededor de 50. Pure Prolog y PL/I no tienen ninguno.

Desventajas

La definición de palabras reservadas en un idioma plantea problemas. El idioma puede resultar difícil de aprender para los nuevos usuarios debido a una larga lista de palabras reservadas para memorizar que no se pueden utilizar como identificadores. Puede resultar difícil ampliar el lenguaje porque 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 ser problemática porque una palabra no reservada por un sistema o 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 en las palabras reservadas como identificadores, como clazzpara las variables Java de tipo Class. [17]

Palabras reservadas e independencia del idioma.

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 ocurrir colisiones entre identificadores y palabras reservadas cuando el código implementado en un idioma intenta ejecutar código escrito en otro idioma. Por ejemplo, una biblioteca de Visual Basic (.NET) puede contener una definición de clase como por ejemplo:

' Definición de clase de This en Visual Basic.NET:Clase pública this ' Esta clase hace algo... Fin de 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'es una palabra reservada en C#. Por lo tanto, lo siguiente no se compilará en C#:

// Usando esta clase en C#:este x = nuevo esto (); // ¡No se compilará!     

Surge un problema similar al acceder a miembros, anular métodos virtuales e identificar espacios de nombres.

Esto se soluciona frotando . Para solucionar este problema, la especificación permite colocar (en C#) 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 (); // ¡Se compilará!     

Por coherencia, este uso también se permite en entornos no públicos, como variables locales, nombres de parámetros y miembros privados.

Ver también

Referencias

  1. ^ Especificación C99, 7.1.3 Identificadores reservados
  2. ^ Especificación C++03, 17.4.3.2.1 Nombres globales [lib.global.names]
  3. ^ Jackson, Mark (26 de septiembre de 2002). "¿Cómo se pronuncia "__" (doble guión bajo)?". python-list (lista de correo) . Consultado el 9 de noviembre de 2014 .
  4. ^ Hochberg, Tim (26 de septiembre de 2002). "¿Cómo se pronuncia "__" (doble guión bajo)?". python-list (lista de correo) . Consultado el 9 de noviembre de 2014 .
  5. ^ "DunderAlias ​​- Wiki de Python". wiki.python.org .
  6. ^ Notz, Pat (26 de septiembre de 2002). "¿Cómo se pronuncia "__" (doble guión bajo)?". python-list (lista de correo) . Consultado el 9 de noviembre de 2014 .
  7. ^ "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 .
  8. ^ "Gramática léxica - JavaScript | MDN". desarrollador.mozilla.org . 8 de noviembre de 2023.
  9. ^ Especificación C99, 7.1.3 Identificadores reservados: "Todos los identificadores que comienzan con un guión bajo y una letra mayúscula u otro guión bajo siempre están reservados para cualquier uso".
  10. ^ C11: El nuevo estándar C, Thomas Plum, "Una nota sobre las palabras clave"
  11. ^ "La historia de Ninguno, Verdadero y Falso (y una explicación de los literales, las palabras clave y las funciones integradas)", La historia de Python, 10 de noviembre de 2013, Guido van Rossum
  12. ^ "La especificación del lenguaje Java, tercera edición, sección 3.9: palabras clave". Microsistemas solares . 2000 . Consultado el 17 de junio de 2009 . Las siguientes secuencias de caracteres, formadas a partir de letras ASCII, están reservadas para su uso como palabras clave y no pueden usarse como identificadores[...]
  13. ^ "ISO/IEC 9899:TC3, Sección 6.4.1: Palabras clave" (PDF) . Organización Internacional de Normalización JTC1/SC22/WG14. 2007-09-07. Los tokens anteriores (distinguen entre mayúsculas y minúsculas) están reservados (en las fases de traducción 7 y 8) para su uso como palabras clave y no se utilizarán de otro modo.
  14. ^ Peter Norvig : Paradigmas de la programación de inteligencia artificial: estudios de caso en Common Lisp , Morgan Kaufmann, 1991, ISBN 1-55860-191-0 , Web 
  15. ^ Escriba PALABRA CLAVE de Common Lisp HyperSpec
  16. ^ "CLHS: Sección 11.1.2.1.2". www.lispworks.com .
  17. ^ Zammetti, Frank (2007). Proyectos prácticos de JavaScript, DOM Scripting y Ajax. Presione . ISBN 9781430201977.