web-dev-qa-db-fra.com

Pourquoi les concepteurs du langage C ++ continuent-ils de réutiliser des mots clés?

Quel est l'argument principal en faveur de la réutilisation de mots clés courts (et en ajoutant des significations dépendantes du contexte) au lieu de simplement ajouter plus de mots clés?

Est-ce simplement que vous voulez éviter de casser le code existant qui utilise peut-être déjà un nouveau mot-clé proposé, ou y a-t-il une raison plus profonde?

La nouvelle "classe enum" en C++ 11 m'a fait réfléchir, mais c'est une question générale de conception de langage.

63
Andrew Wagner

Est-ce simplement que vous voulez éviter de casser le code existant qui utilise peut-être déjà un nouveau mot-clé proposé, ou y a-t-il une raison plus profonde?

Non, c'est la raison.

Les mots clés, par définition, sont toujours considérés comme des mots clés où qu'ils se trouvent dans la source, ils ne peuvent donc pas être utilisés à d'autres fins. Faire de quelque chose un mot-clé casse tout code qui pourrait utiliser ce jeton comme nom de variable, de fonction ou de type.

Le comité C adopte une approche différente et ajoute de nouveaux mots clés en utilisant _Noms réservés, par ex. _Atomic, _Bool, puis ils ajoutent un nouvel en-tête (<stdatomic.h>, <stdbool.h>) avec une macro plus agréable, afin que vous puissiez choisir d'inclure l'en-tête pour obtenir le nom atomic ou bool, mais il ne sera pas déclaré automatiquement et ne cassera pas le code qui utilise déjà ces noms.

Le comité C++ n'aime pas les macros et souhaite qu'elles soient des mots clés appropriés, donc réutilisez les existantes (comme auto) ou ajoutez des "mots clés" dépendant du contexte (qui ne sont pas vraiment des mots clés, mais sont "identifiants avec une signification spéciale" afin qu'ils peuvent être utilisés pour d'autres choses, comme override) ou utiliser des orthographes étranges qui sont peu susceptibles de heurter le code utilisateur (comme decltype au lieu de l'extension typeof largement prise en charge).

68
Jonathan Wakely

Certaines anciennes langues n'avaient pas du tout de mots-clés, en particulier PL/1

IF IF=THEN THEN BEGIN;
  /* some more code */
END;

était un morceau de code légal, mais complètement illisible. (Regardez aussi dans APL comme exemple de langage de programmation à écriture majoritaire , qui est complètement cryptique à lire quelques mois plus tard, même par l'auteur original du code).

Les familles de langages C et C++ ont un ensemble de mots clés définis par la spécification du langage. Mais il existe des langages très largement utilisés avec des milliards de lignes de code source héritées. Si vous (ou leur comité de normalisation) ajoutez un nouveau mot-clé, il y a un risque de collision avec un programme existant, et comme vous l'avez deviné et d'autres ont répondu, c'est mauvais. Donc, si la norme ajoutée par exemple enum_class en tant que nouveau mot-clé, il est probable que quelqu'un l'aurait déjà utilisé comme identifiant et que cette entité serait mécontente (devoir changer de code lors de l'adoption d'un nouveau standard C++).

C++ est également largement connu pour être analysé lentement (en particulier, car les en-têtes standard comme <vector> tirent des dizaines de milliers de lignes de code source, et parce que les modules ne sont pas encore en C++, et parce que la syntaxe est fortement ambiguë), donc complexifier l'analyseur pour gérer la nouvelle syntaxe n'est pas un gros problème (l'analyse de C++ a toujours été horrible en tous cas). Par exemple, la communauté GCC travaille beaucoup plus dur sur les nouvelles optimisations que sur les nouvelles fonctionnalités C++ (apparemment, les fonctionnalités récentes de la bibliothèque standard C++ nécessitent beaucoup de travail que l'analyse de la nouvelle syntaxe), même si le passage de C++ 03 à C++ 11 a été un énorme saut et a nécessité beaucoup de travail dans le frontend C++. Cela est moins vrai pour le saut C++ 11 à C++ 14.

Certaines autres langues (par exemple, certains dialectes de LISP tels que LISP commun et certains schéma , où vous pouvez redéfinir une macro let ou if , et macros dans homoiconic les langues comme celles-ci sont très très différentes, car fonctionnant sur AST s, à partir de la substitution textuelle brute mécanisme en C ou C++ ...) permet la redéfinition des mots clés existants; lire aussi sur macros hygiéniques . Mais cela peut rendre le code source difficile à comprendre quelques mois plus tard.

17

Est-ce simplement que vous voulez éviter de casser le code existant qui utilise peut-être déjà un nouveau mot-clé proposé, ou y a-t-il une raison plus profonde?

Par définition, un mot-clé est un jeton spécial qui ne peut être utilisé nulle part ailleurs; par conséquent, l'introduction d'un mot-clé rompt tout code utilisant un identifiant avec l'orthographe donnée.

Certaines langues utilisent le terme mot-clé contextuel pour faire référence à des orthographes qui ne sont interprétées comme mot-clé que dans des contextes spécifiques. Si aucun identifiant "sauvage" n'a pu être utilisé auparavant dans ce contexte, alors il est garanti que l'introduction du mot-clé contextuel ne cassera pas le code existant. Par exemple, comme aucun identifiant ne peut apparaître immédiatement après la parenthèse fermante dans une signature de fonction, c'est un endroit où l'on peut introduire des mots-clés dits contextuels (tels que override ou final).

D'un autre côté, dans les endroits où un identifiant était précédemment autorisé, l'ajout d'un mot-clé présente un risque. Par exemple:

  • struct H { my_type f; enum { g }; };: L'utilisation de enum class Plutôt que d'un nouveau mot-clé est due au fait que tout nouveau mot peut être pris par erreur comme le début d'une déclaration de membre de données dans ce contexte; seul un mot-clé est sans ambiguïté (dans LL (1)), et l'introduction d'un nouveau pourrait casser le code.
  • void h() { my_type f; auto x = g(); }: l'utilisation de auto plutôt que d'un nouveau mot-clé est due au fait que tout nouveau Word peut entrer en conflit avec un type existant. C'est encore un choix surprenant, car c'était déjà un mot-clé utilisable dans cette position en C (par défaut au type int) mais sa signification a été modifiée (la justification était la faible probabilité de son usage).

Comme certains l'ont mentionné, les langues peuvent être entièrement conçues sans mots clés (Haskell est assez proche), ou faites de manière à ce que les mots clés puissent être introduits de manière transparente (par exemple, si chaque déclaration commence déjà par un mot clé, l'introduction d'un nouveau mot clé ne peut pas se heurter ). Il arrive juste que C et C++ ne le soient pas, et en fait de nombreux langages de type C.

10
Matthieu M.

Je pense que c'est principalement parce que l'ajout de mots clés cassera le code existant qui se trouve utiliser ce mot clé dans d'autres contextes, comme vous le suggérez.

10
Stefan Haustein