Gelegentlich sehe ich große, relativ neue Open Source C-Projekte, die auf sehr alte C-Standards abzielen, typischerweise C89. Ein Beispiel ist systemd. Diese Projekte haben intelligente Leute am Ruder, daher haben sie wahrscheinlich eine gute Begründung für diese Entscheidung, von der ich nichts weiß. Abgesehen von diesem Vorteil des Zweifels scheint es fast so, als ob die Begründung "älter und standardisiert ist immer tragbarer und besser" ist, was lächerlich ist, da die logische Schlussfolgerung wäre, dass FORTRAN besser ist als C und COBOL sogar besser als FORTRAN.
Wann und warum ist es gerechtfertigt, dass neue C-Projekte auf sehr alte C-Standards abzielen?
Ich kann mir kein Szenario vorstellen, in dem das System eines Benutzers unbedingt seinen C-Compiler nicht aktualisieren muss, ansonsten aber frei ist, neue Software zu installieren. Die LTS-Version von Debian hat zum Beispiel ein gcc 4.6-Paket, das C99 und einige von C11 unterstützt. Ich vermute, dass es ein seltsames Szenario geben muss und Programme wie systemd diese Benutzer ansprechen.
Der vernünftigste Anwendungsfall, den ich mir vorstellen kann, besteht darin, dass Benutzer voraussichtlich über exotische Architekturen verfügen, auf denen nur ein C89-Compiler verfügbar ist, die jedoch bereit sind, neue Software zu installieren. Angesichts des Rückgangs der Vielfalt der Befehlssatzarchitekturen scheint dies ein übermäßig hypothetisches Szenario zu sein, aber ich bin mir nicht sicher.
Antworten:
Diese Aussage wurde lächerlich, als es besser wurde , was völlig subjektiv ist. Sie wählen keine Sprache und keinen Standard für ein Projekt aus, da die Hälfte der Personen, die Sie beim letzten Treffen besucht haben, diese verwendet haben. Sie entscheiden sich dafür, weil Sie das Problem, das Sie lösen, studiert und verstanden haben und festgestellt haben, dass es das richtige Werkzeug für den Job ist.
Für Standards im Allgemeinen gibt es bei einigen Projekten Argumente für die Portabilität, und hier hat die Auswahl eines älteren einen gewissen Vorteil. Dies gilt insbesondere dann, wenn Sie Bibliotheken als Produkte entwickeln, die dem Zweck eines anderen dienen. Das Letzte, was Sie tun möchten, ist, etwas zu schreiben, das Sie nicht verkaufen können, da es einen Compiler erfordert, den Kunden, die Sie noch nicht getroffen haben, möglicherweise nicht zur Verfügung haben. Philip Kendalls Kommentar zur eingebetteten Welt ist genau richtig; Es gibt eine Menge davon, entweder weil die Leute immer noch neuen Code für alte, stabile Plattformen schreiben müssen oder diejenigen, die nicht von den zusätzlichen Funktionen profitieren und keinen aktuellen Compiler bekommen. Wenn Sie die vollständige Kontrolle über jeden Aspekt Ihres Projekts haben, gibt es
Speziell für C stellt sich die Frage, was Sie als Gegenleistung für die Einhaltung des neuesten Standards erhalten. Die Umstellung von K & R auf C89 war eine große Änderung, die viel Aufwand für die Bereinigung von altem Code erforderte, aber letztendlich viel Gutes brachte. Die Änderungen in C99 und C11sind im Vergleich gering, und der Großteil der kürzlich entwickelten CI-Begegnung würde immer noch C89 bestehen, da die neuen Funktionen nicht verwendet werden. Es ist schwer zu argumentieren, dass das Mandatieren von C99 über C89 das Richtige wäre, da es einzeilige Kommentare unterstützt, einen systemeigenen booleschen Datentyp aufweist und Arrays variabler Länge ausführen kann. Die Kommentare und Booleans haben nicht hässliche Problemumgehungen und VLAs können auf andere, etwas weniger effiziente Weise behandelt werden. C11 hat VLAs zu optional herabgestuft, und dies ist möglicherweise eine Rechtfertigung für die Wahl des älteren C99, wenn diese in Ihrer Implementierung eine herausragende Rolle spielen.
quelle
long long
sind auch nett zu haben.Wenn Portabilität über eine Vielzahl von Plattformen wichtig ist. Dies kann veraltete Plattformen und viele eingebettete Prozessoren umfassen, für die nur ein minimalistischer Compiler verfügbar ist.
In gewisser Hinsicht ist C89 auch der "kleinste gemeinsame Nenner". Es war die erste richtig standardisierte Version, und es kann davon ausgegangen werden, dass so ziemlich jeder Compiler, der heute verwendet wird, eine Obermenge von C89 implementiert.
Es gibt auch das Problem, dass Microsoft Visual C ++, obwohl es relativ gut mit den C ++ - Standards Schritt halten konnte, im C-Modus lange Zeit bei C89 festhielt. Jeder, der nicht das neueste Visual Studio verwendet, ist möglicherweise auf C89 beschränkt.
quelle
Ich muss zugeben, dass ich immer noch Pseudo-C89-Code schreibe (nicht vollständig C99-konform), hauptsächlich wegen Microsoft. Ich verlasse mich stark auf MSVC für die Windows-Seite und sie sind immer noch nicht vollständig C99-kompatibel. Stattdessen liegt der Schwerpunkt auf C ++ 17 und höher.
Darüber hinaus arbeite ich an C SDKs, für die viele Plugin-Entwickler MSVC für ihre Plugin-Entwicklung verwenden, und an einigen, die immer noch MSVC 2010 sind. Daher gibt es immer noch beliebte Compiler, die auf Plattformen weit verbreitet sind, die nicht so exotisch sind (sofern Sie dies nicht in Betracht ziehen) Windows (exotisch), die C99 noch nicht vollständig implementieren. Wenn Sie eine breite Kompatibilität mit den meisten Compilern anstreben (was einer der Hauptgründe dafür ist, dass das SDK in C und nicht in C ++ geschrieben ist), gibt es immer noch eine Reihe weit verbreiteter Compiler (zumindest MSVC), die in der heutigen Zeit zurückliegen wenn es um C-Unterstützung geht. Es ist fast ein paar Jahrzehnte her, seit C99 und wir haben immer noch keine VLAs, z. B. in MSVC AFAIK. .
Und so gibt es leider immer noch neue Compiler, die eigentlich ganz gut mit guten Optimierern und Debuggern umgehen können, die noch nicht einmal vollständig C99-konform sind. Natürlich, wenn es das nicht gäbe, würde ich über C11 springen.
Neben der Quellkompatibilität mit Plugins und MSVC gibt es auch Interop mit anderen Sprachen. Einige andere Sprachen verwenden das SDK über ein FFI, und einige dieser FFIs verstehen nur C89. Sie verstehen möglicherweise nicht
bool
oder nur_Bool
als einfaches Beispiel, wenn sie Funktionen aus einer Dylib importieren, und verstehen beispielsweise nurint
.Blrfl
Ich habe es gerade bemerkt, aber die Art von Echo , der Produktivitätsgewinn durch die Verwendung von C99 und C11 ist in meinem Fall nicht so enorm, während der Verlust der Möglichkeit, dass Benutzer ihre Plugins in MSVC schreiben können, enorme Kosten verursachen kann (insbesondere, da das Produkt, das ich verwende on hat mit Abstand den größten Marktanteil auf der Windows-Seite, und der durchschnittliche Benutzer kauft und lädt häufig viele Plugins von Drittanbietern herunter. Die Art von Produkt, an dem ich arbeite, liegt fast in der Mitte zwischen einer Entwicklungsumgebung für Programmierer / Skripter und einem Benutzer-Endprodukt für Künstler, da so viele Leute neue Dinge darüber entwickeln möchten, um neue Funktionen zu ermöglichen und Spezialeffekte von a zu erzielen nette Leute haben noch nicht gesehen. In meinem Fall war es also eigentlich eine recht einfache Entscheidung, C89 zumindest für das SDK zu favorisieren.Ich nehme an, Sie müssen sich die Compiler um Sie herum ansehen und versuchen, Ihre Zielgruppe herauszufinden. Wenn Sie keine Plug-in-Architektur für Windows entwickeln oder keine eingebettete Programmierung ausführen oder nicht versuchen, ein Software Development Kit zu erstellen, das von den unterschiedlichsten Compilern und Sprachen verwendet werden kann, ist C99 + auf jeden Fall einfacher zu erreichen Weg. Überlegen Sie auch, wie viel Produktivitätssteigerung Sie ab C99 erzielen. Ich profitiere nicht so sehr von Dingen wie VLAs, da ich mich auf ausreichend einfache Methoden stütze, um den Stapel zu verwenden, wenn die Daten passen, und ansonsten einen Heapspeicher zu erstellen.
Aber es gibt eine ganze Reihe von Dingen, die von bekannten Compilern wie MSVC bis hin zu FFIs in anderen Sprachen hinterherhinken. Diese sind in dem Sinne cool, dass sie C-Funktionen direkt aus einer Dylib importieren und aufrufen können, aber möglicherweise auch ein bisschen hinterherhinken mal. Es gibt also viel mehr praktische geschäftliche Aspekte, die Sie je nach Ihrer Domäne berücksichtigen müssen, als lediglich ältere und standardisierte Elemente für eine bestimmte Art von Ästhetik zu bevorzugen.
quelle