OVH Cloud OVH Cloud

concepts et règles de nommage dans std

42 réponses
Avatar
fabien.chene
Bonjour,

A la lecture des papiers sur les concepts, je constate que les noms de
concepts standard -- qui seront donc dans le namespace std --
commencent par une majuscule, chaque mot étant séparé par une
majscule. Par exemple std::CopyConstructible.

Je ne sais pas si c'est une tradition ou une règle absolue, mais
jusque là toute la bibliothèque standard est écrite avec la convention
de nommage C «classique» : std::un_composant_standard. Pourquoi en
serait-il autrement pour les concepts ? En tout cas l'entête
<concepts> de conceptgcc n'utilise pas la «convention classique».


J'ai l'impression qu'en C++, la mode consiste à faire débuter les noms
de classe/struct/union/[typedef] par une majuscule, aussi j'aurai eu
tendance à penser que l'usage des minuscules aurait moins cassé de
code ce genre, non ?

#include <concepts>

struct CopyConstructible;
typedef int Assignable;

using namespace std;

template <CopyConstructible T>
where Assignable<T>
void f( T t );

(exemple rejeté par conceptg++)

--
Fab

10 réponses

1 2 3 4 5
Avatar
Gabriel Dos Reis
(Fabien Chêne) writes:

| Gabriel Dos Reis writes:
|
| > (Fabien Chêne) writes:
| >
| > [...]
| >
| > | > Je sais que ma propre implémentation expérimentale (complètement
| > | > différente) [snip]
| > |
| > | En s'y prenant complètement différemment, peut-on arriver à ne pas
| > | trop embourber le parseur, et avoir un temps de compilation
| > | acceptable ?
| >
| > Je ne sais pas. Mais, en spéculant, il faut bien voir que si la
| > pratique actuelle de mettre tout le code dans les entêtes ne changent
| > pas, je ne vois pas de raison d'espérer un temps de compilation peu
| > prohibitive : avec les concepts, le compilateur doit systématiquement
| > vérifier tout le corps d'un template -- ce qu'il ne faisait pas avant.
|
| Les compilateurs qui implémentent « export », ou bien l'optimisation à
| l'édition de lien, et qui vont continuer de fournir un support
| permettant de précompiler des entêtes pour C++0x,

GCC implémente que les gens appellent « entêtes précompilés » (mais
pas « export ») mais je ne suis pas que cela affect la vérification de
types dans les templates.

L'implémentation d'« export » ou l'instantiation à l'édition de lien
n'élimine pas la nécessité de devoir vérifier les types à chaque
instantiations. Les premières implémentations de conceptgcc voulaient
limiter le nombre de vérification de types -- causant tollés et
débats. Le système a significativement évolué depuis pour s'approcher
ce qui a été conventionellement appelé « Texas proposal », donc on
n'est pas encore sorti de l'auberge :-)

| seront à priori bien
| armés pour offrir un temps de compilation acceptable ou non ?

C'est une spéculation qu'il faudrait étayer un peu plus. Tous les
compilateurs C++ ne sont pas structurés de la même manière et il est
difficile d'avancer des assurances and savoir quelque chose de
beaucoup plus concrets sous la main.

| Il me
| semble qu'on est alors pas loin des « modules » ; au passage, si cela
| pouvait éradiquer les entêtes précompilées, quelle joie !
|
| Si l'utilisation des concepts devenait finalement (je lisais à
| l'instant la propositions de D.Gregor sur gcc-patch) un échec du
| point de vue temps de compilation, cela ne serait-il pas finalement un
| pas vers la bonne direction ?

Quelle bonne direction ?

-- Gaby
Avatar
Gabriel Dos Reis
(Fabien Chêne) writes:

| Gabriel Dos Reis writes:
|
| > (Fabien Chêne) writes:
| >
| > [...]
| >
| > | > Je sais que ma propre implémentation expérimentale (complètement
| > | > différente) [snip]
| > |
| > | En s'y prenant complètement différemment, peut-on arriver à ne pas
| > | trop embourber le parseur, et avoir un temps de compilation
| > | acceptable ?
| >
| > Je ne sais pas. Mais, en spéculant, il faut bien voir que si la
| > pratique actuelle de mettre tout le code dans les entêtes ne changent
| > pas, je ne vois pas de raison d'espérer un temps de compilation peu
| > prohibitive : avec les concepts, le compilateur doit systématiquement
| > vérifier tout le corps d'un template -- ce qu'il ne faisait pas avant.
|
| Les compilateurs qui implémentent « export », ou bien l'optimisation à
| l'édition de lien, et qui vont continuer de fournir un support
| permettant de précompiler des entêtes pour C++0x,

GCC implémente ce que les gens appellent « entêtes précompilés » (mais
pas « export ») mais je ne suis pas sûr que cela affecte la
vérification de types dans les templates.

L'implémentation d'« export » ou l'instantiation à l'édition de lien
n'élimine pas la nécessité de vérifier les types à chaque
instantiation. Les premières implémentations de conceptgcc voulaient
limiter le nombre de vérifications de types -- causant tollés et
débats. Le système a significativeament évolué depuis pour s'approcher
de ce qui a été conventionellement appelé « Texas proposal », donc on
n'est pas encore sorti de l'auberge :-)

| seront à priori bien
| armés pour offrir un temps de compilation acceptable ou non ?

C'est une spéculation qu'il faudrait étayer un peu plus. Tous les
compilateurs C++ ne sont pas structurés de la même manière et il est
difficile d'avancer des assurances sans avoir quelque chose de
beaucoup plus concrets sous la main.

| Il me
| semble qu'on est alors pas loin des « modules » ; au passage, si cela
| pouvait éradiquer les entêtes précompilées, quelle joie !
|
| Si l'utilisation des concepts devenait finalement (je lisais à
| l'instant la propositions de D.Gregor sur gcc-patch) un échec du
| point de vue temps de compilation, cela ne serait-il pas finalement un
| pas vers la bonne direction ?

Quelle bonne direction ?

-- Gaby
Avatar
fabien.chene
Gabriel Dos Reis writes:

[...]
| > | > Je sais que ma propre implémentation expérimentale (complètement
| > | > différente) [snip]
| > |
| > | En s'y prenant complètement différemment, peut-on arriver à ne pas
| > | trop embourber le parseur, et avoir un temps de compilation
| > | acceptable ?
| >
| > Je ne sais pas. Mais, en spéculant, il faut bien voir que si la
| > pratique actuelle de mettre tout le code dans les entêtes ne changent
| > pas, je ne vois pas de raison d'espérer un temps de compilation peu
| > prohibitive : avec les concepts, le compilateur doit systématiquement
| > vérifier tout le corps d'un template -- ce qu'il ne faisait pas avant.
|
| Les compilateurs qui implémentent « export », ou bien l'optimisation à
| l'édition de lien, et qui vont continuer de fournir un support
| permettant de précompiler des entêtes pour C++0x,

GCC implémente ce que les gens appellent « entêtes précompilés » (mais
pas « export ») mais je ne suis pas sûr que cela affecte la
vérification de types dans les templates.


Effectivement, sans doute pas. En lisant les recommandations pour
accélérer la compilation avec ConceptGCC, il était indiqué que l'usage
des entêtes précompilées réduisait le temps de compilation
(indépendemment des concepts peut-être).

D. Gregor disait récemment qu'une part importante (50%) de la
compilation provenait de la comparaison de types. Je ne suis donc
définitivement pas sûr que les entêtes précompilées soit utiles dans
ce contexte. Peut-être pourraient-elles permettre de faire certains
prétraitements internes avant la comparaison des types ? Mais ça n'en
vaut peut être pas la peine.

L'implémentation d'« export » ou l'instantiation à l'édition de lien


Je parlais de l'optimisation à l'édition de lien. Sauf erreur, cela
n'implique pas l'instantiation à l'édition de lien. Est-ce pourtant le
cas avec certains compilateurs ? (autres que le futur GCC-4.3/4 avec
LTO)

n'élimine pas la nécessité de vérifier les types à chaque
instantiation.


Non, mais bon, vu que la réduction du nombre d'instances réduit le
coût liés à la vérification des types; on peut quand même dire que des
techniques du genre LTO, IMA seront profitables à une compilation
rapide de codes utilisant les concepts.


| Il me semble qu'on est alors pas loin des « modules » ; au
| passage, si cela pouvait éradiquer les entêtes précompilées,
| quelle joie !
|
| Si l'utilisation des concepts devenait finalement (je lisais à
| l'instant la propositions de D.Gregor sur gcc-patch) un échec du
| point de vue temps de compilation, cela ne serait-il pas finalement un
| pas vers la bonne direction ?

Quelle bonne direction ?


une compilation basée sur des modules, limitant ainsi le nombre
d'instanciation. Du coup je me demandais si C++ n'allait pas
s'orienter vers un modèle de compilation « plusieurs sources en entrée
» ?

--
Fab

Avatar
Gabriel Dos Reis
(Fabien Chêne) writes:

| Gabriel Dos Reis writes:
|
| [...]
| > | > | > Je sais que ma propre implémentation expérimentale (complètement
| > | > | > différente) [snip]
| > | > |
| > | > | En s'y prenant complètement différemment, peut-on arriver à ne pas
| > | > | trop embourber le parseur, et avoir un temps de compilation
| > | > | acceptable ?
| > | >
| > | > Je ne sais pas. Mais, en spéculant, il faut bien voir que si la
| > | > pratique actuelle de mettre tout le code dans les entêtes ne changent
| > | > pas, je ne vois pas de raison d'espérer un temps de compilation peu
| > | > prohibitive : avec les concepts, le compilateur doit systématiquement
| > | > vérifier tout le corps d'un template -- ce qu'il ne faisait pas avant.
| > |
| > | Les compilateurs qui implémentent « export », ou bien l'optimisation à
| > | l'édition de lien, et qui vont continuer de fournir un support
| > | permettant de précompiler des entêtes pour C++0x,
| >
| > GCC implémente ce que les gens appellent « entêtes précompilés » (mais
| > pas « export ») mais je ne suis pas sûr que cela affecte la
| > vérification de types dans les templates.
|
| Effectivement, sans doute pas. En lisant les recommandations pour
| accélérer la compilation avec ConceptGCC, il était indiqué que l'usage
| des entêtes précompilées réduisait le temps de compilation
| (indépendemment des concepts peut-être).

Peut-être.
Cela fait un certain temps que nous utilisons les ent-êtes
pré-compilés dans libstdc++. Je n'ai pas noté une amélioration
impressionante du temps de compilation, à part que cela introduit plus
de problèmes.

| D. Gregor disait récemment qu'une part importante (50%) de la
| compilation provenait de la comparaison de types. Je ne suis donc
| définitivement pas sûr que les entêtes précompilées soit utiles dans
| ce contexte.

En effet. Ce qu'il dit correspond à ce que nous (== GCC/g++) savions
depuis des lustres -- en ne considérant que C++98, C++03. Alors
imagine que maintenant on vérifie encore plus de types qu'avant !
Tu as dû lire les réponsent de Mike Stump donnant référence vers 2002
où il a déjà noté cela. Mark Mitchell l'avait noté avant. Lorsque j'ai
travaillé pour Apple (~ 2002) pour améliorer le temps de compilation,
cela faisait partie des choses que j'avais remrquées aussi.

| Peut-être pourraient-elles permettre de faire certains
| prétraitements internes avant la comparaison des types ? Mais ça n'en
| vaut peut être pas la peine.

Mais cela n'exigerait-il pas une analyse sémantique du programme ?

| > L'implémentation d'« export » ou l'instantiation à l'édition de lien
|
| Je parlais de l'optimisation à l'édition de lien. Sauf erreur, cela
| n'implique pas l'instantiation à l'édition de lien.

Là j'avoue ne pas suivre ton raisonnement. Pourrais-tu détailler ?

| Est-ce pourtant le
| cas avec certains compilateurs ? (autres que le futur GCC-4.3/4 avec
| LTO)
|
| > n'élimine pas la nécessité de vérifier les types à chaque
| > instantiation.
|
| Non, mais bon, vu que la réduction du nombre d'instances réduit le

Pourquoi est-ce que le nombre d'instances serait réduit ?

| coût liés à la vérification des types; on peut quand même dire que des
| techniques du genre LTO, IMA seront profitables à une compilation
| rapide de codes utilisant les concepts.
|
|
| > | Il me semble qu'on est alors pas loin des « modules » ; au
| > | passage, si cela pouvait éradiquer les entêtes précompilées,
| > | quelle joie !
| > |
| > | Si l'utilisation des concepts devenait finalement (je lisais à
| > | l'instant la propositions de D.Gregor sur gcc-patch) un échec du
| > | point de vue temps de compilation, cela ne serait-il pas finalement un
| > | pas vers la bonne direction ?
| >
| > Quelle bonne direction ?
|
| une compilation basée sur des modules, limitant ainsi le nombre
| d'instanciation. Du coup je me demandais si C++ n'allait pas
| s'orienter vers un modèle de compilation « plusieurs sources en entrée
| » ?

« plusieurs sources en entrée » est un détail d'implémentation, et
non une orientation du langage je crois.

-- Gaby
Avatar
Sylvain
Gabriel Dos Reis wrote on 08/11/2006 03:51:

GCC implémente ce que les gens appellent « entêtes précompilés » (mais
pas « export ») mais je ne suis pas sûr que cela affecte la
vérification de types dans les templates.


précompiler un template ?!
c'est une boutade surement ?...

Sylvain.

Avatar
Gabriel Dos Reis
Sylvain writes:

| Gabriel Dos Reis wrote on 08/11/2006 03:51:
| > GCC implémente ce que les gens appellent « entêtes précompilés »
| > (mais
| > pas « export ») mais je ne suis pas sûr que cela affecte la
| > vérification de types dans les templates.
|
| précompiler un template ?!
| c'est une boutade surement ?...

?

-- Gaby
Avatar
fabien.chene
Gabriel Dos Reis writes:

| D. Gregor disait récemment qu'une part importante (50%) de la
| compilation provenait de la comparaison de types. Je ne suis donc
| définitivement pas sûr que les entêtes précompilées soit utiles dans
| ce contexte.

En effet. Ce qu'il dit correspond à ce que nous (== GCC/g++) savions
depuis des lustres -- en ne considérant que C++98, C++03. Alors
imagine que maintenant on vérifie encore plus de types qu'avant !
Tu as dû lire les réponsent de Mike Stump donnant référence vers 2002
où il a déjà noté cela. Mark Mitchell l'avait noté avant. Lorsque j'ai
travaillé pour Apple (~ 2002) pour améliorer le temps de compilation,
cela faisait partie des choses que j'avais remrquées aussi.


J'avoue que la conversation en question est un peu trop technique pour
moi, et je n'ai pas réussi à comprendre pourquoi il était difficile de
prédire l'efficacité du remède « canonical type node ». Vu que tu as
l'air d'en avoir eu l'expérience avec « le Pivot », cela a-t'il été
un réel succès ?

| Peut-être pourraient-elles permettre de faire certains
| prétraitements internes avant la comparaison des types ? Mais ça
| n'en vaut peut être pas la peine.

Mais cela n'exigerait-il pas une analyse sémantique du programme ?


Je crois que oui.

| > L'implémentation d'« export » ou l'instantiation à l'édition de lien
|
| Je parlais de l'optimisation à l'édition de lien. Sauf erreur, cela
| n'implique pas l'instantiation à l'édition de lien.

Là j'avoue ne pas suivre ton raisonnement. Pourrais-tu détailler ?


Je me réfère de mémoire aux papiers décrivant LTO pour GCC, donc ce
n'est surement pas valable pour des compilateurs qui pourraient avoir
adopter une stratégie différente.

Concrètement, sans LTO, on a deux fichiers sources a.cpp et
b.cpp. Tout deux instancient le même template, il y a donc duplication
de l'instance dans les deux TU -- le linker tachera de n'en retenir
qu'une seule.

Avec LTO: a.cpp est compilé dans un .o qui va contenir en supplément,
une forme légèrement modifié du résultat du front-end. b.cpp est
compilé avec a.o (g++ --lto b.cpp a.o). a.o passe par le front-end
« spécial LTO ». b.cpp passe par le front-end C++, et a accès aux
données provenant de a.o. Lorsqu'il voit un template, il va jeter un
oeil dans la table de recherche indexé par les arguments template,
trouve ce template instancié, et donc ne le réinstancie pas.
On a pas eu besoin de différer l'instanciation à l'édition de lien.
Correct ?

| Est-ce pourtant le
| cas avec certains compilateurs ? (autres que le futur GCC-4.3/4 avec
| LTO)
|
| > n'élimine pas la nécessité de vérifier les types à chaque
| > instantiation.
|
| Non, mais bon, vu que la réduction du nombre d'instances réduit le

Pourquoi est-ce que le nombre d'instances serait réduit ?


Par réduit, j'entendais non dupliquées dans diverses TU .

| coût liés à la vérification des types; on peut quand même dire que des
| techniques du genre LTO, IMA seront profitables à une compilation
| rapide de codes utilisant les concepts.
|
|
| > | Il me semble qu'on est alors pas loin des « modules » ; au
| > | passage, si cela pouvait éradiquer les entêtes précompilées,
| > | quelle joie !
| > |
| > | Si l'utilisation des concepts devenait finalement (je lisais à
| > | l'instant la propositions de D.Gregor sur gcc-patch) un échec du
| > | point de vue temps de compilation, cela ne serait-il pas finalement un
| > | pas vers la bonne direction ?
| >
| > Quelle bonne direction ?
|
| une compilation basée sur des modules, limitant ainsi le nombre
| d'instanciation. Du coup je me demandais si C++ n'allait pas
| s'orienter vers un modèle de compilation « plusieurs sources en entrée
| » ?

« plusieurs sources en entrée » est un détail d'implémentation, et
non une orientation du langage je crois.


Vu que cela affecte la manière d'invoquer le compilateur, et surtout
les dépendances; je me demande de quelle implémentation, « plusieurs
sources en entrée », en est un détail ? :-)

--
Fab

Avatar
Gabriel Dos Reis
(Fabien Chêne) writes:

| Gabriel Dos Reis writes:
|
| > | D. Gregor disait récemment qu'une part importante (50%) de la
| > | compilation provenait de la comparaison de types. Je ne suis donc
| > | définitivement pas sûr que les entêtes précompilées soit utiles dans
| > | ce contexte.
| >
| > En effet. Ce qu'il dit correspond à ce que nous (== GCC/g++) savions
| > depuis des lustres -- en ne considérant que C++98, C++03. Alors
| > imagine que maintenant on vérifie encore plus de types qu'avant !
| > Tu as dû lire les réponsent de Mike Stump donnant référence vers 2002
| > où il a déjà noté cela. Mark Mitchell l'avait noté avant. Lorsque j'ai
| > travaillé pour Apple (~ 2002) pour améliorer le temps de compilation,
| > cela faisait partie des choses que j'avais remrquées aussi.
|
| J'avoue que la conversation en question est un peu trop technique pour
| moi, et je n'ai pas réussi à comprendre pourquoi il était difficile de
| prédire l'efficacité du remède « canonical type node ». Vu que tu as
| l'air d'en avoir eu l'expérience avec « le Pivot », cela a-t'il été
| un réel succès ?

Comme je l'ai expliqué, c'est quelque chose que BS et
moi avions discuté et implementé an automne 2004. À l'époque nous
avions mesuré que sur le simple programme « Hello World » classique,
la technique d'unification permettait de construire moins de 90%
d'objets « tree » que GCC (3.4.x). Nous avions fait circuler des
copies du rapport à la réunon de Redmond (certains personnes
impliquées directement dans GCC en avait connaissance). Nous n'avions
pas du tout été surpris que, quelques mois plus tard, une analyse plus
poussée ait été faite par Nathan. Je suis juste un peu surpris que
cela déclenche une discussion aussi animée deux ans plus tard :-)

Les objections que tu as pu lire proviennent des gens « C ». Parce
que le C n'a pas la notion d'ODR et que son système de type est un
peu flou, c'est une technique qui demande plus de précaution à mettre
en oeuvre. Mais, comme je l'ai dit, je ne suis pas trop préoccupé par le C.

Ce système est au coeur du Pivot ; ce n'est pas juste une expérience
comme cela. Nous l'utilisons comme pierre de constructions de base
dans le Pivot.

La notion de représentant canonique est relativement simple. En
quelque sort, elle est la quintescence de l'ODR.

| > | Peut-être pourraient-elles permettre de faire certains
| > | prétraitements internes avant la comparaison des types ? Mais ça
| > | n'en vaut peut être pas la peine.
| >
| > Mais cela n'exigerait-il pas une analyse sémantique du programme ?
|
| Je crois que oui.

Alors, je ne vois pas comment on gagnerait en temps de compilation, si
le compilateur doit faire plus de boulot qu'avant, *et* si les
practiques actuelles ne changent pas.

| > | > L'implémentation d'« export » ou l'instantiation à l'édition de lien
| > |
| > | Je parlais de l'optimisation à l'édition de lien. Sauf erreur, cela
| > | n'implique pas l'instantiation à l'édition de lien.
| >
| > Là j'avoue ne pas suivre ton raisonnement. Pourrais-tu détailler ?
|
| Je me réfère de mémoire aux papiers décrivant LTO pour GCC, donc ce
| n'est surement pas valable pour des compilateurs qui pourraient avoir
| adopter une stratégie différente.
|
| Concrètement, sans LTO, on a deux fichiers sources a.cpp et
| b.cpp. Tout deux instancient le même template, il y a donc duplication
| de l'instance dans les deux TU -- le linker tachera de n'en retenir
| qu'une seule.

Oui.

Remarque bien que le but original de la LTO, qui veut dire « Link Time
Optimizatin », c'est de faire des optimisations au moment de l'édition
de lien. Ce n'est pas quelque conçu en priorité pour C++ et les
templates. Il y a pas de gens sceptiquees voire contre le
fait qu'on s'en serve pour les templates. Mais, je suis du même avis
que Mark Mitchell que si on a cette infrastructure, c'est bête de ne
pas en profiter pour les templates.

| Avec LTO: a.cpp est compilé dans un .o qui va contenir en supplément,
| une forme légèrement modifié du résultat du front-end. b.cpp est
| compilé avec a.o (g++ --lto b.cpp a.o). a.o passe par le front-end
| « spécial LTO ». b.cpp passe par le front-end C++, et a accès aux
| données provenant de a.o. Lorsqu'il voit un template, il va jeter un
| oeil dans la table de recherche indexé par les arguments template,
| trouve ce template instancié, et donc ne le réinstancie pas.

C'est un peu trop simplifié, mais une bonne partie de l'idée est là.

Note bien que maintenant, il va falloir déplacer pratiquement tout le
front-end C++ dans LTO (ou du mois faire partager les fonctionalités).
La raison est que l'instantiation d'un template demande uns analyse
sémantique complète, incluant résolution de surcharges d'opérateurs et
compagnies.
Concrètement, il faudra d'une manière ou d'une autre encoder les
contextes de définitions d'un templates, ainsi que les contextes
d'instantiations pour que lto s'y retrouve.

| On a pas eu besoin de différer l'instanciation à l'édition de lien.
| Correct ?
|
| > | Est-ce pourtant le
| > | cas avec certains compilateurs ? (autres que le futur GCC-4.3/4 avec
| > | LTO)
| > |
| > | > n'élimine pas la nécessité de vérifier les types à chaque
| > | > instantiation.
| > |
| > | Non, mais bon, vu que la réduction du nombre d'instances réduit le
| >
| > Pourquoi est-ce que le nombre d'instances serait réduit ?
|
| Par réduit, j'entendais non dupliquées dans diverses TU .

Le nombres de requêtes d'instantiations ne diminuent pas pour
autant. Il faudra encoder les contextes d'instantiations, et les
combiner, et les comparer plus tard.

[...]

| > | une compilation basée sur des modules, limitant ainsi le nombre
| > | d'instanciation. Du coup je me demandais si C++ n'allait pas
| > | s'orienter vers un modèle de compilation « plusieurs sources en entrée
| > | » ?
| >
| > « plusieurs sources en entrée » est un détail d'implémentation, et
| > non une orientation du langage je crois.
|
| Vu que cela affecte la manière d'invoquer le compilateur, et surtout
| les dépendances; je me demande de quelle implémentation, « plusieurs
| sources en entrée », en est un détail ? :-)

En aucun cas, ce n'est une propriété intrinsèque du langage.

-- Gaby
Avatar
fabien.chene
Gabriel Dos Reis writes:

(Fabien Chêne) writes:

| Gabriel Dos Reis writes:
|
| > | D. Gregor disait récemment qu'une part importante (50%) de la
| > | compilation provenait de la comparaison de types. Je ne suis donc
| > | définitivement pas sûr que les entêtes précompilées soit utiles dans
| > | ce contexte.
| >
| > En effet. Ce qu'il dit correspond à ce que nous (== GCC/g++) savions
| > depuis des lustres -- en ne considérant que C++98, C++03. Alors
| > imagine que maintenant on vérifie encore plus de types qu'avant !
| > Tu as dû lire les réponsent de Mike Stump donnant référence vers 2002
| > où il a déjà noté cela. Mark Mitchell l'avait noté avant. Lorsque j'ai
| > travaillé pour Apple (~ 2002) pour améliorer le temps de compilation,
| > cela faisait partie des choses que j'avais remrquées aussi.
|
| J'avoue que la conversation en question est un peu trop technique pour
| moi, et je n'ai pas réussi à comprendre pourquoi il était difficile de
| prédire l'efficacité du remède « canonical type node ». Vu que tu as
| l'air d'en avoir eu l'expérience avec « le Pivot », cela a-t'il été
| un réel succès ?

Comme je l'ai expliqué, c'est quelque chose que BS et
moi avions discuté et implementé an automne 2004. À l'époque nous
avions mesuré que sur le simple programme « Hello World » classique,
la technique d'unification permettait de construire moins de 90%
d'objets « tree » que GCC (3.4.x).


Je ne suis pas sur de réaliser l'impact de la réduction de N% d'objet
« tree » sur le temps de compilation :-/
Peut-on faire un estimation grossière de la réduction du
temps de compilation sur un programme moyen en utilisant cette
technique ?

Nous avions fait circuler des copies du rapport à la réunon de
Redmond (certains personnes impliquées directement dans GCC en avait
connaissance). Nous n'avions pas du tout été surpris que, quelques
mois plus tard, une analyse plus poussée ait été faite par
Nathan. Je suis juste un peu surpris que cela déclenche une
discussion aussi animée deux ans plus tard :-)


Y a-t'il des traces de ce rapport de Nathan ? Je ne trouve qu'une page
TypeSystem dans le Wiki de GCC concernant cela.

[...]
| > | > L'implémentation d'« export » ou l'instantiation à l'édition de lien
| > |
| > | Je parlais de l'optimisation à l'édition de lien. Sauf erreur, cela
| > | n'implique pas l'instantiation à l'édition de lien.
| >
| > Là j'avoue ne pas suivre ton raisonnement. Pourrais-tu détailler ?
|
| Je me réfère de mémoire aux papiers décrivant LTO pour GCC, donc ce
| n'est surement pas valable pour des compilateurs qui pourraient avoir
| adopter une stratégie différente.
|
| Concrètement, sans LTO, on a deux fichiers sources a.cpp et
| b.cpp. Tout deux instancient le même template, il y a donc duplication
| de l'instance dans les deux TU -- le linker tachera de n'en retenir
| qu'une seule.

Oui.

Remarque bien que le but original de la LTO, qui veut dire « Link Time
Optimizatin », c'est de faire des optimisations au moment de l'édition
de lien. Ce n'est pas quelque conçu en priorité pour C++ et les
templates. Il y a pas de gens sceptiquees voire contre le
fait qu'on s'en serve pour les templates. Mais, je suis du même avis
que Mark Mitchell que si on a cette infrastructure, c'est bête de ne
pas en profiter pour les templates.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


C'est un bénéfice indéniable, mais comme je disais plus bas, on ne
peut profiter de cette infrastructure que si on modifie complètement
la gestion des dépendances, et de l'invocation du compilateur. A
l'heure où je m'intéresse à Boost.Build.V2, il va y avoir des choix
difficiles à faire.

| Avec LTO: a.cpp est compilé dans un .o qui va contenir en supplément,
| une forme légèrement modifié du résultat du front-end. b.cpp est
| compilé avec a.o (g++ --lto b.cpp a.o). a.o passe par le front-end
| « spécial LTO ». b.cpp passe par le front-end C++, et a accès aux
| données provenant de a.o. Lorsqu'il voit un template, il va jeter un
| oeil dans la table de recherche indexé par les arguments template,
| trouve ce template instancié, et donc ne le réinstancie pas.

C'est un peu trop simplifié, mais une bonne partie de l'idée est là.

Note bien que maintenant, il va falloir déplacer pratiquement tout le
front-end C++ dans LTO (ou du mois faire partager les fonctionalités).
La raison est que l'instantiation d'un template demande uns analyse
sémantique complète, incluant résolution de surcharges d'opérateurs et
compagnies.
Concrètement, il faudra d'une manière ou d'une autre encoder les
contextes de définitions d'un templates, ainsi que les contextes
d'instantiations pour que lto s'y retrouve.


C'est bien volontairement -- sous peine de m'emmeler les crayons --
que j'ai omis ces menus détails :-)

| On a pas eu besoin de différer l'instanciation à l'édition de lien.
| Correct ?
|
| > | Est-ce pourtant le
| > | cas avec certains compilateurs ? (autres que le futur GCC-4.3/4 avec
| > | LTO)
| > |
| > | > n'élimine pas la nécessité de vérifier les types à chaque
| > | > instantiation.
| > |
| > | Non, mais bon, vu que la réduction du nombre d'instances réduit le
| >
| > Pourquoi est-ce que le nombre d'instances serait réduit ?
|
| Par réduit, j'entendais non dupliquées dans diverses TU .

Le nombres de requêtes d'instantiations ne diminuent pas pour
autant. Il faudra encoder les contextes d'instantiations, et les
combiner, et les comparer plus tard.


Selon les observations de Dave Abrahams, le temps de compilation d'un
« méta-programme » est corrélé avec le nombre d'instantiation
effective. Est-ce que le fait d'utiliser LTO pour les template (ie de
comparer les contextes d'instantiation, les combiner, les comparer)
pourrait contredire ce résultat, et rendre significatives toutes les
requètes d'instantiation ? -- au lien des seules instantiations
effectives.

| > | une compilation basée sur des modules, limitant ainsi le nombre
| > | d'instanciation. Du coup je me demandais si C++ n'allait pas
| > | s'orienter vers un modèle de compilation « plusieurs sources en entrée
| > | » ?
| >
| > « plusieurs sources en entrée » est un détail d'implémentation, et
| > non une orientation du langage je crois.
|
| Vu que cela affecte la manière d'invoquer le compilateur, et surtout
| les dépendances; je me demande de quelle implémentation, « plusieurs
| sources en entrée », en est un détail ? :-)

En aucun cas, ce n'est une propriété intrinsèque du langage.


Oui.

--
Fab

Avatar
Gabriel Dos Reis
(Fabien Chêne) writes:

[...]

| > Nous avions fait circuler des copies du rapport à la réunon de
| > Redmond (certains personnes impliquées directement dans GCC en avait
| > connaissance). Nous n'avions pas du tout été surpris que, quelques
| > mois plus tard, une analyse plus poussée ait été faite par
| > Nathan. Je suis juste un peu surpris que cela déclenche une
| > discussion aussi animée deux ans plus tard :-)
|
| Y a-t'il des traces de ce rapport de Nathan ? Je ne trouve qu'une page
| TypeSystem dans le Wiki de GCC concernant cela.

Regarde aussi sur le site de CodeSourcery, section publication.

[...]

| > Note bien que maintenant, il va falloir déplacer pratiquement tout le
| > front-end C++ dans LTO (ou du mois faire partager les fonctionalités).
| > La raison est que l'instantiation d'un template demande uns analyse
| > sémantique complète, incluant résolution de surcharges d'opérateurs et
| > compagnies.
| > Concrètement, il faudra d'une manière ou d'une autre encoder les
| > contextes de définitions d'un templates, ainsi que les contextes
| > d'instantiations pour que lto s'y retrouve.
|
| C'est bien volontairement -- sous peine de m'emmeler les crayons --
| que j'ai omis ces menus détails :-)

le problème, c'est que ce ne sont pas des menus détails.

[...]

| Selon les observations de Dave Abrahams, le temps de compilation d'un
| « méta-programme » est corrélé avec le nombre d'instantiation
| effective. Est-ce que le fait d'utiliser LTO pour les template (ie de
| comparer les contextes d'instantiation, les combiner, les comparer)
| pourrait contredire ce résultat, et rendre significatives toutes les
| requètes d'instantiation ? -- au lien des seules instantiations
| effectives.

Il n'y a qu'un moyen sûr de savoir : implémenter et tester.

-- Gaby
1 2 3 4 5