En los lenguajes de programación informática , un identificador es un token léxico (también llamado símbolo , pero que no debe confundirse con el tipo de datos primitivo símbolo ) que nombra las entidades del lenguaje. Algunos de los tipos de entidades que un identificador puede denotar incluyen variables , tipos de datos , etiquetas , subrutinas y módulos .
Las secuencias de caracteres que constituyen identificadores dependen de la gramática léxica del lenguaje. Una regla común son las secuencias alfanuméricas , con guión bajo también permitido (en algunos lenguajes, _ no está permitido), y con la condición de que no pueda comenzar con un dígito numérico (para simplificar el análisis léxico evitando confundirse con literales enteros ) – por lo que foo, foo1, foo_bar, _foo
están permitidos, pero 1foo
no lo están – esta es la definición utilizada en versiones anteriores de C y C++ , Python y muchos otros lenguajes. Las versiones posteriores de estos lenguajes, junto con muchos otros lenguajes modernos, admiten muchos más caracteres Unicode en un identificador. Sin embargo, una restricción común es no permitir caracteres de espacio en blanco y operadores de lenguaje; esto simplifica la tokenización al hacerla de forma libre y libre de contexto . Por ejemplo, prohibir +
en identificadores debido a su uso como una operación binaria significa que a+b
y a + b
pueden tokenizarse de la misma manera, mientras que si se permitiera, a+b
sería un identificador, no una adición. Los espacios en blanco en los identificadores son particularmente problemáticos, ya que si se permiten espacios en los identificadores, entonces una cláusula como if rainy day then 1
es legal, con rainy day
como identificador, pero tokenizar esto requiere el contexto de frase de estar en la condición de una cláusula if. Sin embargo, algunos lenguajes permiten espacios en los identificadores, como ALGOL 68 y algunas variantes de ALGOL; por ejemplo, la siguiente es una declaración válida: real half pi;
que podría ingresarse como .real. half pi;
(las palabras clave se representan en negrita, concretamente mediante stropping ). En ALGOL esto fue posible porque las palabras clave se diferencian sintácticamente, por lo que no hay riesgo de colisión o ambigüedad, los espacios se eliminan durante la fase de reconstrucción de línea y la fuente se procesó mediante análisis sin escáner , por lo que el análisis léxico podría ser sensible al contexto.
En la mayoría de los lenguajes, algunas secuencias de caracteres tienen la forma léxica de un identificador pero se conocen como palabras clave ; por ejemplo, if
es frecuentemente una palabra clave para una cláusula if, pero léxicamente tiene la misma forma que ig
o, foo
concretamente, una secuencia de letras. Esta superposición se puede manejar de varias maneras: se puede prohibir que sean identificadores, lo que simplifica la tokenización y el análisis, en cuyo caso son palabras reservadas ; se pueden permitir ambas, pero se pueden distinguir de otras maneras, como mediante el stropping; o se pueden permitir secuencias de palabras clave como identificadores y cuyo sentido se determina a partir del contexto, lo que requiere un analizador léxico sensible al contexto. Las palabras que no son palabras clave también pueden ser palabras reservadas (prohibidas como identificadores), en particular para la compatibilidad con versiones posteriores , en caso de que una palabra pueda convertirse en una palabra clave en el futuro. En algunos lenguajes, por ejemplo, PL/1 , la distinción no está clara.
El alcance o la accesibilidad dentro de un programa de un identificador puede ser local o global. Un identificador global se declara fuera de las funciones y está disponible en todo el programa. Un identificador local se declara dentro de una función específica y solo está disponible dentro de esa función. [1]
En las implementaciones de lenguajes de programación que utilizan un compilador , los identificadores suelen ser solo entidades de tiempo de compilación . Es decir, en tiempo de ejecución, el programa compilado contiene referencias a direcciones de memoria y desplazamientos en lugar de tokens de identificadores textuales (estas direcciones de memoria o desplazamientos han sido asignados por el compilador a cada identificador).
En los lenguajes que admiten la reflexión , como la evaluación interactiva del código fuente (mediante un intérprete o un compilador incremental), los identificadores también son entidades de tiempo de ejecución, a veces incluso como objetos de primera clase que se pueden manipular y evaluar libremente. En Lisp , se denominan símbolos .
Los compiladores e intérpretes no suelen asignar ningún significado semántico a un identificador en función de la secuencia de caracteres utilizada. Sin embargo, existen excepciones. Por ejemplo:
En algunos lenguajes como Go, la unicidad de los identificadores se basa en su ortografía y su visibilidad. [2]
En HTML, un identificador es uno de los posibles atributos de un elemento HTML . Es único dentro del documento.