Wann sollten neue C-Projekte auf sehr alte C-Standards abzielen (> 20 Jahre, dh C89)?


12

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.


10
"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." Sie haben nicht genug eingebettete Arbeit getan ;-)
Philip Kendall

1
@PhilipKendall Ich habe keine eingebettete Arbeit gemacht. Ich ermutige Sie, mich mit einer Antwort aufzuklären!
Praxeolitic

2
Sobald ein Standard festgelegt ist, gilt er praktisch für immer. Manchmal länger als 2000 Jahre .
Doc Brown

1
@DocBrown Beachten Sie jedoch, dass auf dieser Seite erklärt wird, dass die Behauptung, dies sei ein 2000 Jahre alter Standard, falsch ist.
Jesper

1
Wenn Sie so etwas sehen, ist die erste Frage, die Sie stellen sollten, "Auf welche Plattform (en) soll (en) es abzielen?", Gefolgt von "Welche Version (en) von C kann (können) auf / für diese Plattform (en) kompiliert werden )? " Dann kommt: "Welche Version (en) von C bieten die größte Kompatibilität mit den Projektanforderungen?" Und die nächste wäre wahrscheinlich: "Mit welchen Versionen von C ist die Mehrheit der Projektleiter am vertrautesten?"
Justin Time - Reinstate Monica

Antworten:


14

... "älter und standardisiert ist immer tragbarer und besser", was lächerlich ist ...

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.


3
Das Mischen von Variablendeklarationen und -anweisungen ist für die Verständlichkeit recht gut. Inline-Funktionen, eingeschränkte Unicode-Unterstützung und long longsind auch nett zu haben.
Deduplikator

Auch Multithreading ist manchmal schön zu haben ...
Deduplizierer

@ Deduplicator Ich bin nicht anderer Meinung, dass die neuen Versionen von C99 und C11 Verbesserungen sind. Sie können alle gewünschten C11-Daten schreiben, wenn Sie ein Geschäftsmodell erstellen können, dessen Wert den Wert der Portabilität auf ältere Umgebungen übersteigt. Schreiben Sie das unter "Untersuchen Sie das Problem und finden Sie das richtige Werkzeug für den Job."
Blrfl

2
Nun, der Punkt war, dass Sie die wichtigen Verbesserungen nicht genau erwähnt haben .
Deduplikator

@ Deduplicator: Ich habe in den 1990er Jahren Multithread-Code geschrieben. Code, der auf sprachbasierten Threading-Funktionen basiert, kann in freistehenden Implementierungen, die nicht alle vom Standard geforderten Funktionen unterstützen, unbrauchbar sein, während der Code, der Bibliotheken zum Packen von Plattformfunktionen verwendet, die die von ihnen benötigten Funktionen unterstützen, an jede Plattform angepasst werden kann, die solche Funktionen unterstützt .
Supercat

10

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.


Ja, das Argument dafür ist die Portabilität, aber die Frage ist, ob es tatsächlich nicht-hypothetische Systeme gibt, die nur einen C89-Compiler verwenden können, aber neue Softwareverteilungen kompilieren. Wenn ich ein neues C-Projekt starten würde, wie würde ich entscheiden, ob die Einhaltung von C89 die Anzahl der potenziellen Benutzer erhöhen könnte? Der MSVC-Punkt ist gut.
Praxeolitic

1
@Praxeolitic Es ist wirklich eine Frage, ob Sie Code erstellen, der von einer Vielzahl unterschiedlicher Benutzer verwendet wird. Weil es eine Menge Leute geben wird, die alte Compiler verwenden, entweder weil sie kein Upgrade durchführen können oder weil sie es für zu riskant und zu aufwändig halten, ein Upgrade durchzuführen.
Simon B

3

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 booloder nur _Boolals einfaches Beispiel, wenn sie Funktionen aus einer Dylib importieren, und verstehen beispielsweise nur int.

Ja, das Argument dafür ist die Portabilität, aber die Frage ist, ob es tatsächlich nicht-hypothetische Systeme gibt, die nur einen C89-Compiler verwenden können, aber neue Softwareverteilungen kompilieren. Wenn ich ein neues C-Projekt starten würde, wie würde ich entscheiden, ob die Einhaltung von C89 die Anzahl der potenziellen Benutzer erhöhen könnte?

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.