Warum ist es wichtig, dass C / C++ Code auf verschiedenen Compilern kompilierbar ist?
Lesezeit: 11 Minuten
Lena Schimmel
Ich interessiere mich für verschiedene Aspekte der Portabilität (wie Sie sehen können, wenn Sie meine anderen Fragen durchsuchen), also lese ich viel darüber. Ziemlich oft lese/höre ich, dass Code so geschrieben werden sollte, dass er auf verschiedenen Compilern kompilierbar ist.
Ohne echte Erfahrung mit gcc / g++ scheint es mir, dass es jede große Plattform unterstützt, die man sich vorstellen kann, sodass Code, der auf g++ kompiliert wird, auf fast jedem System ausgeführt werden kann. Warum sollte sich also jemand die Mühe machen, seinen Code auf dem MS-Compiler, dem Intel-Compiler und anderen ausführen zu lassen?
Ich kann mir auch einige Gründe vorstellen. Wie die FAQ vorschlagen, werde ich versuchen, sie als Antwort zu posten, anstatt sie in meine eigene Frage aufzunehmen.
Bearbeiten: Fazit
Sie haben mich davon überzeugt, dass es mehrere gute Gründe gibt, mehrere Compiler zu unterstützen. Es gibt so viele Gründe, warum es schwierig war, eine Antwort als die akzeptierte auszuwählen. Die wichtigsten Gründe für mich:
Es ist viel wahrscheinlicher, dass Mitwirkende an meinem Projekt arbeiten oder es einfach verwenden, wenn sie den Compiler ihrer Wahl verwenden können
Überall kompilierbar zu sein, mit zukünftigen Compilern und Tools verwendbar zu sein und sich an die Standards zu halten, erzwingen sich gegenseitig, also ist es eine gute Idee
Andererseits glaube ich immer noch, dass es andere Dinge gibt, die wichtiger sind, und jetzt weiß ich, dass es manchmal gar nicht wichtig ist.
Und zu guter Letzt gab es keine einzige Antwort, die mich davon überzeugen konnte, GCC nicht als das zu wählen primär oder Ursprünglich Compiler für mein Projekt.
g++ hat den Code, den es kompiliert, im Laufe der Jahre geändert – es ist immer am besten, sich an einen bestimmten internationalen Standard zu halten, anstatt an eine bestimmte Implementierung
– anon
31. Dezember 2009 um 18:57 Uhr
+1 sehe nichts Falsches an der Frage
– Hassan Syed
31. Dezember 2009 um 18:59 Uhr
“Ohne wirkliche Erfahrung mit gcc / g++ scheint es mir, dass es jede große Plattform unterstützt, die man sich vorstellen kann …” — Stellen Sie sich XBox und Wii vor … 🙂
– Dan Olson
3. Januar 2010 um 18:14 Uhr
@Dan Olson: Für einen Moment dachte ich, du hättest mich, aber es stimmt openxdk.maturion.de Es scheint, als ob Sie gcc für die XBox verwenden können. Es scheint ähnliches Homebrew-Zeug für die Wii zu geben, ebenfalls basierend auf gcc, obwohl ich keine englische Website zur Hand habe, um dies zu beweisen.
– Lena Schimmel
3. Januar 2010 um 19:33 Uhr
Guter Fund, aber ich glaube, diese sind auf Homebrew beschränkt und können nicht in einer kommerziellen Umgebung verwendet werden, zumindest nicht ohne viel Schmerz.
– Dan Olson
6. Januar 2010 um 0:32 Uhr
Einige Gründe aus dem Kopf:
1) Um zu vermeiden, an einen einzigen Compiler-Anbieter gebunden zu sein (Open Source oder nicht).
2) Das Kompilieren von Code mit verschiedenen Compilern wird wahrscheinlich mehr Fehler entdecken: Warnungen sind unterschiedlich und verschiedene Compiler unterstützen den Standard in unterschiedlichem Maße.
Der zweite Punkt ist sehr wahr; Damals, als ich mehrere Plattformen unterstützte, fand ich eine Reihe von Fehlern, die von einem Compiler abgefangen, aber von den anderen ignoriert wurden.
– Johannes Bode
31. Dezember 2009 um 19:33 Uhr
Brian Campell
Es ist gut, auf MSVC kompilierbar zu sein, da einige Leute möglicherweise Projekte haben, die sie in MSVC erstellen und in die sie Ihren Code einbinden möchten, ohne ein völlig anderes Build-System einrichten zu müssen.
Es ist gut, unter dem Intel-Compiler kompilierbar zu sein, da dieser häufig schnelleren Code kompiliert.
Es ist gut, unter kompilierbar zu sein Klirrenweil es bessere Fehlermeldungen ausgeben und eine bessere Entwicklungserfahrung bieten kann, und es ein einfacheres Projekt ist, an dem man arbeiten kann als GCC, und daher in Zukunft möglicherweise zusätzliche Vorteile bietet.
Im Allgemeinen ist es gut, sich die Optionen offen zu halten, denn es gibt keinen Compiler, der alle Anforderungen erfüllt. GCC ist ein guter Compiler und eignet sich für die meisten Zwecke hervorragend, aber manchmal brauchen Sie etwas anderes.
Und selbst wenn Sie normalerweise nur unter GCC kompilieren, hilft es wahrscheinlich auch, sicherzustellen, dass Ihr Code unter anderen Compilern kompiliert wird, um Probleme zu finden, die Ihren Code beispielsweise daran hindern könnten, mit früheren und zukünftigen Versionen von GCC zu funktionieren, falls vorhanden Etwas, bei dem GCC jetzt weniger streng ist, aber später Prüfungen hinzufügt, kann ein anderer Compiler im Voraus erkennen, was Ihnen hilft, Ihren Code sauberer zu halten. Ich fand dies im umgekehrten Fall hilfreich, wo GCC mehr potenzielle Probleme mit Warnungen entdeckte als MSVC (MSVC ist der einzige Compiler, den wir unterstützen mussten, da wir nur unter Windows ausgeliefert haben, aber wir haben eine teilweise Portierung auf den Mac vorgenommen unter GCC in unserer Freizeit), wodurch ich saubereren Code produzieren konnte, als ich es sonst getan hätte.
Devil’s Advocate: Diese scheinen größtenteils hypothetisch zu sein. Wenn ich MSVC nicht verwende, warum sollte es dann zu den oberen 90 % meiner Prioritätenliste gehören? Warum sollte mich das interessieren, es sei denn, ich brauche einen Geschwindigkeitsschub, den nur ICC bieten kann (wann war die Compiler-Optimierung das letzte Mal ein Engpass?). Usw. Jedes nicht-triviale Projekt hat mindestens Hunderte von offenen Bugs in seinem Bugtracker – keines der Projekte, an denen ich arbeite, hat das Problem, dass wir mit nur einem Compiler nicht genug Bugs finden können. Warum sollte es wichtiger sein, potenzielle Fehler zu finden oder potenziellen Benutzern zu helfen, als an tatsächlichen Problemen zu arbeiten?
– Ken
1. Januar 2010 um 3:56 Uhr
Es würde nicht. Beheben Sie Ihre tatsächlichen Probleme. Das ist am Ende wichtiger. Das OP hat gefragt, warum es wichtig ist, C- oder C++-Code mit verschiedenen Compilern zu kompilieren, und ich habe ihm einige Gründe genannt, aber es ist wichtiger, Ihrer Benutzerbasis Kernfunktionen, Features und Fehlerbehebungen bereitzustellen.
– Brian Campell
1. Januar 2010 um 8:43 Uhr
Sicher, Sie haben Fehler in Ihrem Tracker, aber Sie kennen möglicherweise nur ihre Auswirkungen, nicht ihre Ursache. Ein anderer Compiler erkennt möglicherweise einen Fehler, der tatsächlich der ist weil von 15 Fehlern in Ihrem Tracker. Oder es kann einen unentdeckten Show-Stopper enthüllen, der Ihre Benutzer nach der Veröffentlichung sonst verarschen würde. Wenn Sie mehr Fehler haben, als Sie bewältigen können, ist das kein Grund, den Kopf in den Sand zu stecken. Es gibt schließlich mehr und weniger wichtige Fehler.
– Ulizeuge
3. Januar 2010 um 17:57 Uhr
Brian: Aber gehen dir jemals die aktuellen Ausgaben aus? uliwitness: Ich kann mich nicht erinnern, wann ich das letzte Mal einen Fehler gesehen habe, dessen Ursache ich nicht kannte – Debugger und Protokollierung sind heutzutage verdammt gut, verglichen mit dem, was wir früher hatten. Und “den Kopf in den Sand stecken” ist eine lustige Art, sich auf das “Beheben aktueller Probleme” zu beziehen.
– Ken
5. Januar 2010 um 18:08 Uhr
Herzlichen Glückwunsch, ich beneide Sie um jeden Problembereich, in dem Ihre Apps arbeiten. Ich arbeite an TV-Software, und es gibt genügend Hardware-/Treiber-/Treiberunterstützungsfehler, die umgangen werden müssen, sowie komplexe Decoder- und Playerprobleme (insbesondere in Bezug auf Signalstörungen oder nicht standardisierte kodiert), dass Sie meistens ein paar Wochen damit verbringen, die Quelle eines Problems (oder auch nur einen reproduzierbaren Testfall) aufzuspüren. Es kann sehr hilfreich sein, wenn der Compiler ein Flag setzt, dass es diesmal wirklich nur ein Tippfehler im Code ist.
– Ulizeuge
17. Januar 2010 um 14:33 Uhr
Kemiller2002
Portabilität. Wenn Sie möchten, dass Ihr Code für die größtmögliche Anzahl von Personen zugänglich ist, müssen Sie dafür sorgen, dass er auf möglichst vielen Compilern funktioniert. Es ist die gleiche Idee, wie eine Website auf anderen Browsern als IE laufen zu lassen.
Einiges davon ist politisch. Unternehmen haben Standards, Leute haben Lieblingswerkzeuge usw. Jemandem zu sagen, dass er X verwenden soll, schreckt einige Leute wirklich ab und macht es für andere wirklich unzugänglich.
Nemanja bringt auch einen guten Punkt zur Sprache: Das Zielen auf einen bestimmten Compiler zwingt Sie dazu, ihn zu verwenden. In der Open-Source-Welt ist dies möglicherweise kein so großes Problem (obwohl die Leute einfach aufhören könnten, darauf zu entwickeln, und es veraltet ist), aber was ist, wenn das Unternehmen, von dem Sie es kaufen, das Produkt einstellt oder sein Geschäft aufgibt?
Bei den meisten Sprachen kümmere ich mich weniger um die Portabilität als vielmehr um die Einhaltung internationaler Standards oder anerkannter Sprachdefinitionen, aus deren Eigenschaften sich die Portabilität wahrscheinlich ergibt. Für C ist Portabilität jedoch eine nützliche Idee, da es sehr schwierig ist, ein Programm zu schreiben, das “strikt konform” zum Standard ist. (Warum? Weil die Standardisierungsgremien es für notwendig hielten, einige bestehende Praktiken zu übernehmen, darunter auch, den Compilern einige Freiheiten zu geben, die sie vielleicht nicht haben möchten.)
Warum also versuchen, einem Standard zu entsprechen oder Ihren Code für mehrere Compiler akzeptabel zu machen, anstatt einfach zu schreiben, was auch immer gcc (oder Ihr anderer Lieblingscompiler) akzeptiert?
Wahrscheinlich wird gcc im Jahr 2015 eine ziemlich andere Sprache akzeptieren als heute. Sie würden es vorziehen, Ihren alten Code nicht neu schreiben zu müssen.
Möglicherweise wird Ihr Code auf sehr kleine Geräte portiert, auf denen die GNU-Toolchain nicht so gut unterstützt wird.
Vielleicht erfindet jemand ein großartiges neues Tool zum Analysieren von C-Programmen, Refactoring von C-Programmen, Verbessern der Leistung von C-Programmen oder Finden von Fehlern in C-Programmen. Wir sind nicht sicher, mit welcher Version von C dieses Tool funktioniert oder auf welchem Compiler es basiert, aber mit ziemlicher Sicherheit wird das Tool Standard-C akzeptieren.
Von all diesen Argumenten ist es das Tool-Argument, das ich am überzeugendsten finde. Die Leute vergessen, dass man mit Quellcode noch andere Dinge tun kann, als ihn nur zu kompilieren und auszuführen. In einer anderen Sprache, Haskell, hinkten Tools für Analyse und Refactoring weit hinter Compilern hinterher, aber Leute, die am Haskell 98-Standard festhielten, haben Zugriff auf a viel mehr Werkzeuge. Eine ähnliche Situation ist wahrscheinlich für C: Wenn ich mir die Mühe mache, ein Tool zu bauen, werde ich es auf einem Standard mit einer Lebensdauer von etwa 10 Jahren basieren, nicht auf einer gcc-Version, die sich vorher ändern könnte Mein Werkzeug ist fertig.
Allerdings können es sich viele Leute leisten, die Portabilität komplett zu ignorieren. Zum Beispiel habe ich 1995 versucht, Linus Torvalds davon zu überzeugen, es möglich zu machen, Linux mit jedem ANSI-C-Compiler zu kompilieren, nicht nur mit gcc. Linus hatte überhaupt kein Interesse – ich vermute, er kam zu dem Schluss, dass nichts für ihn oder sein Projekt dabei wäre. Und er hatte recht. Linux nur mit gcc kompilieren zu müssen, war ein großer Verlust für Compiler-Forscher, aber kein Verlust für Linux. Das „Tool-Argument“ galt nicht für Linux, weil Linux so unglaublich populär wurde; Leute, die Analyse- und Bug-Finding-Tools für C-Programme entwickelten, waren bereit, mit gcc zu arbeiten, weil der Betrieb unter Linux es ihrer Arbeit ermöglichen würde, große Auswirkungen zu haben. Wenn Sie sich also darauf verlassen können, dass Ihr Projekt ein voller Erfolg wird wie Linux oder Mosaic/Netscape, können Sie es sich leisten, Standards zu ignorieren 🙂
Wenn Sie für verschiedene Plattformen erstellen, werden Sie am Ende verschiedene Compiler verwenden. Darüber hinaus neigen C++-Compiler dazu, immer etwas hinter dem C++-Standard zu sein, was bedeutet, dass sie ihre Einhaltung im Laufe der Zeit normalerweise ändern. Wenn Sie den gemeinsamen Nenner auf alle großen Compiler abzielen, werden die Wartungskosten für den Code niedriger sein.
nichtnoop
Bei Anwendungen (insbesondere Open-Source-Anwendungen) kommt es häufig vor, dass andere Entwickler andere Compiler verwenden möchten. Einige würden lieber Visual Studio mit MS Compiler für Entwicklungszwecke verwenden. Einige würden lieber den Intel-Compiler für behauptete Leistungsvorteile und dergleichen verwenden.
Lena Schimmel
Also hier sind die Gründe, die ich mir vorstellen kann
wenn Geschwindigkeit das größte Anliegen ist und es für einige Plattformen spezielle, hochoptimierte Compiler gibt
wenn Sie eine Bibliothek mit einer C++-Schnittstelle erstellen (Klassen und Templates, statt nur Funktionen). Aufgrund von Namensverstümmelungen und anderen Dingen muss die Bibliothek mit demselben Compiler kompiliert werden wie der Client-Code, und wenn der Client Visual C++ verwenden möchte, muss er in der Lage sein, die Lib damit zu kompilieren
wenn Sie eine sehr seltene Plattform unterstützen möchten, die keine gcc-Unterstützung hat
(Für mich spielen diese Gründe keine Rolle, da ich eine Bibliothek bauen möchte, die intern C++ verwendet, aber eine C-Schnittstelle hat.)
Möchten Sie eine Open-Source-Bibliothek erstellen? Dann muss es auf irgendetwas kompilieren. Möchten Sie G++ 4.4 verwenden, wenn G++ 7 verfügbar ist und Ihr 13-Klassen-Programm „Hello World“ in eine 52-Byte-Binärdatei umwandeln kann? Dann müssen Sie standardkonformes C++ schreiben, was bedeutet, dass Sie mit vielen Compilern kompilieren sollten, um sicherzustellen, dass Sie nicht an etwas hängen bleiben, das G++ unterstützt, aber niemand sonst tut (oder das sie unterstützten, aber nicht mehr tun, also Sie müssen Sie entweder Ihren gesamten Code neu schreiben oder mit einem veralteten Compiler kompilieren).
– Chris Lutz
31. Dezember 2009 um 19:25 Uhr
11459300cookie-checkWarum ist es wichtig, dass C / C++ Code auf verschiedenen Compilern kompilierbar ist?yes
g++ hat den Code, den es kompiliert, im Laufe der Jahre geändert – es ist immer am besten, sich an einen bestimmten internationalen Standard zu halten, anstatt an eine bestimmte Implementierung
– anon
31. Dezember 2009 um 18:57 Uhr
+1 sehe nichts Falsches an der Frage
– Hassan Syed
31. Dezember 2009 um 18:59 Uhr
“Ohne wirkliche Erfahrung mit gcc / g++ scheint es mir, dass es jede große Plattform unterstützt, die man sich vorstellen kann …” — Stellen Sie sich XBox und Wii vor … 🙂
– Dan Olson
3. Januar 2010 um 18:14 Uhr
@Dan Olson: Für einen Moment dachte ich, du hättest mich, aber es stimmt openxdk.maturion.de Es scheint, als ob Sie gcc für die XBox verwenden können. Es scheint ähnliches Homebrew-Zeug für die Wii zu geben, ebenfalls basierend auf gcc, obwohl ich keine englische Website zur Hand habe, um dies zu beweisen.
– Lena Schimmel
3. Januar 2010 um 19:33 Uhr
Guter Fund, aber ich glaube, diese sind auf Homebrew beschränkt und können nicht in einer kommerziellen Umgebung verwendet werden, zumindest nicht ohne viel Schmerz.
– Dan Olson
6. Januar 2010 um 0:32 Uhr