Gehören lange Kompilierungen der Vergangenheit an?

38

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?

Donnerschmiede
quelle
31
Versuchen Sie, Chrom zu kompilieren.
UldisK,
2
Besorgen Sie sich eine Kopie des Linux-Kernels. Mach einen kompletten Build. Überzeugen Sie sich selbst. Oder Spring from Source, wenn Sie ein Java-Codierer sind. Diese Frage hat verschiedene Antworten, die die Frage so beantworten, als ob es sich um eine Umfrage handelte (Antworten vom Typ "Ich habe 30 Minuten kompiliert ..."), was darauf hinweist, dass die Frage selbst nicht gut passt .
Die Kompilierung eines kürzlich abgeschlossenen großen Projekts dauerte 40 Minuten (40 000 Quellcodedateien, die mit Maven kompiliert wurden). Die Problemumgehung besteht darin, die Kompilierung auf vielen CPU-Kernen zu parallisieren.
Niklas Rosencrantz
2
Suchen Sie sich eine Linux-Quelldistribution (gentoo, LFS, ...) aus und verbringen Sie dann Tage damit, jede installierte Software zu kompilieren.
Basile Starynkevitch
6
Definieren Sie lange ... Für ein Kind, das gerade die Schule verlassen hat, mag eine Minute lang erscheinen, für einen Oldtimer, der jahrzehntelang in den Schützengräben gestanden hat, ziehen Sie keine Augenbrauen hoch.
30.

Antworten:

48

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 #includePrä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. über gcc -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).

amon
quelle
14
Tatsächlich ist das Typensystem von Scala Turing-vollständig, sodass die Typprüfung unendlich viel Zeit in Anspruch nehmen kann, und der Compiler kann dies nicht feststellen.
Jörg W Mittag
7
Optimierungen nicht vergessen. Viele Optimierungen, die ein (z. B.) C / C ++ - Compiler durchführen wird, sind sehr teuer (z. B. so teuer, dass sich JIT diese überhaupt nicht leisten kann). Für den schlimmsten Fall unterstützen die meisten Toolketten jetzt die Optimierung des gesamten Programms, was bekanntermaßen die Erstellungszeiten erheblich verlängert.
Brendan
Ich habe diese Antwort akzeptiert, weil Sie auf eine Reihe von Dingen hingewiesen haben, die ich nicht in Betracht gezogen habe, insbesondere das Kompilieren des Ganzen gegenüber dem Kompilieren in Stücken und die Tatsache, dass Testsuiten in dieser Zeit des "Kompilierens" enthalten sein könnten.
Thunderforge
1
nicht nur Testsuiten - Code-Coverage-Analyse, automatisiertes Packen, automatisierte Bereitstellung für das Testsystem; Heutzutage sind viele Dinge in ein integriertes Build-System eingebunden. Und wenn Sie in der Warteschleife sind, bis die Entwickler- oder QA-Umgebung erreicht ist, haben Sie auf jeden Fall Zeit für ein kleines Stuhl-Turnier.
CorsiKa
1
Gute Antwort, ich würde nur bemerken, dass die Streuung der möglichen Kompilierzeiten viel größer sein kann. Ich habe an Projekten gearbeitet, bei denen eine vollständige Kompilierung zwei bis drei Tage dauern konnte (ja, das war entsetzlich!), Und ich stelle mir vor, dass es schlimmere Straftäter gibt.
Roy T.
17

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.

Charles E. Grant
quelle
1
javac " überspringt nicht die vorab erstellte Zusammenstellung und verknüpft die Kosten insgesamt ". Es überspringt eine Menge Optimierungskosten, wandelt aber trotzdem die Quelle in Bytecode um und führt dabei viele statische Überprüfungen durch. Es führt ungefähr so ​​viele Verknüpfungen aus wie ein C-Compiler. Der eigentliche Leistungsunterschied besteht darin, dass der Kompilierungsprozess von Java in einer Zeit entworfen wurde, in der angenommen wurde, dass das gesamte Programm und seine Abhängigkeiten auf einmal in den Speicher geladen werden konnten, anstatt dass es in winzige Teile zerlegt und dieselben Dateien tausende Male erneut verarbeitet werden mussten.
Peter Taylor
10

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.

alex.forencich
quelle
4

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.

andy256
quelle
3

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.

Telastyn
quelle
2

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).

Trixie Wolf
quelle