64 votes

Pourquoi le langage C++ les concepteurs de garder ré-utilisant des mots-clés?

Quel est le principal argument en faveur de la ré-utilisation à court de mots-clés (et en ajoutant dépendantes du contexte de significations) au lieu de simplement ajouter plus de mots-clés?

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

Le nouveau "enum class" en C++11 m'a fait penser à cela, mais c'est un langage général de la conception.

68voto

Jonathan Wakely Points 45593

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

Non, c'est la raison.

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

Le C comité de prendre une approche différente et ajouter de nouveaux mots clés à l'aide de _Reserved noms, par exemple, _Atomic, _Bool, puis ils ajoutent un nouvel en-tête (<stdatomic.h>, <stdbool.h>) avec une belle macro, de sorte que vous pouvez choisir d'inclure l'en-tête pour obtenir le nom de l' atomic ou bool, mais il ne sera pas déclarée automatiquement et ne cassera pas le code qui se trouve être à l'aide de ces noms déjà.

Le comité C++ n'aime pas les macros et préférez des mots clés appropriés, afin de re-existants (tels que auto) ou à ajouter en fonction du contexte "mots-clés" (qui ne sont pas vraiment des mots-clés, mais sont des "identificateurs avec une signification particulière", de sorte qu'ils peuvent être utilisés pour d'autres choses, comme override) ou de l'utilisation étrange de l'orthographe qui est rare à entrer en conflit avec le code de l'utilisateur (comme decltype au lieu de le largement pris en charge typeof extension).

17voto

Basile Starynkevitch Points 67055

Certaines langues anciennes n'ont pas de mots clés à tous, en particulier PL/1 , où

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

une partie du code, mais complètement illisible. (Voir aussi dans la VAE comme un exemple de l'écriture pour la plupart des langages de programmation, ce qui est complètement cryptique de lire quelques mois plus tard, même par le code d'origine de l'auteur).

Le C et le C++ langage de la famille ont un ensemble de mots-clés définis par la spécification du langage. Mais il y a très largement utilisé langues, avec des milliards de legs lignes de code source. Si vous (ou leur comité de normalisation) ajouter un nouveau mot-clé, il existe un risque de collision avec un programme existant, et comme vous l'avez deviné et les réponses des autres à ce qui est mauvais. Donc, si la norme ajouté par exemple enum_class un nouveau mot-clé, les chances sont que quelqu'un aurait déjà utilisé comme identificateur, et que l'entité serait malheureux d'avoir à changer leur code lors de l'adoption d'une nouvelle norme C++).

Aussi en C++ est largement connu pour être peu à peu analysée (en particulier, parce que la norme en-têtes comme <vector> sont tirant des dizaines de milliers de lignes de code source, et parce que les modules ne sont pas en C++ encore, et parce que la syntaxe est fortement ambigus), afin de complexifier l'analyseur afin de gérer de nouveaux syntaxe n'est pas une grosse affaire (l'analyse de C++ a toujours été horrible de toute façon). Par exemple, la communauté de GCC travaille beaucoup plus difficile sur de nouvelles optimisations que sur les nouvelles fonctionnalités C++ (apparemment, les caractéristiques récentes de la norme C++ de la bibliothèque nécessite beaucoup de travail et que l'analyse de la nouvelle syntaxe), même si le saut de C++03 pour le C++11 a été un grand saut et a exigé beaucoup de travail dans le C++ frontend. Cela est moins vrai pour le C++11 pour C++14 jump.

Quelques autres langues (par exemple, dans certains dialectes de Lisp comme Common Lisp et certaines Régime, où vous pouvez redéfinir un let ou if macro, et les macros dans homoiconic langues comme ceux-ci sont très différents, depuis l'exploitation sur les ASTs, à partir du brut textuelle de substitution de mécanisme en C ou C++...) permettent la redéfinition des mots-clés existants; lire aussi sur d'hygiène des macros. Mais cela peut rendre le code source difficile à comprendre quelques mois plus tard.

10voto

Stefan Haustein Points 4458

Je pense que c'est principalement parce que l'ajout de mots clés va casser les codes existants qui arrive à utiliser ce mot-clé dans d'autres contextes, comme vous le suggérez.

10voto

Matthieu M. Points 101624

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

Par définition, un mot clé est un jeton spécial qui ne peut pas être utilisée n'importe où ailleurs; en conséquence, l'introduction d'un mot-clé se casse le code qui est arrivé à utiliser un identificateur d'orthographe.

Certaines langues utilisent le terme mot-clé contextuel pour se référer à l'orthographe qui ne sont interprétés comme mot-clé dans des contextes spécifiques. Si pas de "sauvage" de l'identificateur pourrait déjà être utilisés dans ce contexte, il est garanti que l'introduction du mot-clé contextuel ne sera pas briser le code existant. Par exemple, depuis aucun identifiant peut apparaître immédiatement après la clôture parenthese dans une signature de fonction, c'est un endroit où l'on peut introduire soi-disant des mots-clés contextuels (tels que override ou final).

D'autre part, dans les lieux où identificateur est déjà autorisé, l'ajout d'un mot clé présente un risque. Par exemple:

  • struct H { my_type f; enum { g }; };: l'utilisation de l' enum class plutôt que d'un nouveau mot-clé est parce que tout mot nouveau peut être, à tort, considéré comme le début d'un membre de données de déclaration dans ce contexte; seulement un mot-clé est sans ambiguïté (dans LL(1)), et l'introduction d'une nouvelle qu'on pouvait se casser le code.
  • void h() { my_type f; auto x = g(); }: l'utilisation de l' auto plutôt que d'un nouveau mot-clé est parce que tout mot nouveau, pourraient se heurter à un type existant. C'est un choix surprenant encore, car il était déjà un mot-clé utilisable dans cette position en C (par défaut int type), mais son sens a été modifiée (la justification est la faible probabilité de son utilisation).

Comme certains l'ont mentionné, les langues peuvent être conçus sans mots-clés entièrement (Haskell est assez proche), ou fait en sorte que des mots clés peut être introduit de façon transparente (par exemple, si chaque déclaration commence par un mot-clé déjà, l'introduction d'un nouveau mot-clé ne peut pas clash). Il se trouve que le C et le C++ où elle n'a pas fait de la sorte, et en effet beaucoup de C-comme les langues.

-11voto

shawnhcorey Points 1660

Confondu avec enthousiasme de "moins est plus". Il est pensé (à tort) qu'en utilisant moins de mots-clés, les programmeurs ont à apprendre de moins en moins et peut être plus productifs plus rapidement. Mais cela ne crée de la confusion à propos de la syntaxe.

Les "vrais programmeurs Perl préfère visuellement distincts." ---- Larry Wall

En d'autres mots, utilisation d'un mot clé pour une tâche.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X