111 votes

C++ Modules - pourquoi ont-ils été supprimés de C++0x ? Seront-ils de retour plus tard ?

Je viens de découvrir cet ancien brouillon C++0x sur les modules en C++0x.

L'idée était de sortir du système actuel .h /.cpp en n'écrivant que des fichiers .cpp qui généreraient ensuite des fichiers de module lors de la compilation, qui seraient ensuite utilisés par les autres fichiers .cpp.

Cela semble être une fonctionnalité vraiment super.

Mais ma question est: pourquoi l'ont-ils retirée de C++0x? Était-ce en raison de trop de difficultés techniques? Manque de temps? Et pensez-vous qu'ils envisageront de travailler dessus pour une version ultérieure de C++?

90voto

lanoxx Points 1407

Brouillon des modules C++ (Spécification technique après C++17)

Un brouillon et plusieurs révisions mises à jour pour la spécification des modules C/C++ ont été publiés par WG21 sur open-std.org. Je ne lierai ici que les documents les plus récents :

  • Projet de travail, Extensions C++ pour les modules N4610 (octobre 2016).
  • Quatrième révision publiée sous le nom de P0142R0 (mars 2016).
  • Formulation pour les modules publiée sous le nom de P0143R2 (mars 2016).
  • L'équipe de clang a publié une deuxième révision de leurs modifications : P0273R1 (octobre 2016).

Les publications de blog suivantes contiennent un résumé des réunions sur les normes et en particulier un résumé de l'état actuel du projet des modules :

Mise à jour : Comme expliqué dans le compte rendu de voyage de Kona que j'ai lié ci-dessus, il existe actuellement deux propositions concurrentes, une de la part de Microsoft et une de la part de Clang. La solution proposée par Microsoft ne permet pas d'exporter les macros, tandis que la solution de l'équipe de Clang supporterait l'exportation des macros. Jusqu'à présent, seul Microsoft a formellement soumis un projet de spécification de module.

Spécification du module proposée par Microsoft

Voici un bref aperçu des concepts les plus importants contenus dans cette proposition. Comme il s'agit d'un projet, cela pourrait encore changer. La nouvelle norme des modules comportera, entre autres, les éléments suivants :

Un mot-clé module pour déclarer un module, plusieurs fichiers peuvent déclarer cela pour construire un module (mais pour chaque module, une seule unité de compilation peut contenir une section export {}) :

module M;

Un mot-clé import pour importer des modules, au lieu de import il pourrait également être décidé d'utiliser using module à la place, de sorte qu'un nouveau mot-clé d'importation pourrait être évité.

import std.io;
import module.submodule;

Une syntaxe export, qui définit les déclarations publiques qui font partie de ce module, les déclarations non-interface qui ne doivent pas être exportées en tant que partie du module seront définies en dehors du bloc d'exportation. Les déclarations peuvent être de n'importe quel type de déclaration en C/C++, c'est-à-dire non seulement des fonctions mais aussi des variables, des structures, des modèles, des espaces de noms et des classes :

export {
    int f(int);
    double g(double, int);

    int foo;

    namespace Calc {
         int add(int a, int b);
    }        
}

void not_exported_function(char* foo);

Un changement important des modules sera que les macros et les définitions de préprocesseur seront localisés dans les modules et ne seront pas exportés. Ainsi, les macros n'auront aucun impact sur les modules importés :

#define FILE "my/file"
import std.io;   //ne sera pas impacté par la définition ci-dessus

Il est important de noter que le système de préprocesseur actuel et les modules pourront coexister et que les en-têtes pourront toujours être utilisés, par exemple pour inclure des macros.

Pour des informations plus détaillées, je suggère de lire le projet.

Modules Clang

Clang a travaillé sur une implémentation des modules qui peut être trouvée sur la page des modules de Clang. Cependant, Clang n'implémente actuellement pas de syntaxe concrète pour les modules, c'est-à-dire que aucune des syntaxes mentionnées ci-dessus n'a été implémentée par Clang. Pour expliquer cela, la page contient la déclaration suivante :

Actuellement, il n'existe pas de syntaxe C ou C++ pour les déclarations d'importation. Clang suivra la proposition des modules dans le comité C++. Consultez la section Inclusions en tant qu'importations pour voir comment les modules sont importés aujourd'hui.

La partie principale qui est actuellement implémentée par Clang est le "langage de carte de modules" qui permet d'écrire des cartes de modules pour le code existant qui utilise encore des fichiers d'en-tête.

Exportations de macros des modules

Comme mentionné ci-dessus, il n'est pas encore clair si les exportations de macros feront partie de la version finale des Modules TS. Dans P0273R1, la syntaxe suivante a été proposée pour l'exportation des macros :

#export define MAX(A,B) ((A) > (B)) ? (A) : (B);

2 votes

Mise à jour de Rapperswil 2018, il y a la proposition fusionnée de Gabriel dos Reis et Richard Smith, p1103r0. botondballo.wordpress.com/2018/06/20/…

71voto

James McNellis Points 193607

À partir de State of C++ Evolution (Post San Francisco 2008), la proposition de modules a été catégorisée comme "Heading for a separate TR:"

Ces sujets sont jugés trop importants pour attendre un autre standard après C++0x avant d'être publiés, mais trop expérimentaux pour être finalisés à temps pour le prochain Standard. Par conséquent, ces fonctionnalités seront livrées par un rapport technique dès que possible.

La proposition de modules n'était tout simplement pas prête et attendre cela aurait retardé l'achèvement du standard C++0x. Elle n'a pas vraiment été supprimée, elle n'a tout simplement jamais été incorporée dans le document de travail.

32voto

Hazy Joe Aardvark Points 1389

Clang est le premier compilateur à commencer à travailler sur les modules même avant que la normalisation ne soit complète. Il n'y a pas encore beaucoup de documentation, mais du code d'exemple peut être trouvé ici :
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/

Quelques commentaires de Douglas Gregor (le développeur qui les implémente) :
http://clang-developers.42468.n3.nabble.com/C-modules-td3619936.html

En théorie, vous pouvez définir un ensemble de macros d'aide comme begin_module, end_module, import_module pour vous protéger de tout changement probable de la syntaxe qui viendra à l'avenir.

EDIT 1:
Douglas Gregor a publié une présentation sur sa mise en œuvre :
http://llvm.org/devmtg/2012-11/Gregor-Modules.pdf?=submit

EDIT 2:
Le support des modules dans clang a été documenté ici :
http://clang.llvm.org/docs/Modules.html

EDIT 3:
Les modules sont désormais pris en charge dans le compilateur C++ de Microsoft également : http://blogs.msdn.com/b/vcblog/archive/2015/12/03/c-modules-in-vs-2015-update-1.aspx

-41voto

Artyom Points 17387
  1. Parce que c'est un très gros changement conceptuel.
  2. Il n'y a pas vraiment besoin car la séparation des sources en h/cpp fait le travail.
  3. Parce que C++ ne définit pas comment les bibliothèques "modules" sont construites. Il laisse cela au développeur du compilateur et au linker.
  4. Les "modules" sont parfois assez dépendants de la plate-forme, par exemple les DLL sont assez différents des objets partagés. Il n'est donc pas si trivial de fusionner entre ces concepts.

79 votes

Il y a certainement un besoin. .h/.cpp est une solution de contournement ridiculement mauvaise et démodée. Un système de modules serait un grand changement, mais c'est apparemment quelque chose que le comité standard considère comme important.

13 votes

Le modèle de construction de l'en-tête est le problème que les modules sont censés résoudre, et non pas la solution. De plus, les modules ne sont pas un remplacement pour les DLL/SOs.

5 votes

Ceci est incorrect: 1. La proposition de module veille à assurer une compatibilité ascendante avec le système d'en-tête existant, de sorte que rien ne casse lorsque les modules seront introduits dans le futur. 2. Le besoin de réduire la complexité du temps de compilation du module d'en-tête d'une complexité O(M*N) à O(M+N) est très bien documenté. 3. La norme du module ne dictera pas comment les modules seront compilés et liés, mais elle ajoute une sémantique claire pour séparer entre l'API privée et publique d'un module. 4. Le format binaire des DLL ou des objets partagés n'est pas affecté par la norme.

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