Les longues compilations sont-elles une chose du passé?

38

Il existe d'innombrables histoires de guerre sur le temps que peut prendre une compilation. Même xkcd en a parlé.

Maintenant, je ne programme plus depuis longtemps et je viens d’être exposé à Java et à Python (et Python est un langage interprété, pas un langage compilé). Je me rends compte qu'il est possible que je n'ai pas encore rencontré de projets qui prennent beaucoup de temps à compiler, mais même pour des applications de taille décente, cela a été instantané pour moi (généralement géré en tâche de fond par un IDE) ou ne prenant pas plus de 30 secondes ou plus pour un très grand projet. Même dans un environnement professionnel (où la bande dessinée a lieu), la compilation de code n'a jamais été aussi longue.

Ai-je juste pas été exposé à des projets avec des temps de compilation longs? S'agit-il d'une relique du passé qui n'est plus quelque chose qui se passe de nos jours? Pourquoi une compilation prend-elle si longtemps?

Thunderforge
la source
31
Essayez de compiler du chrome.
UldisK
2
Prenez une copie du noyau Linux. Faites une construction complète. Voir par vous-même. Ou Spring from source si vous êtes un codeur Java. En l'état, cette question a plusieurs réponses qui répondent à la question comme s'il s'agissait d'un sondage (réponses de type "J'ai compilé 30 minutes ..."), ce qui indique que la question elle-même ne convient pas. .
Un grand projet récent m'a pris 40 minutes pour compiler (40 000 fichiers de code source compilés avec Maven). La solution de contournement consiste à mettre en parallèle la compilation sur de nombreux cœurs de processeur.
Niklas Rosencrantz
2
Choisissez une distribution Linux source (gentoo, LFS, ...) puis passez plusieurs jours à compiler tous les logiciels que vous installez.
Basile Starynkevitch
6
définir long ... Pour certains enfants sortant de l'école, une minute peut sembler longue, pour un ancien qui passe dans les tranchées depuis des décennies. Quelques heures à peine, cela ne fait pas sourciller.
Jwenting

Réponses:

48

La compilation peut prendre un certain temps, en particulier pour les grands projets écrits dans des langages tels que C, C ++ ou Scala. La compilation de pièces en arrière-plan peut réduire le temps de compilation, mais vous devez parfois effectuer une nouvelle compilation. Les facteurs pouvant entraîner des temps de compilation longs incluent:

  • Grand code, évidemment. Les grands projets auront des centaines de milliers de lignes de code.

  • La #includedirective de préprocesseur de C , qui entraîne la compilation du même code des centaines de fois. Le système de macro a des problèmes similaires, car il fonctionne au niveau du texte. Le préprocesseur gonfle vraiment la taille du code transmis au compilateur. Regarder un fichier après le prétraitement (par exemple via gcc -E) devrait vous ouvrir les yeux.

  • Les modèles C ++ sont complets, ce qui signifie qu'en théorie, vous pouvez effectuer des calculs arbitraires au moment de la compilation. Personne ne veut vraiment faire cela, mais même de nombreux cas simples s’ajoutent au temps consacré à la spécialisation des modèles.

  • Scala est une langue assez jeune et le compilateur est terriblement sous-optimisé. Actuellement, le compilateur utilise un très grand nombre de passes de compilation (C est conçu pour ne nécessiter que deux passes de compilation). La vérification de type fait partie de ces étapes et peut prendre un certain temps en raison du système de types compliqué décrit par la langue.

La compilation n'est pas la seule chose qui prend du temps. Une fois le projet compilé, une suite de tests doit être exécutée. Le temps passé dessus peut aller de quelques secondes à quelques heures (si les tests sont mal écrits).

Amon
la source
14
En fait, le système de types de Scala est Turing-complete, donc la vérification de type peut prendre un temps infini, et il est impossible au compilateur de le déterminer.
Jörg W Mittag
7
N'oubliez pas les optimisations. Un grand nombre d'optimisations qu'un compilateur C / C ++ fera (par exemple) sont très coûteuses (par exemple, si chères que JIT ne peut pas se permettre de les faire du tout). Dans le pire des cas, la plupart des chaînes d'outils prennent désormais en charge l'optimisation de l'ensemble du programme, ce qui est connu pour augmenter considérablement les temps de génération.
Brendan
J'ai accepté cette réponse parce que vous avez souligné un certain nombre de choses que je n'envisageais pas, en particulier la compilation complète plutôt que la compilation par morceaux et le fait que des suites de tests pourraient être incluses dans cette période de "compilation".
Thunderforge
1
pas seulement des suites de tests - analyse de la couverture de code, empaquetage automatisé, déploiement automatique vers le système de test; De nos jours, beaucoup de choses sont intégrées dans un système de construction intégré. Et si vous êtes en attente jusqu'à ce que l'environnement de développement ou de qualité soit en attente, vous avez certainement le temps de faire une petite joute sur chaise.
CorsiKa
1
Excellente réponse, je voudrais juste noter que la propagation des temps de compilation possibles peut être beaucoup plus grande. J'ai travaillé sur des projets où une compilation complète pouvait prendre deux à trois jours (oui, c'était horrible!) Et j'imagine qu'il y a des pires délinquants.
Roy T.
17

Ce n'est en aucun cas une relique du passé. Un des projets sur lequel je travaille nécessite 45 minutes pour une construction nette à partir de zéro. En plus de notre propre code, nous devons également extraire et construire le source à partir de plusieurs grandes bibliothèques C et C ++ à partir de référentiels externes. Compiler et lier du code C et C ++ est coûteux en calcul. Comme vous l'avez indiqué, Python est généralement implémenté en tant que langage interprété et Java utilise généralement un compilateur JIT (Just in Time). Vos projets omettent donc totalement la compilation et les coûts de liaison. Le prix que vous payez est dans des temps de démarrage plus longs et (pour Python au moins) une vitesse d'exécution plus lente.

Lorsque les temps de construction sont aussi longs, il devient plus important de tirer parti des systèmes d'intégration continue tels que Jenkins ou TeamCity . Cela permet aux développeurs individuels d'éviter (la plupart du temps) la douleur de la création à partir de zéro, tout en testant que les modifications ne brisent pas la construction.

Charles E. Grant
la source
1
javac ne signifie pas " ignorer la compilation initiale et lier les coûts totalement ". Il évite beaucoup de coûts d'optimisation, mais il continue de transformer la source en code octet et d'effectuer de nombreuses vérifications statiques au cours du processus. Cela fait autant de liens qu'un compilateur en C. La vraie différence de performances réside dans le fait que le processus de compilation de Java a été conçu à une époque où il était supposé possible de charger en mémoire le programme entier et ses dépendances en même temps, au lieu de le décomposer en petits morceaux et de retraiter les mêmes fichiers des milliers de fois.
Peter Taylor
10

Les grands projets peuvent prendre beaucoup de temps. Cela peut prendre une heure ou plus pour un projet suffisamment important. Il y a quelques bibliothèques que je dois compiler à partir des sources sur mon ordinateur et qui prennent beaucoup de temps - par exemple, opencascade. Le noyau Linux lui-même prend également beaucoup de temps si vous devez le construire à partir de zéro.

Cependant, il existe d’autres processus de type compilation qui peuvent prendre beaucoup plus de temps. La conception de circuit numérique (pour les ASIC ou les FPGA) nécessite une étape d’emplacement et d’itinéraire. L'étape lieu et route est l'endroit où le placement de portes logiques individuelles, de bascules, de registres, de RAM et d'autres composants est déterminé, ainsi que l'acheminement du câblage d'interconnexion. Le logiciel utilise des modèles de synchronisation pour déterminer les délais de porte et de routage pour les emplacements possibles, les compare aux limites définies en fonction des contraintes de synchronisation, puis ajuste les emplacements des emplacements et les chemins de connexion pour tenter de satisfaire les exigences de synchronisation. Parfois, le logiciel devra même redimensionner les portes et ajouter des tampons afin de respecter le timing. Cette étape nécessite énormément de calculs et peut prendre plusieurs heures, voire plusieurs jours. De plus, cela ne correspond pas vraiment très bien. Il y a un an environ, je travaillais sur une conception de FPGA qui consommait environ la moitié d'un FPGA Virtex 6 HXT 565 (environ 300 000 sur des LUT de 565 000) et nécessitait environ 7 heures pour terminer le lieu et l'itinéraire. Je ne peux pas imaginer combien de temps cela prendrait de faire tourner et d’acheminer quelque chose comme une conception de processeur Core i7 - probablement au moins plusieurs semaines.

alex.forencich
la source
4

D'autres réponses ont déjà indiqué qu'effectivement, le code sur de grands projets, où gros signifie 500 000 lignes et plus, peut prendre beaucoup de temps, en particulier lors de la construction à partir de zéro.

Le point supplémentaire est que certains projets doivent être générés pour plusieurs environnements cibles. Lorsque les machines qui hébergent ces environnements ne sont pas disponibles, la construction doit être effectuée par compilation croisée, en série sur les machines que vous possédez. Cela peut entraîner des temps de construction importants . Pour un projet sur lequel j'ai travaillé, la construction nocturne prendrait 10 heures. Malheur à toi, c'est toi qui l'as cassé!

J'ajouterais que vous ne vous en tireriez pas avec une telle excuse pour perdre du temps. Un professionnel devrait être la planification de leurs tâches afin qu'ils n'ont quelque chose d' utile à faire dans de telles périodes.

andy256
la source
3

Un peu des deux. C ++ (et C dans une moindre mesure) étaient connus pour leurs temps de compilation lents, en particulier sur du matériel d'époque. Vers le tournant du millénaire, j'ai travaillé sur un projet qui a pris environ 4 heures pour être construit en raison de macroscopies.

De nos jours, les choses vont mieux, mais selon mon expérience, 30 secondes sont assez basses - en particulier dans les versions formelles où des éléments doivent être extraits du contrôle de source, des tests unitaires exécutés, des installateurs construits et tout ce qui est envoyé à un SAN quelque part.

Telastyn
la source
2

Cela dépend du projet et de l'environnement dans lequel il est compilé. J'ai travaillé sur des projets C ++ dont la compilation a pris plusieurs minutes (configurée en tant que projets multiples dans MSVS), ce qui est probablement suffisamment de temps pour un swordfight.

Si vous travaillez pour une grande entreprise disposant d'une base de données et de codes volumineux (Proctor and Gamble, Google, etc.) ou pour une petite entreprise ou une startup se concentrant sur un ou deux produits primaires très complexes (simulation et rendu scientifiques, par exemple), Il est donc réaliste d’attendre qu'un grand projet soit élaboré, même sur des machines puissantes. Cela peut affecter la manière dont vous développez et déboguez le code (ainsi que la fréquence à laquelle vous choisissez de mettre à jour et de fusionner les modifications via le contrôle de version).

Trixie Wolf
la source