|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
![]() ![]() ![]() Hinault RomaricConsultant Inscription : janvier 2007 Messages : 2 832 ![]() |
Comment améliorer le temps de compilation pour C/C++ ?
Apple propose un système de modules pour remplacer les en-têtes Un des problèmes assez décriés des langages C et C++ est le temps de compilation, qui est un peu plus long. Cela est surtout dû à l’utilisation des en-entêtes (headers). Les développeurs d’Apple viennent de proposer un document assez intéressant qui introduit un système de modules pour C et C++ afin d’améliorer le temps de compilation. À titre d’exemple, Apple cite le minuscule code source de « Hello world » en C : quatre lignes de code seulement. Pourtant, le fichier d’en-tête nécessaire pour sa compilation est 173 fois plus grand que l’application elle-même. Cela est encore plus grave avec C++, où les en-têtes standards nécessaires pour compiler le petit « Hello world » sont 14 300 fois supérieures au code du programme même. Ce sont beaucoup d’informations que le compilateur doit manipuler pour exécuter le programme le plus simple du monde. ![]() L’équipe du compilateur LLVM d’Apple a élaboré une proposition sérieuse reposant sur des modules. Un module est présenté comme un ensemble décrivant une bibliothèque : une interface de la bibliothèque (API) ; une mise en place de la bibliothèque. Ce sera un changement assez important dans ces langages en cas d’adoption de cette proposition, car les en-têtes seront remplacées par des modules. Mais le gain en temps de compilation est également assez important. Source : La proposition d'Apple en PDF Et vous ? Qu'en pensez-vous ?
__________________
Si déboguer est l’art de corriger les bugs, alors programmer est l’art d’en faire ![]() Mon blog Mes articles En posant correctement votre problème, on trouve la moitié de la solution |
|
63
|
|
|
#2 |
|
Membre chevronné
![]() Claude Développeur .NET Inscription : juin 2007 Messages : 197 ![]() |
Qu'en pensez-vous ?
Je vois pas trop la "nouveauté" ici dans la mesure où leur document n'a pas l'air (très) différent du draft de C++11 concernant les modules : http://www.open-std.org/jtc1/sc22/wg...2006/n2073.pdf. |
|
|
81
|
|
|
#3 | |
|
Membre chevronné
![]() Développeur informatique Inscription : janvier 2010 Messages : 112 ![]() |
Citation:
![]() *envie de troller...* *résiste...* *...resiste encore...* *...ne tient plus...* bah c'est une "nouveauté Apple" quoi *honteux mais soulagé* ![]() -->[] |
|
|
|
163
|
|
|
#4 |
|
Membre chevronné
![]() ![]() Inscription : septembre 2004 Messages : 374 ![]() |
Ce qui est étrange, je trouve, que cela rend surtout hommage à un bonhome qui était bien en avance par rapport à son temp: Niklaus Wirth
On passe tant d'année dans les améliorations du C++, et on fini par atterir sur la notion de module qu'il avait lui même proposé pour accélerer le temp de compilation et rajouter de la modularité au langage: il avait proposer cela dans Modula2 en amélioration du langage Pascal iso, puis avait poussé cela plus loin dans Oberon avec la gestion des Private/Public que l'on retrouve des années plus tard dans la programmation orientée objet. Un bonhome qui mérite vraiment tous les honneurs
__________________
http://www.neaticons.com png glyphs and icons for website and application developpers. http://www.pocketmt.com GLCD Font Creator home site. |
|
|
30
|
|
|
#5 | |
|
Membre chevronné
![]() Gabriel VIOTIngénieur développement logiciels Inscription : janvier 2007 Messages : 526 ![]() |
Je ne suis pas sûr de comprendre en quoi les modules vont améliorer le temps de compilation. Ça va probablement simplifier la mise en place de la chaine de compilation, rendre ça un peu plus propre et permettre de meilleurs outils de débuggage/profiling.
Dans le PDF il présente la complexité de la compilation actuelle de la façon suivante : Citation:
Bon c'est vrai que je n'ai pas fait de C/C++ depuis un bout de temps donc si quelqu'un peut m’expliquer ce que j'ai louper, je suis tout ouïe. Sinon il est évident que l'apport des modules (en standard ou à la Apple) ne peut être que bénéfique au C++. |
|
|
|
00
|
|
|
#6 |
|
Membre éclairé
![]() Étudiant Inscription : mars 2011 Messages : 61 ![]() |
C'est un des points que j'aimerais le plus voir modifié dans le futur standard, pour aller vers ce que propose le D.
Mais comme mentionné plus haut, c'est quelque chose qui est déjà à l'étude par un groupe de travail du comité. Je ne comprends pas bien le pdf d'Apple, ils l'ont déjà implémenté dans LLVM ou bien ? Si oui ça peut grandement accélérer l'implémentation dans d'autres compilateurs en attendant la futur norme (dans 2 ans au moins). |
|
|
00
|
|
|
#7 | |
|
Expert Confirmé Sénior
![]() Inscription : avril 2002 Messages : 2 678 ![]() |
Citation:
LLVM n'appartient pas à Apple.Il s'agit de l'équipe Apple travaillant sur LLVM. |
|
|
|
00
|
|
|
#8 | |||
|
Expert Confirmé
![]() ![]() Joel LamotteDéveloppeur de jeux vidéo Inscription : août 2004 Messages : 1 554 ![]() |
D'abord, cela a deja ete discute la: http://www.developpez.net/forums/d12...p/#post6999274
Citation:
Actuellement, le compilateur DOIT concatener entierement tout le code source de tous les headers inclus pour pouvoir compiler ET il doit tout compiler, soit chaque header au moins une fois par cpp utilise, meme si c'est exactement le meme code a chaque fois. Citation:
Admettons que j'utilise la bibliotheque standard, j'inclus iostream et par la suite ca m'inclus 10 fichiers utilises par le header iostream. Ca veut dire que chaque fois que j'inclus iostream dans un source, ces 10 fichiers sont reinclus dans mon source (parceque "grace" aux macros, il se peut que ca ne genere pas le meme code qu'avec un autre fichier source) et ce autant de fois qu'il y a de fichiers source. Les header guards, ils ne servent qu'a une chose : si tu inclus un header A qui inclus B et que tu inclus un header C qui inclus lui meme B, alors tu as , apres inclusion deux fois le contenu de B et comme il est interdit en C++ de faire deux definitions (pas declaration, definition) d'un meme objet/type/etc, ca ne peut pas compiler. Ton header guard, ca permet de ne pas inclure plusieurs fois le meme code dans le meme fichier source. Ici le role des modules serait entre autre que les dis headers ne soient compiles qu'une bonne fois pour toute pour TOUS les fichiers sources memes des autres applications. Citation:
|
|||
|
40
|
|
|
#9 | |
|
Membre chevronné
![]() Inscription : décembre 2010 Messages : 236 ![]() |
Citation:
Pour faire simple, tu dois inclure le même header dans chaque fichier source qui en a besoin, qui sera ensuite compilé une multitude de fois. |
|
|
|
00
|
|
|
#10 |
|
Membre Expert
![]() ![]() david Responsable développement Inscription : décembre 2003 Messages : 1 296 ![]() |
Par hasard, n'est-ce pas la même chose que les en-tête précompilés de Visual Studio ?
PS : je n'ai pas encore lu le pdf.
__________________
Media Foundation video decoder mpeg1/mpeg2, MediaSource Kinect http://sourceforge.net/projects/mfnode/ http://jeux.developpez.com/faq/directx/?page=dshow |
|
|
10
|
|
|
#11 | ||
|
Expert Confirmé
![]() ![]() Joel LamotteDéveloppeur de jeux vidéo Inscription : août 2004 Messages : 1 554 ![]() |
Citation:
Pour faire court, les entetes precompiles sont une liste precompilee de headers mis ensemble donc si tu en changes un tous doivent etre recompiles. C'est utile seulement si tes fichiers d'entete inclus dans ce fichiers sont tres stables et utiles partout. La il sagit plutot de mettre en cache tous les symboles de tous les modules dispo, puis de precompiler les parties utilises. Si tu changes un module, seul ce module est compile. On va dire que le principe de fond est similaire, mais l'impact est beaucoup plus general (theoriquement) avec les modules (et ne necessite pas d'intervension du programmeur C++ final). Citation:
Je me suis deja retrouve une fois avec une appli ou un ensemble de cpp prenaient environ 10 minutes chacun a compiler, essentiellement parcequ'ils incluaient tous les memes headers. Dans le cas theorique des modules, les 10 minutes auraient passes une fois et seul le code du cpp modifie aurait change par la suite (parcequ'on ne changeait pas le contenu des dis headers - au risque de perdre une heure de recompile). |
||
|
20
|
|
|
#12 | |
|
Membre éprouvé
![]() Saâd HessaneIngénieur développement logiciels Inscription : avril 2008 Messages : 302 ![]() |
Citation:
Pour l'expliquer prenons un exemple : "source1.cpp", "source2.cpp" ... "sourceN.cpp" incluent "header1.h", "header2.h" ... "headerM.h" . Pour compiler le programme (ou la lib), les fichiers sources sont compilés indépendamment, pour créer un (ou plusieurs) fichier objet par fichier source. En gros source1.cpp est compilé pour donner source1.o, et source2.cpp est compilé pour donner source2.o... Les N compilations sont indépendantes. A chaque compilation il y a l'inclusion de M fichier header. Nous avons donc une complexité de MxN au pire. Après avoir eu tous les fichiers objets, l'éditeur de lien entre en scène. Mais ça c'est encore une autre histoire... |
|
|
|
00
|
|
|
#13 |
|
Invité de passage
![]() Inscription : avril 2007 Messages : 8 ![]() |
des systèmes de compilation utilisent des cachent dans lesquels les entêtes sont précompilées, c'est le cas chez c++ builder, je pense donc que le gain réel sera faible
peut-être en gnu, je ne crois pas qu'ils aient ce système de cache |
|
|
00
|
|
|
#14 |
|
Expert Confirmé
![]() ![]() Joel LamotteDéveloppeur de jeux vidéo Inscription : août 2004 Messages : 1 554 ![]() |
Nope, ils ne peuvent pas vraiment a cause des macros. Enfin, ils cachent pendant la compilation mais pas entre les compilations.
|
|
00
|
|
|
#15 |
|
Expert Confirmé Sénior
![]() ![]() Paul TOTHFreelance Inscription : novembre 2002 Messages : 4 427 ![]() |
il pourrait en profiter pour remplacer {} par begin end et import pas uses , ça finirait par ressembler à du Pascal
__________________
Developpez.com: Mes articles, forum FlashPascal Entreprise: Execute SARL Produits : UPnP, RemoteOffice, FlashPascal Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5% |
|
00
|
|
|
#16 |
|
Invité régulier
![]() Benoit BardetCHercheur Inscription : août 2011 Messages : 10 ![]() |
Si j'ai bien compris les commentaires, c'est déjà en place dans C++11.
|
|
01
|
|
|
#17 | |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 711 ![]() |
Citation:
Je parle bien pour un fichier, je comprends que si on répète l'opération 36 fois, c'est sûrement pas mal de fois le travail. D'ailleurs, parle t-on uniquement du temps de compilation ou aussi du temps de linkage et de pré-processeur ? Il faudra que je lise le document demain, il est trop tard now ^^
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|
|
00
|
|
|
#18 |
|
Expert Confirmé
![]() ![]() Joel LamotteDéveloppeur de jeux vidéo Inscription : août 2004 Messages : 1 554 ![]() |
En theorie oui ca serait que des declarations simple. En pratique les declarations de classe sont plus complexes que les declarations de fonctions. Surtout si les membres sont aussi des classes, alors il faut inclure leur declaration aussi. Et tu n'echapperas pas aux templates dans les bibliotheques (ce qui fait leur genericite) standard ou pas.
Donc c'est un probleme de quantite et de complexite aussi. |
|
00
|
|
|
#19 |
|
Membre Expert
![]() ![]() Inscription : novembre 2008 Messages : 973 ![]() |
La grosse différence c’est que les modules ne dépendent pas de l’environnement extérieur, alors que les en-têtes, si. C’est d’ailleurs pour ça que l’inclusion des en-têtes précompilés de visual doit apparaître en tout premier dans le fichier cpp.
La solution ici présente a l’inconvénient (par rapport aux en-têtes précompilés) de nécessiter des évolutions langage, mais elle est plus propre, plus modulaire. Bref, du tout bon !
__________________
HADOPI - Le Net en France : black-out |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com