Es gibt unzählige Kriegsgeschichten darüber, wie lange eine Kompilierung dauern kann. Sogar xkcd erwähnte es.
Jetzt habe ich lange nicht mehr programmiert und war meist nur mit Java und Python vertraut (und Python ist eine interpretierte Sprache, keine kompilierte). Mir ist klar, dass ich möglicherweise noch nie auf Projekte gestoßen bin, deren Kompilierung sehr lange dauert, aber selbst bei Anwendungen mit anständiger Größe war dies für mich entweder unmittelbar (normalerweise von einer IDE im Hintergrund ausgeführt) oder es dauerte nicht mehr als 30 Minuten Sekunden oder so für ein extrem großes Projekt. Selbst in einem Geschäftsumfeld (in dem der Comic stattfindet) hat das Kompilieren von Code noch nie so lange gedauert.
Habe ich gerade keine Projekte mit langen Kompilierzeiten gesehen? Ist dies ein Relikt der Vergangenheit, das heute nicht mehr vorkommt? Warum würde eine Kompilierung so lange dauern?
quelle
Antworten:
Das Kompilieren kann eine Weile dauern, insbesondere bei großen Projekten, die in Sprachen wie C, C ++ oder Scala geschrieben wurden. Das Kompilieren von Teilen im Hintergrund kann die Kompilierungszeit verkürzen, gelegentlich müssen Sie jedoch eine neue Kompilierung durchführen. Zu den Faktoren, die zu langen Kompilierungszeiten führen können, gehören:
Offensichtlich große Codegröße. Bei großen Projekten werden Hunderttausende von Codezeilen verwendet.
Die
#include
Präprozessor-Direktive von C , die dazu führt, dass derselbe Code hunderte Male kompiliert wird. Das Makrosystem weist ähnliche Probleme auf, da es auf Textebene funktioniert. Der Präprozessor bläht wirklich die Codegröße auf, die tatsächlich an den Compiler übergeben wird. Das Betrachten einer Datei nach der Vorverarbeitung (z. B. übergcc -E
) sollte Ihre Augen öffnen.Die Templates von C ++ sind Turing-vollständig, was bedeutet, dass Sie theoretisch beliebige Berechnungen zur Kompilierungszeit durchführen können. Niemand möchte das wirklich, aber selbst viele einfache Fälle bedeuten einen erheblichen Zeitaufwand für die Spezialisierung der Vorlagen.
Scala ist eine ziemlich junge Sprache und der Compiler ist fürchterlich unteroptimiert. Derzeit verwendet der Compiler eine sehr große Anzahl von Kompilierungsdurchläufen (für C sind nur zwei Kompilierungsdurchläufe erforderlich). Die Typüberprüfung ist einer dieser Durchgänge und kann aufgrund des in der Sprache enthaltenen komplizierten Typsystems einige Zeit in Anspruch nehmen.
Compilation ist nicht das einzige, was Zeit braucht. Nach dem Kompilieren des Projekts sollte eine Testsuite ausgeführt werden. Die dafür aufgewendete Zeit kann zwischen einigen Sekunden und einigen Stunden liegen (wenn die Tests schlecht geschrieben sind).
quelle
Es ist keineswegs ein Relikt der Vergangenheit. Eines der Projekte, an denen ich arbeite, benötigt 45 Minuten für einen sauberen Build von Grund auf neu. Abgesehen von unserem eigenen Code müssen wir auch den Quellcode aus mehreren großen C- und C ++ - Bibliotheken aus externen Repositorys abrufen und erstellen. Das Kompilieren und Verknüpfen von C- und C ++ - Code ist rechenintensiv. Wie Sie bereits erwähnt haben, wird Python in der Regel als interpretierte Sprache implementiert, und Java verwendet normalerweise einen JIT-Compiler (Just in Time). In Ihren Projekten entfällt daher die vorherige Kompilierung und die Kostenverknüpfung insgesamt. Der Preis, den Sie zahlen, liegt in längeren Startzeiten und (zumindest für Python) einer langsameren Ausführungsgeschwindigkeit.
Wenn die Build-Zeiten so lang werden, wird es immer wichtiger, kontinuierliche Integrationssysteme wie Jenkins oder TeamCity zu nutzen . Auf diese Weise können einzelne Entwickler (größtenteils) vermeiden, dass Gebäude von Grund auf neu erstellt werden müssen, und gleichzeitig testen, ob Änderungen den Build nicht beschädigen.
quelle
Große Projekte können lange dauern. Für ein ausreichend großes Projekt kann es eine Stunde oder länger dauern. Es gibt einige Bibliotheken, die ich aus dem Quellcode auf meinem Computer kompilieren muss und die sehr lange dauern - z. B. opencascade. Der Linux-Kernel selbst benötigt auch ziemlich viel Zeit, wenn Sie ihn von Grund auf neu erstellen müssen.
Es gibt jedoch andere kompilierungsähnliche Prozesse, die viel länger dauern können. Das digitale Schaltungsdesign (entweder für ASICs oder FPGAs) erfordert einen Ort und einen Routenschritt. Der Ort- und Routenschritt ist der Ort, an dem die Platzierung einzelner Logikgatter, Flip-Flops, Register, RAMs und anderer Komponenten zusammen mit dem Routing für die Verbindungsverdrahtung bestimmt wird. Die Software verwendet Timing-Modelle, um die Gate- und Routing-Verzögerungen für mögliche Platzierungen zu bestimmen, vergleicht diese mit den durch die Timing-Beschränkungen vorgegebenen Grenzen und passt dann die Platzierungsorte und Drahtwege an, um zu versuchen, die Timing-Anforderungen zu erfüllen. Manchmal muss die Software sogar die Größe der Gates ändern und Puffer hinzufügen, um das Timing einzuhalten. Dieser Schritt ist äußerst rechenintensiv und kann viele Stunden oder sogar Tage in Anspruch nehmen. Es passt auch nicht wirklich sehr gut zusammen. Es gab ein FPGA-Design, an dem ich vor ungefähr einem Jahr gearbeitet habe und das ungefähr die Hälfte eines Virtex 6 HXT 565-FPGAs (~ 300.000 von 565.000 LUTs) verbraucht hat und das ungefähr 7 Stunden dauerte, um Ort und Route abzuschließen. Ich kann mir nicht vorstellen, wie lange es dauern würde, auf so etwas wie einem Core i7-CPU-Design ausgeführt und geroutet zu werden - wahrscheinlich mindestens einige Wochen.
quelle
In anderen Antworten wurde bereits erwähnt, dass Code für große Projekte, bei denen 500.000 Zeilen und mehr erforderlich sind, einige Zeit in Anspruch nehmen kann, insbesondere beim Erstellen von Grund auf neu.
Der zusätzliche Punkt ist, dass einige Projekte für mehrere Zielumgebungen erstellt werden müssen. Wenn die Computer, auf denen diese Umgebungen gehostet werden, nicht verfügbar sind, muss die Erstellung durch Cross-Compilation in Serie auf den vorhandenen Computern erfolgen. Dies kann zu erheblichen Bauzeiten führen. Für ein Projekt, an dem ich gearbeitet habe, würde der nächtliche Bau 10 Stunden dauern. Wehe, dass du derjenige warst, der es gebrochen hat!
Ich würde hinzufügen, dass Sie mit einer solchen Entschuldigung für Zeitverschwendung nicht davonkommen würden. Eine professionelle Person sollte ihre Aufgaben planen , so dass sie sie haben etwas Nützliches in solchen Zeiten zu tun.
quelle
Ein Wenig von beidem. C ++ (und in geringerem Maße C) waren bekannt für ihre langsamen Kompilierungszeiten, insbesondere auf der Hardware von Perioden. Um die Jahrtausendwende arbeitete ich an einem Projekt, dessen Erstellung aufgrund von Makrofehlern etwa 4 Stunden dauerte.
Heutzutage sind die Dinge besser, aber 30 Sekunden sind meiner Erfahrung nach ziemlich niedrig - insbesondere bei formalen Builds, bei denen Dinge aus der Quellcodeverwaltung heraus überprüft, Komponententests ausgeführt, Installer erstellt und alles irgendwo an ein SAN gesendet werden müssen.
quelle
Dies hängt vom Projekt und der Umgebung ab, in der es kompiliert wird. Ich habe an C ++ - Projekten gearbeitet, deren Kompilierung mehrere Minuten in Anspruch nahm (in MSVS als mehrere Projekte eingerichtet), was wahrscheinlich genug Zeit für einen Schwertkampf ist.
Wenn Sie für ein großes Unternehmen mit großem Code und großer Datenbank (Proctor and Gamble, Google usw.) oder für ein kleines Unternehmen oder Startup arbeiten, das sich auf ein oder zwei sehr komplexe Primärprodukte konzentriert (z. B. wissenschaftliche Simulation und Rendering), Das Warten auf die Kompilierung eines großen Projekts ist auch auf leistungsstarken Maschinen realistisch. Dies kann sich darauf auswirken, wie Sie Code entwickeln und debuggen (und wie oft Sie Änderungen durch Versionsverwaltung aktualisieren und zusammenführen).
quelle