web-dev-qa-db-fra.com

Comment les modèles sont-ils gérés dans le système de modules C ++?

Je lis le document Un système de modules pour C++ pour comprendre les modules C++, une fonctionnalité proposée pour C++.

Je ne suis pas en mesure de bien comprendre comment les modèles seront exportés par cette architecture de module.

Des idées?

32
Monku

Actuellement, les implémentations C++ n'ont vraiment que deux "choses" qui correspondent au code: le code source que nous écrivons et éditons, et l'assembly, que le compilateur crache en fonction de la source.

Étant donné que les modèles C++ sont "réifiés", un assembly séparé est craché pour chaque instanciation de modèle. Pour cette raison, aucun assemblage ne peut être produit là où les modèles sont définis, mais uniquement là où ils sont utilisés. C'est pourquoi les modèles doivent être dans des fichiers d'en-tête afin qu'ils puissent être copiés et collés dans le point d'utilisation (c'est tout ce que #include est vraiment).

L'idée est d'avoir une troisième représentation du code. Imaginez qu'en interne le compilateur a une sorte de représentation interne après il a analysé le code mais avant il commence à produire Assembly. La "chose" qu'elle produit est finalement une sorte de représentation d'un arbre de syntaxe abstraite (AST). Il s'agit essentiellement de votre programme, mappé d'un formulaire le plus simple pour les humains à un formulaire le plus simple pour les ordinateurs.

C'est très approximativement l'idée derrière les modules (ou du moins leur implémentation). Vous prenez votre code et crachez une sorte de fichier représentant l'AST. Ceci AST est une représentation complète de votre programme, donc il est complètement sans perte. Il sait tout sur les modèles que vous avez déclarés, et ainsi de suite. Lorsqu'un module est chargé, il charge simplement ce fichier et le compilateur peut l'utiliser exactement comme s'il avait toute la source disponible. Mais, l'étape de transformer une source lisible par l'homme en ceci AST est en fait une étape assez coûteuse. Commencer par AST peut être beaucoup plus rapide.

Si vous n'avez qu'une seule unité de traduction, ce serait plus lent. Après tout, l'analyse -> codegen est toujours plus rapide que l'analyse -> sérialiser -> désérialiser -> codegen. Mais supposons que vous ayez 10 unités de traduction qui incluent toutes le vecteur. Vous analyserez le code dans le vecteur 10 fois. À ce stade, le coût supplémentaire de la sérialisation/désérialisation est compensé par le fait que vous ne devez analyser qu'une seule fois (et la désérialisation peut être effectuée beaucoup plus rapidement que l'analyse; ce format de données sera conçu spécifiquement pour accélérer la désérialisation, tandis que le code source est conçu pour être lisible, rétrocompatible, etc.).

Les en-têtes pré-compilés sont en quelque sorte un aperçu des modules: https://clang.llvm.org/docs/PCHInternals.html

25
Nir Friedman