Mot reservé - Reserved word

Dans un langage informatique , un mot réservé (également connu sous le nom d' identifiant réservé ) est un mot qui ne peut pas être utilisé comme identifiant , tel que le nom d'une variable, d'une fonction ou d'une étiquette - il est "réservé d'utilisation". Il s'agit d'une définition syntaxique , et un mot réservé peut n'avoir aucune signification définie par l'utilisateur.

Une notion étroitement liée et souvent confondue est un mot - clé , qui est un mot avec une signification particulière dans un contexte particulier. C'est une définition sémantique . En revanche, les noms dans une bibliothèque standard mais non intégrés dans la langue ne sont pas considérés comme des mots ou des mots-clés réservés. Les termes « mot réservé » et « mot-clé » sont souvent utilisés de manière interchangeable – on peut dire qu'un mot réservé est « réservé pour être utilisé comme mot-clé » – et l'utilisation formelle varie d'une langue à l'autre ; pour cet article, nous distinguons comme ci-dessus.

En général, les mots réservés et les mots-clés n'ont pas besoin de coïncider, mais dans la plupart des langues modernes, les mots-clés sont un sous-ensemble de mots réservés, car cela facilite l'analyse, car les mots-clés ne peuvent pas être confondus avec des identifiants. Dans certains langages, comme C ou Python, les mots réservés et les mots-clés coïncident, tandis que dans d'autres langages, comme Java, tous les mots-clés sont des mots réservés, mais certains mots réservés ne sont pas des mots-clés - ils sont "réservés pour une utilisation future". Dans d'autres langages encore, tels que les langages plus anciens ALGOL , FORTRAN et PL/I , il existe des mots-clés mais pas de mots réservés, les mots-clés étant distingués des identificateurs par d'autres moyens. Cela rend l'analyse plus difficile avec des analyseurs à anticipation nécessaires.

Distinction

Les ensembles de mots réservés et de mots-clés dans une langue coïncident souvent ou sont presque égaux, et la distinction est subtile, de sorte que les termes sont souvent utilisés de manière interchangeable. Cependant, dans un usage prudent, ils sont distingués.

Faire en sorte que les mots-clés soient des mots réservés facilite le lexisme , car une chaîne de caractères sera sans ambiguïté soit un mot-clé, soit un identifiant, sans dépendre du contexte ; ainsi, les mots-clés sont généralement un sous-ensemble de mots réservés. Cependant, les mots réservés n'ont pas besoin d'être des mots-clés - par exemple, en Java, gotoest un mot réservé, mais n'a aucune signification et n'apparaît dans aucune règle de production de la grammaire. Ceci est généralement fait pour la compatibilité ascendante , donc un mot réservé peut devenir un mot-clé dans une future version sans casser les programmes existants.

Inversement, les mots-clés n'ont pas besoin d'être des mots réservés, leur rôle étant compris du contexte, ou ils peuvent être distingués d'une autre manière, comme par stropping . Par exemple, la phrase if = 1est sans ambiguïté dans la plupart des grammaires, car une instruction de contrôle d'une clause if ne peut pas commencer par un =, et est donc autorisée dans certains langages, tels que FORTRAN . Alternativement, dans ALGOL 68 , les mots-clés doivent être tronqués – marqués d'une manière ou d'une autre pour être distingués – dans le langage strict en les listant en gras, et ne sont donc pas des mots réservés. Ainsi dans le langage strict l'expression suivante est légale, car le mot - clé bold if n'entre pas en conflit avec l'identifiant ordinaire if:

si si eq 0 alors 1 fi

Cependant, dans ALGOL 68, il existe également un régime de stropping dans lequel les mots-clés sont des mots réservés, un exemple de la façon dont ces concepts distincts coïncident souvent ; cela est suivi dans de nombreuses langues modernes.

Syntaxe

Un mot réservé est un mot qui "ressemble" à un mot normal, mais n'est pas autorisé à être utilisé comme un mot normal. Formellement, cela signifie qu'il satisfait à la syntaxe lexicale habituelle (syntaxe des mots) des identifiants - par exemple, étant une séquence de lettres - mais ne peut pas être utilisé lorsque des identifiants sont utilisés. Par exemple, le mot ifest généralement un mot réservé, alors qu'il xne l'est généralement pas, de même x = 1qu'une affectation valide, mais if = 1ne l'est pas.

Les mots-clés ont des usages variés, mais se répartissent principalement dans quelques classes : une partie de la grammaire de la phrase (en particulier une règle de production avec des symboles non terminaux ), avec des significations diverses, souvent utilisées pour le flux de contrôle , comme le mot ifdans la plupart des langages procéduraux, une clause conditionnelle et prend (les symboles non terminaux); noms de types primitifs dans un langage prenant en charge un système de types , tels que int; valeurs littérales primitives telles que truepour booléen true ; ou parfois des commandes spéciales comme exit. D'autres utilisations de mots-clés dans des phrases sont pour l'entrée/sortie, telles que print.

Les définitions distinctes sont claires lorsqu'une langue est analysée par une combinaison d'un lexer et d'un analyseur, et que la syntaxe de la langue est générée par une grammaire lexicale pour les mots et une grammaire sans contexte de règles de production pour les phrases. Ceci est courant dans l'analyse des langues modernes, et dans ce cas, les mots-clés sont un sous-ensemble de mots réservés, car ils doivent être distingués des identifiants au niveau du mot (donc des mots réservés) pour être analysés syntaxiquement différemment au niveau de la phrase (en tant que mots-clés).

Dans ce cas, les mots réservés sont définis comme faisant partie de la grammaire lexicale et sont chacun marqués comme un type distinct, distinct des identificateurs. En notation conventionnelle, les mots réservés ifet thenpar exemple sont tokenisés en tant que types IFet THEN, respectivement, tandis que xet ysont tous deux tokenisés en tant que type Identifier.

Les mots-clés, en revanche, apparaissent syntaxiquement dans la grammaire de l'expression, en tant que symboles terminaux . Par exemple, la règle de production d'une expression conditionnelle peut être IF Expression THEN Expression. Dans ce cas IFet THENsont des symboles terminaux, signifiant "un jeton de type IFou THEN, respectivement" - et en raison de la grammaire lexicale, cela signifie la chaîne ifou thendans la source d'origine. Comme exemple de valeur constante primitive, truepeut être un mot-clé représentant la valeur booléenne "true", auquel cas il devrait apparaître dans la grammaire comme une extension possible de la production BinaryExpression, par exemple.

Plages réservées

Au-delà de la réservation de listes de mots spécifiques, certaines langues réservent des plages entières de mots, pour une utilisation en tant qu'espaces privés pour une future version linguistique, différents dialectes, des extensions spécifiques au fournisseur de compilateur, ou pour une utilisation interne par un compilateur, notamment dans la manipulation de noms .

Cela se fait le plus souvent en utilisant un préfixe, souvent un ou plusieurs traits de soulignement . C et C++ sont remarquables à cet égard : C99 réserve les identifiants qui commencent par deux traits de soulignement ou un trait de soulignement suivi d'une lettre majuscule, et réserve en outre les identifiants qui commencent par un seul trait de soulignement (dans les espaces ordinaires et des balises) pour une utilisation dans la portée du fichier ; avec C++03 réserve en outre les identifiants qui contiennent un double trait de soulignement n'importe où - cela permet l'utilisation d'un double trait de soulignement comme séparateur (pour connecter les identifiants d'utilisateur), par exemple.

L'utilisation fréquente d'un double soulignement dans les identifiants internes en Python a donné lieu à l'abréviation dunder ; cela a été inventé par Mark Jackson et indépendamment par Tim Hochberg, à quelques minutes d'intervalle, tous deux en réponse à la même question en 2002.

spécification

La liste des mots réservés et des mots-clés dans une langue est définie lors du développement d'une langue, et les deux font partie de la spécification formelle d'une langue . Généralement, on souhaite minimiser le nombre de mots réservés, pour éviter de restreindre les noms d'identifiants valides. De plus, l'introduction de nouveaux mots réservés interrompt les programmes existants qui utilisent ce mot (il n'est pas rétrocompatible), ce qui est donc évité. Pour éviter cela et assurer la compatibilité ascendante , des mots sont parfois réservés sans avoir d'usage courant (un mot réservé qui n'est pas un mot-clé), car cela permet au mot d'être utilisé à l'avenir sans casser les programmes existants. Alternativement, de nouvelles fonctionnalités de langage peuvent être implémentées en tant que prédéfinies, qui peuvent être remplacées, sans casser ainsi les programmes existants.

Les raisons de la flexibilité incluent le fait de permettre aux fournisseurs de compilateurs d'étendre la spécification en incluant des fonctionnalités non standard, différents dialectes de langage standard pour l'étendre, ou les futures versions du langage pour inclure des fonctionnalités supplémentaires. Par exemple, un langage procédural peut anticiper l'ajout de capacités orientées objet dans une future version ou dans un dialecte, auquel cas on pourrait ajouter des mots-clés comme classou object. Pour tenir compte de cette possibilité, la spécification actuelle peut rendre ces mots réservés, même s'ils ne sont pas actuellement utilisés.

Un exemple notable est en Java , où constet gotosont des mots réservés - ils n'ont aucune signification en Java mais ils ne peuvent pas non plus être utilisés comme identifiants. En réservant les termes, ils peuvent être implémentés dans les futures versions de Java, si vous le souhaitez, sans casser le code source Java plus ancien. Par exemple, il y a eu une proposition en 1999 d'ajouter du C++-like constau langage, ce qui était possible en utilisant le constmot, puisqu'il était réservé mais actuellement inutilisé ; Cependant, cette proposition a été rejetée - notamment parce que même si l' ajout de la fonction ne romprait pas les programmes existants, en utilisant dans la bibliothèque standard (notamment dans des collections) serait compatible briser. JavaScript contient également un certain nombre de mots réservés sans fonctionnalité spéciale ; la liste exacte varie selon la version et le mode.

Les langues diffèrent considérablement par la fréquence à laquelle elles introduisent de nouveaux mots ou mots-clés réservés et la façon dont elles les nomment, certaines langues étant très conservatrices et introduisant rarement ou jamais de nouveaux mots-clés, pour éviter de casser les programmes existants, tandis que d'autres langues introduisent de nouveaux mots-clés plus librement, nécessitant des programmes pour modifier les identifiants existants qui entrent en conflit. Une étude de cas est donnée par de nouveaux mots-clés en C11 par rapport à C++11 , tous deux à partir de 2011 – rappelons qu'en C et C++, les identifiants qui commencent par un trait de soulignement suivi d'une lettre majuscule sont réservés :

Le comité C préfère ne pas créer de nouveaux mots-clés dans l'espace de nom d'utilisateur, car il est généralement prévu que chaque révision de C évitera de casser des programmes C plus anciens. Par comparaison, le comité C++ (WG21) préfère rendre les nouveaux mots-clés aussi normaux que les anciens. Par exemple, C++11 définit un nouveau mot-clé thread_local pour désigner le stockage statique local à un thread. C11 définit le nouveau mot clé comme _Thread_local. Dans le nouvel en-tête C11 <threads.h>, il y a une définition de macro pour fournir le nom d'apparence normale :

#define thread_local _Thread_local

C'est-à-dire que C11 a introduit le mot-clé _Thread_localdans un ensemble existant de mots réservés (ceux avec un certain préfixe), puis a utilisé une fonction distincte (traitement macro) pour permettre son utilisation comme s'il s'agissait d'un nouveau mot-clé sans aucun préfixe, tandis que C+ +11 introduit le mot-clé thread_localbien qu'il ne s'agisse pas d'un mot réservé existant, brisant tous les programmes qui l'utilisaient, mais sans nécessiter de traitement de macro.

Noms prédéfinis

Une notion liée aux mots réservés est celle des fonctions, méthodes, sous-routines ou variables prédéfinies, en particulier les routines de bibliothèque de la bibliothèque standard. Ceux-ci sont similaires dans la mesure où ils font partie du langage de base et peuvent être utilisés à des fins similaires. Cependant, ceux-ci diffèrent en ce que le nom d'une fonction, d'une méthode ou d'un sous-programme prédéfinis est généralement classé comme un identifiant au lieu d'un mot réservé, et n'est pas traité spécialement dans l'analyse syntaxique. De plus, les mots réservés peuvent ne pas être redéfinis par le programmeur, mais les mots prédéfinis peuvent souvent être remplacés dans une certaine mesure.

Les langues varient quant à ce qui est fourni comme mot-clé et ce qui est prédéfini. Certains langages, par exemple, fournissent des mots-clés pour les opérations d'entrée/sortie alors que dans d'autres, ce sont des routines de bibliothèque. En Python (versions antérieures à 3.0) et dans de nombreux dialectes BASIC , printest un mot-clé. En revanche, les équivalents C, Lisp et Python 3.0 printf, format, et printsont des fonctions de la bibliothèque standard. De même, dans Python avant 3.0, None, True, et Falseétaient des variables prédéfinies, mais pas des mots réservés, mais dans Python 3.0, ils étaient transformés en mots réservés.

Définition

Certains utilisent les termes « mot-clé » et « mot réservé » de manière interchangeable, tandis que d'autres distinguent l'usage, par exemple en utilisant « mot-clé » pour signifier un mot qui n'est spécial que dans certains contextes mais « mot réservé » pour signifier un mot spécial qui ne peut pas être utilisé en tant que nom défini par l'utilisateur. La signification des mots-clés — et, en fait, la signification de la notion de mot - clé — diffère largement d'une langue à l'autre. Concrètement, dans ALGOL 68, les mots-clés sont tronqués (au strict, écrits en gras) et ne sont pas des mots réservés – le mot non tronqué peut être utilisé comme un identifiant ordinaire.

La « Spécification du langage Java » utilise le terme « mot-clé ». La norme ISO 9899 pour le langage de programmation C utilise le terme "mot-clé".

Dans de nombreux langages, tels que C et des environnements similaires comme C++ , un mot - clé est un mot réservé qui identifie une forme syntaxique. Les mots utilisés dans les constructions de flux de contrôle , tels que if , then, et elsesont des mots clés. Dans ces langages, les mots-clés ne peuvent pas non plus être utilisés comme noms de variables ou de fonctions.

Dans certains langages, comme ALGOL et Algol 68 , les mots-clés ne peuvent pas être écrits textuellement, mais doivent être raccourcis . Cela signifie que les mots-clés doivent être marqués d'une manière ou d'une autre. Par exemple en les citant ou en les préfixant par un caractère spécial. Par conséquent, les mots-clés ne sont pas des mots réservés et le même mot peut donc être utilisé comme identifiant normal. Cependant, un régime de stropping consistait à ne pas rogner les mots-clés et à les faire simplement des mots réservés.

Certains langages, tels que PostScript , sont extrêmement libéraux dans cette approche, permettant de redéfinir les mots-clés principaux à des fins spécifiques.

Dans Common Lisp , le terme "mot-clé" (ou "symbole de mot-clé") est utilisé pour un type spécial de symbole ou d'identifiant. Contrairement à d'autres symboles, qui représentent généralement des variables ou des fonctions, les mots-clés sont auto- citants et auto-évalués :98 et sont intégrés dans le package KEYWORD . Les mots-clés sont généralement utilisés pour étiqueter les arguments nommés des fonctions et pour représenter des valeurs symboliques. Les symboles qui nomment les fonctions, les variables, les formulaires spéciaux et les macros dans le package nommé COMMON-LISP sont essentiellement des mots réservés. L'effet de leur redéfinition n'est pas défini dans ANSI Common Lisp. Les lier est possible. Par exemple, l'expression (if if case or)est possible, quand ifest une variable locale. Le plus ifà gauche fait référence à l' ifopérateur ; les symboles restants sont interprétés comme des noms de variables. Puisqu'il existe un espace de noms distinct pour les fonctions et les variables, il ifpourrait s'agir d'une variable locale. Dans Common Lisp, cependant, il y a deux symboles spéciaux qui ne sont pas dans le package de mots-clés : les symboles tet nil. Lorsqu'elles sont évaluées en tant qu'expressions, elles s'évaluent par elles-mêmes. Ils ne peuvent pas être utilisés comme noms de fonctions ou de variables, ils sont donc de facto réservés. (let ((t 42)))est une expression bien formée, mais l' letopérateur n'autorisera pas l'utilisation.

Généralement, lorsqu'un programmeur tente d'utiliser un mot-clé pour une variable ou un nom de fonction, une erreur de compilation est déclenchée. Dans la plupart des éditeurs modernes, les mots-clés sont automatiquement définis pour avoir une couleur de texte particulière pour rappeler ou informer les programmeurs qu'ils sont des mots-clés.

Dans les langages avec des macros ou une évaluation paresseuse , les constructions de flux de contrôle telles que ifpeuvent être implémentées sous forme de macros ou de fonctions. Dans les langues sans ces caractéristiques expressives, ce sont généralement des mots-clés.

Comparaison par langues

Toutes les langues n'ont pas le même nombre de mots réservés. Par exemple, Java (et d'autres dérivés du C ) a un complément assez clairsemé de mots réservés - environ 50 - alors que COBOL en a environ 400. À l'autre extrémité du spectre, Prolog pur et PL/I n'en ont aucun.

Le nombre de mots réservés dans une langue a peu à voir avec la « puissance » d'une langue. COBOL a été conçu dans les années 1950 comme un langage des affaires et a été conçu pour s'auto-documenter en utilisant des éléments structurels de type anglais tels que des verbes, des clauses, des phrases, des sections et des divisions. C, d'autre part, a été écrit pour être très concis (syntaxiquement) et pour obtenir plus de texte à l'écran. Par exemple, comparez les blocs de code équivalents de C et COBOL pour calculer les gains hebdomadaires :

      // Calculation in C:
      
      if (salaried)
              amount = 40 * payrate;
      else
              amount = hours * payrate;
      *> Calculation in COBOL:
      
      IF Salaried THEN
              MULTIPLY Payrate BY 40 GIVING Amount
      ELSE
              MULTIPLY Payrate BY Hours GIVING Amount
      END-IF.
      *> Other example of calculation in COBOL:
      
      IF Salaried 
              COMPUTE Amount = Payrate * 40
      ELSE
              COMPUTE Amount = hours * payrate
      END-IF.

La logique pure Prolog est exprimée en termes de relations, et l'exécution est déclenchée en exécutant des requêtes sur ces relations. Les constructions telles que les boucles sont implémentées à l'aide de relations récursives.

Ces trois langues peuvent résoudre les mêmes types de « problèmes » même si elles ont un nombre différent de mots réservés. Ce « pouvoir » se rapporte à leur appartenance à l'ensemble des langages Turing-complets .

Désavantages

La définition de mots réservés dans une langue pose problème. La langue peut être difficile à apprendre pour les nouveaux utilisateurs en raison d'une longue liste de mots réservés à mémoriser qui ne peuvent pas être utilisés comme identifiants. Il peut être difficile d'étendre la langue car l'ajout de mots réservés pour de nouvelles fonctionnalités peut invalider des programmes existants ou, à l'inverse, la "surcharge" de mots réservés existants avec de nouvelles significations peut être source de confusion. Le portage de programmes peut être problématique car un mot non réservé par un système/compilateur peut être réservé par un autre.

Mots réservés et indépendance linguistique

La spécification .NET Common Language Infrastructure (CLI) de Microsoft permet de combiner le code écrit dans plus de 40 langages de programmation différents dans un produit final. De ce fait, des collisions identifiant/mot réservé peuvent se produire lorsqu'un code implémenté dans un langage tente d'exécuter du code écrit dans un autre langage. Par exemple, une bibliothèque Visual Basic.NET peut contenir une définition de classe telle que :

' Class Definition of This in Visual Basic.NET:

Public Class this
        ' This class does something...
End Class

Si celui-ci est compilé et distribué dans le cadre d'une boîte à outils, un programmeur C# , souhaitant définir une variable de type « this» rencontrerait un problème : 'this'est un mot réservé en C#. Ainsi, les éléments suivants ne seront pas compilés en C# :

// Using This Class in C#:

this x = new this();  // Won't compile!

Un problème similaire se pose lors de l'accès aux membres, du remplacement des méthodes virtuelles et de l'identification des espaces de noms.

Ceci est résolu par stropping . Afin de contourner ce problème, la spécification permet au programmeur (en C#) de placer le signe at avant l'identifiant, ce qui le force à être considéré comme un identifiant plutôt qu'un mot réservé par le compilateur :

// Using This Class in C#:

@this x = new @this();  // Will compile!

Par souci de cohérence, cette utilisation est également autorisée dans les paramètres non publics tels que les variables locales, les noms de paramètres et les membres privés.

Voir également

Les références