Construire C / C ++: ce qui se passe vraiment et pourquoi cela prend-il autant de temps
Une partie relativement importante du temps de développement logiciel n'est pas consacrée à l'écriture, à l'exécution, au débogage ou même à la conception de code, mais à l'attente de la fin de la compilation. Pour accélérer les choses, nous devons d'abord comprendre ce qui se passe lorsque le logiciel C / C ++ est compilé. Les étapes sont à peu près les suivantes:
- Configuration
- Création d'un outil de démarrage
- Vérification des dépendances
- Compilation
- Mise en relation
Nous allons maintenant examiner chaque étape plus en détail en nous concentrant sur la façon dont elles peuvent être accélérées.
Configuration
Il s'agit de la première étape lors du démarrage de la construction. Signifie généralement l'exécution d'un script de configuration ou CMake, Gyp, SCons ou un autre outil. Cela peut prendre entre une seconde et plusieurs minutes pour les très gros scripts de configuration basés sur Autotools.
Cette étape se produit relativement rarement. Il doit uniquement être exécuté lors de la modification des configurations ou de la modification de la configuration de build. À moins de changer les systèmes de construction, il n'y a pas grand-chose à faire pour accélérer cette étape.
Création d'un outil de démarrage
C'est ce qui se produit lorsque vous exécutez make ou cliquez sur l'icône de génération sur un IDE (qui est généralement un alias pour make). L'outil de construction binaire démarre et lit ses fichiers de configuration ainsi que la configuration de construction, qui sont généralement la même chose.
Selon la complexité et la taille de la construction, cela peut prendre de une fraction de seconde à plusieurs secondes. En soi, ce ne serait pas si mal. Malheureusement, la plupart des systèmes de build basés sur la marque font invoquer make à des dizaines à des centaines de fois pour chaque build. Habituellement, cela est dû à une utilisation récursive de make (ce qui est mauvais).
Il convient de noter que la raison pour laquelle Make est si lent n'est pas un bogue d'implémentation. La syntaxe de Makefiles a quelques bizarreries qui rendent une implémentation très rapide presque impossible. Ce problème est encore plus visible lorsqu'il est combiné avec l'étape suivante.
Vérification des dépendances
Une fois que l'outil de construction a lu sa configuration, il doit déterminer quels fichiers ont changé et lesquels doivent être recompilés. Les fichiers de configuration contiennent un graphique acyclique dirigé décrivant les dépendances de construction. Ce graphique est généralement créé lors de l'étape de configuration. Le temps de démarrage de l'outil de génération et le scanner de dépendances sont exécutés sur chaque génération. Leur runtime combiné détermine la borne inférieure du cycle d'édition-compilation-débogage. Pour les petits projets, cette durée est généralement de quelques secondes environ. C'est tolérable. Il existe des alternatives à Make. Le plus rapide d'entre eux est Ninja, qui a été construit par les ingénieurs de Google pour Chromium. Si vous utilisez CMake ou Gyp pour construire, passez simplement à leurs backends Ninja. Vous n'avez rien à changer dans les fichiers de construction eux-mêmes, profitez simplement de l'augmentation de vitesse. Ninja n'est pas inclus dans la plupart des distributions, cependant,
Compilation
À ce stade, nous invoquons enfin le compilateur. En coupant quelques coins, voici les étapes approximatives prises.
- La fusion comprend
- Analyser le code
- Génération / optimisation de code
Contrairement à la croyance populaire, la compilation de C ++ n'est pas si lente. La STL est lente et la plupart des outils de compilation utilisés pour compiler C ++ sont lents. Cependant, il existe des outils et des moyens plus rapides pour atténuer les parties lentes du langage.
Leur utilisation prend un peu d'huile de coude, mais les avantages sont indéniables. Des temps de construction plus rapides conduisent à des développeurs plus heureux, plus d'agilité et, finalement, un meilleur code.
It takes significantly longer to compile a C++ file
- tu veux dire 2 secondes contre 1 seconde? C'est certainement deux fois plus long, mais peu significatif. Ou voulez-vous dire 10 minutes contre 5 secondes? Veuillez quantifier.