Symbole (informatique)
En programmation informatique, un symbole est une étiquette apposée sur certains éléments du code objet, du bytecode ou d'un arbre syntaxique abstrait, permettant de les identifier sous cette forme transformée du code source.
Un symbole est très proche d'un identificateur du langage source, mais le concept d'identificateur ne recouvre pas totalement le concept de symbole. Le meilleur exemple en est la décoration de nom effectué par les compilateurs C++ qui consiste à trouver un symbole unique pour un identificateur dont le nom est surchargé.
Le code objet, le bytecode et les arbres syntaxiques abstraits proviennent du processus de compilation, qui consiste à convertir le code source (écrit dans un langage de programmation) en un code exécutable ou bien en une structure plus facilement utilisable par l'ordinateur.
L’exécution symbolique permet d'explorer les chemins d'exécution possibles d'un programme informatique à partir des symboles contenus dans son code source. Elle diffère de l’exécution concrète qui ne suit qu'un seul des chemins possibles.
Les symboles enregistrés dépendent du processus de compilation, de l'étape dans le processus de compilation et du langage de programmation utilisé.
Par exemple, en C, les symboles exportés dans du code objet sont les informations sur les structures (nom, nom et type des champs) (déclarées avec le mot clé struct
), les fonctions globales (nom, nombre et type des paramètres, type de retour) et nom et type des variables globales (non marqués avec le mot clé static
, ou bien marqués avec le mot clé extern
) afin qu'ils puissent être utilisés lors de l'étape d'édition des liens. De même, compiler du code C pour le débogage génère les symboles de débogage qui permettent d'identifier la portion du code source correspondant au code binaire exécuté.
En Java, tous les symboles sont exportés : nom des classes, nom et type des attributs, méthodes (nombre et type des paramètres, type de retour, nom). Ils servent aussi bien à la résolution des noms lors de l'exécution qu'au débogage. Un échec lors de la résolution des noms va déclencher des exceptions telles que ClassNotFoundException
, NoSuchMethodError
ou bien NoSuchFieldError
.