Dans les langages de programmation informatique , un identifiant est un jeton lexical (également appelé symbole , mais à ne pas confondre avec le type de données primitif symbole ) qui désigne les entités du langage. Parmi les types d'entités qu'un identifiant peut désigner figurent les variables , les types de données , les étiquettes , les sous-routines et les modules .
Forme lexicale
Les séquences de caractères qui constituent des identifiants dépendent de la grammaire lexicale de la langue. Une règle courante est celle des séquences alphanumériques , avec le trait de soulignement également autorisé (dans certaines langues, _ n'est pas autorisé), et à la condition qu'il ne puisse pas commencer par un chiffre numérique (pour simplifier le lexicographie en évitant la confusion avec les littéraux entiers ) – donc foo, foo1, foo_bar, _foosont autorisés, mais 1foone l'est pas – c'est la définition utilisée dans les versions antérieures de C et C++ , Python et de nombreux autres langages. Les versions ultérieures de ces langages, ainsi que de nombreux autres langages modernes, prennent en charge beaucoup plus de caractères Unicode dans un identifiant. Cependant, une restriction courante est de ne pas autoriser les caractères d'espacement et les opérateurs de langage ; cela simplifie la tokenisation en la rendant libre et sans contexte . Par exemple, l'interdiction +dans les identifiants en raison de son utilisation comme opération binaire signifie que a+bet a + bpeuvent être tokenisés de la même manière, alors que s'ils étaient autorisés, a+bseraient un identifiant, pas un ajout. Les espaces dans les identifiants sont particulièrement problématiques, car si les espaces sont autorisés dans les identifiants, alors une clause telle que if rainy day then 1est légale, avec rainy daycomme identifiant, mais la tokenisation de cela nécessite le contexte phrastique d'être dans la condition d'une clause if. Certains langages autorisent cependant les espaces dans les identifiants, comme ALGOL 68 et certaines variantes d'ALGOL - par exemple, l'énoncé suivant est valide : real half pi;qui pourrait être saisi comme .real. half pi;(les mots-clés sont représentés en gras, concrètement via stropping ). Dans ALGOL, cela était possible car les mots-clés sont différenciés syntaxiquement, il n'y a donc aucun risque de collision ou d'ambiguïté, les espaces sont éliminés pendant la phase de reconstruction de ligne , et la source a été traitée via une analyse sans scanner , donc le lexing pouvait être sensible au contexte.
Dans la plupart des langues, certaines séquences de caractères ont la forme lexicale d'un identifiant mais sont connues comme des mots-clés – par exemple, ifest souvent un mot-clé pour une clause if, mais a lexicalement la même forme que igou, fooà savoir une séquence de lettres. Ce chevauchement peut être géré de diverses manières : il peut être interdit à ces séquences d'être des identifiants – ce qui simplifie la tokenisation et l'analyse – auquel cas ce sont des mots réservés ; ils peuvent tous deux être autorisés mais distingués d'autres manières, par exemple via le stropping ; ou les séquences de mots-clés peuvent être autorisées comme identifiants et dont le sens est déterminé par le contexte, ce qui nécessite un analyseur lexical sensible au contexte. Les non-mots-clés peuvent également être des mots réservés (interdits comme identifiants), en particulier pour des raisons de compatibilité ascendante , au cas où un mot deviendrait un mot-clé à l'avenir. Dans quelques langues, par exemple PL/1 , la distinction n'est pas claire.
Sémantique
La portée ou l'accessibilité au sein d'un programme d'un identifiant peut être locale ou globale. Un identifiant global est déclaré en dehors des fonctions et est disponible dans tout le programme. Un identifiant local est déclaré dans une fonction spécifique et n'est disponible que dans cette fonction.
Pour les implémentations de langages de programmation qui utilisent un compilateur , les identifiants ne sont souvent que des entités de compilation . En d'autres termes, au moment de l'exécution, le programme compilé contient des références aux adresses mémoire et aux décalages plutôt qu'aux jetons d'identification textuels (ces adresses mémoire, ou décalages, ayant été assignés par le compilateur à chaque identifiant).
Dans les langages qui prennent en charge la réflexion , comme l'évaluation interactive du code source (à l'aide d'un interpréteur ou d'un compilateur incrémental), les identifiants sont également des entités d'exécution, parfois même des objets de première classe qui peuvent être librement manipulés et évalués. En Lisp , on les appelle des symboles .
Les compilateurs et les interprètes n'attribuent généralement aucune signification sémantique à un identifiant en fonction de la séquence de caractères réellement utilisée. Il existe cependant des exceptions. Par exemple :
- En Perl, une variable est indiquée à l'aide d'un préfixe appelé sigil , qui spécifie les aspects de la façon dont la variable est interprétée dans les expressions .
- En Ruby, une variable est automatiquement considérée comme immuable si son identifiant commence par une majuscule.
- En Go , la majuscule de la première lettre du nom d'une variable détermine sa visibilité (majuscule pour public, minuscule pour privé).
Dans certains langages comme Go, l'unicité des identifiants est basée sur leur orthographe et leur visibilité.
En HTML, un identifiant est l'un des attributs possibles d'un élément HTML . Il est unique dans le document.