Was macht C im Zeitalter von OOP so beliebt? [geschlossen]


91

Ich habe viel in C und C ++ geschrieben, aber nicht erwartet, dass C die zweitbeliebteste Sprache ist, etwas hinter Java.

TIOBE Programming Community Index

Ich bin gespannt, warum C in diesem Zeitalter von OOP immer noch so beliebt ist. Beachten Sie, dass 4 der 5 beliebtesten Programmiersprachen "moderne", objektorientierte Sprachen sind.

Ich bin damit einverstanden, dass Sie OOP in gewissem Umfang in C verwenden können, aber es ist irgendwie schmerzhaft und unelegant (zumindest im Vergleich zu C ++, denke ich). Was macht C so beliebt? Ist es Effizienz? niedrig sein; die überwiegende Mehrheit der Bibliotheken, die es bereits gibt, oder etwas anderes?


18
Videospiele, eingebettete Systeme, Hardwareprogrammierung (Firmware), Betriebssysteme usw.

25
Beachten Sie, dass Sie nur das erhalten, was Sie messen - im Fall von TIOBE die Anzahl der Treffer für +"<language> programming"beliebte Suchmaschinen. Ein Blogeintrag "Warum niemand mehr C programmiert" zählt für C in diesem Index. Scheiße, auch diese Frage wird möglicherweise beantwortet, sobald Google sie aufgreift.

40
Das Alter von OOP? Das ist eine ziemlich kühne Aussage.
Mahmoud Hossam

57
Sie haben die Illusion, dass OOP eine Wunderwaffe ist. Sie sollten so schnell verlieren. OOP hat nichts Besonderes oder "Gutes". Es ist nur eine von vielen Strategien zur Code-Organisation.
Raynos

23
@DeadMG: Pot, treffe Kessel. Die Daten von TIOBE sind möglicherweise nicht zuverlässig, aber Ihre kahle Behauptung, dass "es nicht populär ist", hat keinerlei Quelle oder Zitat. Wenn Sie die Vermutung hinter der Frage in Frage stellen wollen, sollten Sie zumindest Beweise dafür liefern.
Daniel Pryden

Antworten:


142

Einige Faktoren, die dazu beitragen:

  • C ist allgegenwärtig. Unabhängig von der Plattform ist C wahrscheinlich verfügbar.
  • C ist tragbar. Schreiben Sie ein sauberes C, und es wird mit minimalen Änderungen auf anderen Plattformen kompiliert - manchmal funktioniert es sogar sofort.
  • C ist schon eine Weile da. Zurück in den Tagen , als UNIX die Welt erobert, C (die UNIX Programmiersprache der Wahl) in seiner Weltherrschaft geteilt, und wurde die lingua franca der Programmierung Welt. Jeder ernsthafte Programmierer kann erwartet werden , zumindest um einige Gefühl von einem Stück C; das Gleiche kann man nicht über die meisten anderen Sprachen sagen.
  • C ist weiterhin die Standardsprache für UNIX- und UNIX-Systeme. Wenn eine Bibliothek im Open-Source-Bereich erfolgreich sein soll, brauchen Sie gute Gründe , um C nicht zu verwenden. Dies liegt zum Teil an der Tradition, zum anderen daran, dass C die einzige Sprache ist, von der Sie sicher ausgehen können, dass sie unter allen UNIX-ähnlichen Betriebssystemen unterstützt wird System. Wenn Sie Ihre Bibliothek in C schreiben, können Sie Abhängigkeiten minimieren.
  • C ist einfach. Es fehlt die Ausdruckskraft von hoch entwickelten OOP- oder funktionalen Sprachen, aber seine Einfachheit bedeutet, dass es schnell aufgenommen werden kann.
  • C ist vielseitig. Es eignet sich für eingebettete Systeme, Gerätetreiber, Betriebssystem-Kernel, kleine Befehlszeilendienstprogramme, große Desktop-Anwendungen, DBMS, die Implementierung anderer Programmiersprachen und so ziemlich alles, was Sie sich vorstellen können.
  • C ist schnell. Die meisten C-Implementierungen werden direkt in Maschinencode kompiliert, und der Programmierer hat die volle Kontrolle darüber, was auf Maschinenebene geschieht. Es gibt keinen Interpreter, keinen JIT-Compiler, keine VM oder Laufzeitumgebung - nur den Code, einen Compiler, einen Linker und das Bare Metal.
  • C ist "frei" (sowohl im Bier- als auch im Sprachsinn). Es gibt kein einzelnes Unternehmen, das den Standard besitzt und kontrolliert, es stehen mehrere Implementierungen zur Auswahl, es gibt keine Urheberrechts-, Patent- oder Markenprobleme für die Verwendung von C und einige der besten Implementierungen sind Open-Source-Implementierungen.
  • C hat viel Schwung. Die Sprache ist seit Jahrzehnten beliebt, daher gibt es eine enorme Anzahl von Anwendungen, Bibliotheken, Tools und vor allem Communitys, die die Sprache unterstützen.
  • C ist ausgereift. Der letzte Standard, der große Änderungen eingeführt hat, ist C99 und ist größtenteils abwärtskompatibel mit früheren Standards. Im Gegensatz zu neueren Sprachen (z. B. Python) müssen Sie sich nicht darum kümmern, Änderungen so schnell wie möglich vorzunehmen.
  • C ist kompatibel. Die meisten Sprachen haben Bindungen, um mit C zu sprechen. Dies bedeutet, dass man eine Bibliothek in C unter Verwendung von Standardaufrufkonventionen entwickeln und sicher sein kann, dass fast jede andere Sprache mit dieser Bibliothek verknüpft werden kann. Um nur einige beliebte Sprachen zu nennen, die häufig verwendet werden: C #, Java, Perl, Python und PHP können problemlos mit C-Bibliotheken verknüpft werden.
  • C ist mächtig: Wenn die Sprache etwas nicht kann, erlauben alle gängigen Compiler das Einbetten von Assembler-Code, der alles kann, was die Hardware kann. In Verbindung mit dem obigen Punkt zur Kompatibilität kann dies bedeuten, dass C als Verbindung zwischen übergeordneten Sprachen und dem "Bare Metal" der Baugruppe fungiert.

9
Ich denke, nicht alle Ihre Argumente sind richtig. 1) C ist allgegenwärtig. C ++ ist so allgegenwärtig wie C, da es C ++ - zu-C-Compiler gibt. 2) C ist tragbar. Das selbe mit C ++. 3). C ist schon eine Weile da. Das selbe mit C ++. 4). C ist vielseitig. Das selbe mit C ++. 5) C ist schnell. Das selbe mit C ++. 6). C ist 'frei'. Das selbe mit C ++. 7). C hat viel Schwung. Das gleiche gilt auch für C ++. 8) C ist ausgereift. Das selbe mit C ++. Sie beantworten die Frage also nicht.
Konstantin Solomatov

19
C11 ist der neueste Standard, nicht C99. Nicht, dass es wirklich wichtig wäre, da jeder '89 benutzt.
Pubby

53
@KonstantinSolomatov: Wenn Sie eine Bibliothek schreiben, die von anderen Leuten konsumiert wird, tun Sie der Welt bitte einen Gefallen und schreiben Sie sie in C anstelle von C ++. Wenn Sie das nicht können, schreiben Sie zumindest eine C-API. Alles im Universum kann auf die eine oder andere Weise, normalerweise mit minimalem Aufwand, mit C-Code verknüpft werden. Im Gegensatz dazu treten häufig große ABI-Probleme auf, wenn Sie versuchen, C ++ - Code aus einem anderen C ++ - Code aufzurufen , geschweige denn aus anderen Sprachen.
Daniel Pryden

37
@KonstantinSolomatov - die Tatsache, dass ein C ++ to C-Compiler benötigt wird, beweist, dass C allgegenwärtig ist.
Detly

11
@ KonstantinSolomatov: Bitte hör auf zu denken, dass C C ++ ist. C hat keine Verschlüsse. Einige Erweiterungen von C (z. B. die von der GCC-Compilerfamilie implementierte), C selbst jedoch nicht (dh es ist nicht in der ursprünglichen K & R-Spezifikation oder einem der finalisierten C-Standards enthalten).
Donal Fellows

88

Ich habe die Popularität von C immer auf die Notwendigkeit einer universellen Assemblersprache zurückgeführt. Die Kombination aus Spezifität auf Maschinenebene, Standardisierung und extremer Portabilität ermöglicht es C, de facto als universelle Assemblersprache zu fungieren , und aus diesem Grund gehe ich davon aus, dass seine Rolle dort auf unbestimmte Zeit fortbestehen wird.

Ich sollte erwähnen, dass ich immer ein bisschen überrascht bin, wenn OOP in Programmierkursen als eine Art "Endmodell" präsentiert wird, das der einzig mögliche Endpunkt für eine gute Programmierung ist. Wie viele andere Aspekte der Programmierung ist der Wert von OOP ein Kompromiss zwischen vielen konkurrierenden Faktoren, einschließlich der Art und Weise, wie das menschliche Gehirn Informationen organisiert, wie gesellschaftliche Gruppen Software langfristig unterstützen, und im Fall der objektorientierten Programmierung einigen ziemlich tiefen Aspekten wie das Universum selbst funktioniert.

Und dieser letzte Punkt ist es wert, ein bisschen gehämmert zu werden. Lesen Sie weiter, wenn Sie sich für eine Untersuchung auf physikalischer Ebene interessieren, warum es bestimmte Programmierstile gibt, wie sie zusammenarbeiten und wohin die Welt in Zukunft gehen könnte, wenn wir solche Konzepte weiter ausbauen ...

Ein Objekt in der Physik ist alles, was im Laufe der Zeit erkennbare Kohärenz bewahrt. Das wiederum ermöglicht einfachen Kreaturen wie uns, das Objekt nur mit einer geringen Anzahl von Bits darzustellen, ohne unser Überleben zu gefährden. Aber in Bezug auf die Physik im Großen ist die Anzahl der Dinge, die Sie genau richtig machen müssen, um diese Art der Vereinfachung einfach und gebräuchlich zu machen, bemerkenswert groß. Als Menschen denken wir nicht so viel darüber nach, denn ehrlich gesagt wären wir nicht hier, wenn es nicht wahr wäre.

Hört sich zu abstrakt an? Das ist es wirklich nicht. Stellen Sie sich zum Beispiel vor, Sie würden versuchen, die Straße zum Haus Ihres Freundes zu navigieren, wenn Sie anstelle von Autos auf schnell oszillierende Plasmafelder und kurzzeitige Verdichtungen von Materie stoßen, die sich mit einem enormen Geschwindigkeitsbereich bewegen. Ein solches Szenario könnte die Möglichkeiten der Sozialisierung ziemlich stark einschränken, ja? Wir brauchen Objekte, wir sind Objekte, und die Existenz von Objekten bietet uns ein enormes und kritisch wichtiges Maß an Vereinfachung der Umwelt um uns herum.

Lassen Sie uns all das auf Software zurückführen. Was sagen Objekte in der realen Welt über Objekte in Bezug auf die Programmierung?

Zum einen bedeutet dies, dass das, was ein "gutes" Objekt in der Software definiert, wirklich sein sollte, ob die Art der Daten, die Sie verarbeiten, die Idee einer erkennbaren Persistenz über die Zeit hinweg unterstützt oder nicht .

Mit der Definition sind die einfachsten Formen von OOP leicht zu erkennen. Sie sind diejenigen, die ein wenig damit fertig werden, indem sie nur Daten verwenden, die bereits "angehängt" oder durch ein reales, wirklich physisches Objekt wie eine Person, ein Haus oder ein Auto definiert sind. Dies ist auch heute noch zu oft die einzige Definition von Objekten, die Menschen in Software-Kursen erhalten. Das ist schade, denn auch triviale objektorientierte Programme brauchen eine umfassendere Definition.

Die zweite und weitaus interessantere Kategorie von Objekten besteht aus dem, was ich als unsterbliche reale Ereignisse bezeichne . Mit "unsterblich" meine ich Dinge, die zumindest kurzzeitig als genau definierte Einheit oder Sammlung in der realen Welt existieren, die sich dann auflösen und nicht mehr als physikalisch bedeutsame Sammlungen existieren. Ein Symposium ist ein gutes Beispiel: Das Symposium existiert für eine kurze Zeit als eine dezent definierte Sammlung von Orten und Personen. Aber leider müssen auch die besten Konferenzen enden, und die einzelnen Teile, aus denen sie bestehen, müssen sich anderen Aktivitäten widmen.

Aber durch Computer und Netzwerke verwenden, können wir so machen ein vorübergehendes Symposium scheint wie eine langfristige Aufgabe durch die Erfassung und eine Erinnerung an mich als Software - Objekt zu halten. Viele Dinge, die wir mit Computern und Datenbanken tun, laufen auf diese Art der Unsterblichkeit vorübergehender Ereignisse hinaus, bei der wir versuchen, unser reales Universum reicher zu machen, indem wir es auf eine Weise erfassen und erweitern, die physikalisch unmöglich existieren kann. Hast du in letzter Zeit eine echte Pandora gesehen? Solche Aufnahmen und Erweiterungen von realen Objekten tragen dazu bei, unser eigenes Leben, unsere Wirtschaft und unsere Entscheidungen auf bemerkenswerte Weise zu bereichern und zu erweitern. Dies ist für mich das Kernland der objektorientierten Programmierung, der Ort, an dem sie die bemerkenswertesten Auswirkungen hatte und auch weiterhin hat.

Eine letzte Kategorie von OOP besteht aus Objekten, die keine enge Verbindung zu externen Ereignissen haben, sondern die Infrastruktur darstellenbenötigt, um unsere ständige Erweiterung der Realität mit unsterblichen Objekten aus der realen Welt zu unterstützen. Hier können Sie bis zum (Halb-) Metall des Computers hinabsteigen und Stücke von beständiger Realität schaffen, die wie die chemischen Elemente der realen Welt schnell und auf interessante Weise kombiniert werden können, um neue innere Welten aufzubauen. Mobile Computing hat das Wachstum dieses hochrekombinatorischen Ansatzes gefördert, der die rekombinatorischen Merkmale der physischen Welt in vielerlei Hinsicht nachahmt. Es ist auch schwierig: Was nach einer guten Wahl aussieht, kann sich im Laufe der Zeit als unerwartet schlecht herausstellen, normalerweise, weil es Vielfalt und Expansion blockiert, anstatt sie zu unterstützen.

Diese letzte Kategorie weist auch auf die Risiken der Verwendung nur eines Modells für die Programmierung hin, da programmierte Welten wie die reale Welt auch Prozesse benötigen, die dies nicht tunkorrespondieren gut mit relativ unveränderlichen Objekten. Die Erde ist voll von Objekten, aber die Sonne ist voll von hochdynamischen Energieflüssen, die letztendlich benötigt werden, um die Objekte und Aktivitäten auf der Erde mit niedrigerer Energie "anzutreiben". In ähnlicher Weise gibt es beim Erstellen von Computerwelten Fälle, in denen Sie sich mit Flüssen und Transformationen und sich schnell ändernden Kontexten auseinandersetzen müssen, die zwar an sich nicht sehr objektähnlich sind, aber dennoch von entscheidender Bedeutung sind, um die einfacheren, menschlicheren Objekte auf höheren Ebenen zu ermöglichen . Es ist kein Zufall, dass ein Großteil der Programmierung auf Kernel-Ebene nicht auffällig objektorientiert ist oder dass Sprachen wie C eher verarbeitungsorientiert sind. Dies sind die tieferen Bereiche, die die faszinierende Vielfalt ergänzen, die wir in computergenerierten Welten sehen.

Der andere Bereich, in dem OOP schief gehen kann, konzentriert sich zu sehr auf alte Objektkonzepte.

Objekte in der realen Welt und insbesondere lebende Objekte verfügen über eine erstaunliche Fähigkeit, auf komplexe und subtile Weise mit ihrer Umgebung zu interagieren. Zusammensetzbare Widgets, die sich gegenseitig überblicken, Kompatibilitäts- und Vernunftsprüfungen durchführen und möglicherweise sogar neue Interaktionsmöglichkeiten finden, die dem realen biologischen Konzept von Objekten sehr nahe kommen als die einfachen Frameworks und Vererbungsschemata, die wir pflegen auf der Code-Ebene zu konzentrieren (in der Regel aus Notwendigkeit!). Dies ist einer der Wachstumsbereiche für Objekte in der Cyberwelt, die eher agentenähnlichen Ansätzen entsprechen, bei denen die Reaktivität gegenüber der Umgebung selbst innerhalb der Programmierung die Norm ist.

Und so viel zu meiner "Kritik" an OOP! Dennoch hoffe ich, dass ich darauf hingewiesen habe, warum die Schaffung einer reichhaltigeren Cyberwelt bedeutet, die Vielfalt der Programmierstile einzubeziehen , anstatt davon auszugehen, dass "nur eine" alles ist, was benötigt wird. Mein Gefühl ist, dass das wirklich interessante Zeug noch kommen wird, egal wie banal viel von dem ist, was wir jetzt tun!


18
Ich bin mir sicher, dass einige Leute den Teil "Nur weiterlesen, wenn Sie an einer Erkundung auf Physikniveau interessiert sind" abgebrochen haben. Ich bin froh, dass ich es nicht getan habe. Dies ist die Art von Denken, die die Grundlagen unseres Verständnisses erschüttert, und wahrscheinlich der einzige Weg, auf dem wir bemerkenswerte Fortschritte erzielen werden. Vielen Dank für die tolle Lektüre.
Matt Esch

@Raynos, $ MattEsch, ich danke Ihnen beiden für die freundlichen Worte und freue mich, dass Sie es interessant fanden!
Terry Bollinger

1
Ich habe mich auf der Website angemeldet, um abstimmen zu können - diese durchdachte, großartige Antwort. =)
sgorozco

2
Wie Sie sich gedacht haben, programmiere ich schon seit einiger Zeit und bin ein OOP-Fan geworden, da sich meine Programmierkenntnisse bei der Einführung dramatisch verbessert haben. Die Erfahrung hat mir jedoch gezeigt, dass es wirklich schädlich sein kann, alles dazu zu zwingen, ein Objekt zu werden. Ich stehe jetzt vor Objekt-zu-Relational-Mapping-Tools (was für ein Durcheinander) oder vollständigen Objekt-Graph-Serialisierungsschemata, die 1000% Bandbreite verbrauchen, im Vergleich zu einem einfachen Binärprotokoll, das nur die richtige Menge an Binärdaten über die Leitung sendet, die benötigt wird der Moment. Vielen Dank für die tolle Lektüre.
Sgorozco

2
Diese Antwort ist auch die Antwort darauf, warum wir noch SQL brauchen!
HLGEM

25

Erstens braucht man OOP nicht für alles, auch wenn diesbezüglich Dogmen verbreitet wurden. Im Gegensatz zu Java erlaubt C Funktionszeiger und sogar Schließungen, was die Tür zur funktionalen Programmierung öffnet und einen Teil des von OOP behandelten Problemraums löst, da es die Möglichkeit der Abhängigkeitsinjektion bietet. Auch die vorsichtige Verwendung von Makros kann tatsächlich einige sehr schöne Dinge erzeugen, wie sglib beweist.

In seltsamer Weise könnte man C als einen guten Kompromiss zwischen Java und C ++ sehen. Bitte beachten Sie, dass ich nicht sage, dass C in irgendeiner Weise eine Mischung aus beiden ist. Aber im Gegensatz zu Java ist es eine ziemlich mächtige Sprache, während es im Gegensatz zu C ++ eine überschaubare Komplexität aufweist.

Es ist eine alte Sprache, die zuverlässig und beständig geworden ist, aber nicht wirklich komplizierter geworden ist. Abgesehen davon hat es ein riesiges Ökosystem und läuft einfach überall.


11
Funktionale Programmierung ist großartig, keine Einwände. Aber C ist eine ziemlich schlechte Sprache für die funktionale Programmierung. Closures / Blocks sind nicht tragbare Hacks und haben eine hässliche Syntax (wie ich wette, auch Fallstricke). Selbst wenn Sie all das ignorieren, müssen Sie sich immer noch um die Speicherverwaltung kümmern. C ist eine nützliche Sprache, aber wie bei jeder anderen Sprache macht man sich das Leben nur schwerer, als es sein muss, wenn man es missbraucht, um ein Paradigma zu verwenden, für das es nicht gemacht ist. Sie können funktionale Programmierung auch in Java emulieren (siehe Guava ), aber es ist auch nicht schön.

7
Es ist sehr schwer, ohne einen Müllsammler in einem funktionalen Stil zu programmieren.
Konstantin Solomatov

@ KonstantinSolomatov: Erstens ist das sehr subjektiv. Zweitens können Sie C bei Bedarf eine Garbage Collection hinzufügen.
back2dos

Wenn Sie einen Kompromiss zwischen Java und C ++ suchen, versuchen Sie es mit Obj-C :) Auf jeden Fall etwas, das jeder C / C ++ - Programmierer versuchen sollte.
Sulthan

21

C hat ein ABI (Application Binary Interface), C ++ nicht. Dies macht C in bestimmten Fällen nützlicher als C ++. Wenn ich eine Bibliothek schreibe und Binärdateien für die Verwendung durch andere Leute versenden kann, ist C ++ das falsche Werkzeug für den Job. Wenn ich Bibliotheken schreiben möchte, die wieder von einer anderen Sprache verwendet werden sollen, ist C das richtige Werkzeug für den Job. Ich habe noch nie von einer Sprache gehört, die FFI (Foreign Function Interface) für C nicht unterstützt, andererseits funktioniert C ++ nicht mit in C ++ geschriebenen Bibliotheken, wenn verschiedene Compiler verwendet werden.

Im Grunde läuft es darauf hinaus, dass C eine Rolle ausfüllt, für die C ++ nicht geeignet ist.


2
Mmm .. ein C, Tomaten und Käse Brötchen!
DeadMG

3
Nun, C ++ hat eine ABI. Es ist nur so, dass C ABI steinhart ist, während das C ++ viel zu oft wechselt. Außerdem sind viele C ++ - Vorlagen in der verwendeten Anwendung kompiliert, sodass Sie sie nicht aktualisieren können. Wenn die gesamte Funktionalität hinter Funktionsaufrufen verborgen ist, können Sie die Bibliothek reparieren und die Anwendung am Laufen halten.
Jan Hudec

12

Ein Vorteil der Verwendung von C gegenüber Sprachen wie C ++ oder Java ist, dass nicht viel Magie unter der Haube geschieht. Beim Zuweisen von Elementen werden keine Konstruktoren ausgeführt, und wenn Objekte den Gültigkeitsbereich verlassen, werden keine Destruktoren ausgeführt. Es gibt keine Namensverwirrung und keine Vtables. Die Leistung lässt sich leichter vorhersagen. Sie müssen sich keine Sorgen machen, dass ein Müllmann eine Routine unterbricht und ihr Timing verstellt.

Konstruktoren, Destruktoren, Name Mangling, vtables, Garbage Collectors usw. können die Komplexität des von Ihnen verfassten Codes teilweise verringern. Diese Komplexität wird jedoch zu einem Teil der Sprache selbst, über die Sie kaum oder gar keine Kontrolle haben . Möglicherweise haben Sie längere Build-Zeiten (ärgerlich, aber erträglich), einen größeren Speicherbedarf zur Laufzeit (möglicherweise erträglich oder nicht) oder eine langsamere Leistung. Mit C können Sie einen Teil dieser Komplexität abbauen, bis Sie die Funktionalität haben, die Sie benötigen .

Beispielsweise ist der stringDatentyp C ++ um Lichtjahre einfacher zu bearbeiten als Strings im C-Stil, aber er ist ein ziemlich schwerer Code und erhöht die Bildgröße. Ich habe selten gesehen, dass irgendjemand die stringFunktionen eines Programms voll ausgenutzt hat. Strings im C-Stil sind zwar schwieriger zu bearbeiten, verursachen jedoch weniger Nachteile in Bezug auf Laufzeit und Bildgröße und sind aus diesem Grund für ein bestimmtes Problem möglicherweise attraktiver.


2
Laufzeitstrafe ist Unsinn. C-Strings (nullterminiert) sind viel weniger effizient als C ++ - Strings. Außerdem kann eine String-Klasse genauso kompakt sein wie C, solange Sie nicht das Ganze std
hineinziehen

1
Eine Toolchain, die die nicht verwendeten Funktionen string, die nicht verwendet werden, wenn Sie die CRT statisch verknüpfen, nicht entfernt, ist eine Toolchain, die es nicht wert ist, gesalzen zu werden.
Billy ONeal

10
Das Dumme ist, ich arbeite mit einer Bibliothek, in der std::stringes nicht ausgefeilt genug ist . Wenn Sie es mit Strings ernst meinen, sowohl in Bezug auf die Leistung als auch in Bezug auf die Funktionen, verwenden Sie wieder C und erledigen dies alles wieder selbst, obwohl Sie keine einfachen alten char*s verwenden, um sicherzugehen. (Zeichenfolgen sind überraschend komplex, auch wenn Sie damit
Donal Fellows

1
@DonalFellow Interessant. Genau aus diesem Grund hat der C-Standard immer auf Dinge wie Strings und Hash-Tabellen verzichtet, so wie mich ihre Abwesenheit manchmal irritiert.
Ingenieur

@ArcaneEngineer: Der grundlegende fehlende Datentyp in C ist ein "Slice von T []" - Typ, der ein T * und ein size_t kombiniert, wie ein Array indiziert, in ein T * zerlegt und implizit konvertiert werden kann Beliebiger T [n] -Typ (wobei die Größe automatisch vom Compiler bereitgestellt wird). Solch ein Typ könnte in vielen Fällen die automatische Überprüfung von Grenzen ermöglichen, wenn dies ansonsten unmöglich ist, und gleichzeitig viele Arten von Code viel sauberer und lesbarer machen.
Supercat

11

Eingebettete Systeme und Treiber werden normalerweise in C programmiert. Abgesehen davon gibt es Unmengen von älteren C-Systemen, die noch gewartet und erweitert werden.


2
Ja, C läuft auf alles. Und es ist eine ziemlich einfach zu erlernende Sprache (im Vergleich zu C ++).
BenjaminB

10

Dasselbe, was einen manuellen Hammer in Zeiten von Presslufthämmern (Drucklufthämmern) beliebt macht: C ist immer noch das richtige Werkzeug für bestimmte Arbeiten.


6

Einfachheit, Konsistenz und Präzision.

Es ist einfach - Sie benötigen keine komplexe Entwicklungsumgebung, keine umfangreichen Bibliotheken oder eine virtuelle Maschine.

Es ist konsistent - die meisten C, die vor 10 Jahren geschrieben wurden, konnten heute kompiliert werden.

Präzision - Sie können sich auf die Ebene der Maschine begeben und die Speicherpositionen nach Bedarf ermitteln. Dies ist großartig für die Leistung und die eingebettete Hardware.

Es ist nicht für alles, aber es ist immer noch ein nützliches Werkzeug.


5
Besser noch, es gibt eine faire Chance, dass Code , der vor 10 Jahren kompiliert wurde , heute ausgeführt werden kann.
Donal Fellows

@DonalFellows: Und für Anwendungen, die Plug-Ins verwenden, besteht eine faire Chance, dass eine Anwendung, die heute geschrieben, erstellt und (in ausführbarer Form) veröffentlicht wird, Plug-Ins verwenden kann, die mit Build-Tools kompiliert wurden, die es noch nicht einmal gegeben haben entworfen noch.
Supercat

6

Ich zitiere zwei Punkte aus einer anderen Antwort, weil sie genau die Gründe aufzeigen, warum ich von Zeit zu Zeit immer noch C benutze (es ist jedoch nicht meine Hauptsprache):

  • C ist einfach. Es fehlt die Ausdruckskraft von hoch entwickelten OOP- oder funktionalen Sprachen, aber seine Einfachheit bedeutet, dass es schnell aufgenommen werden kann.
  • C ist ausgereift. Der letzte Standard, der große Änderungen eingeführt hat, ist C99 und ist größtenteils abwärtskompatibel mit früheren Standards. Im Gegensatz zu neueren Sprachen (z. B. Python) müssen Sie sich keine Sorgen mehr machen, dass Änderungen in Kürze vorgenommen werden.

Ich denke das ist sehr wahr. Ich habe C in den frühen Nächten gelernt: Es war einfach, es gab nur wenige Stichwörter und Konstrukte, die meiste Arbeit erledigten Bibliotheken. Dann habe ich C einige Jahre lang nicht benutzt. Um 2002 brauchte ich eine schnelle Implementierung eines Algorithmus, installierte einen C-Compiler und implementierte ihn. Ich kenne die Sprache, ich weiß, wofür sie gut ist, wofür sie nicht gut ist (ich würde niemals eine Webanwendung in C implementieren!), Und sie ist genau da, wenn ich sie brauche. Keine Überraschungen.

Mit C ++ hatte ich eine andere Erfahrung. Ich habe es um 1995 gelernt und es bedeutete einen großen Paradigmenwechsel vom Imperativ zum OOP. Toll! Ich habe es bis 1999 für mehrere Projekte verwendet. Einige Jahre lang habe ich C ++ nicht verwendet und als ich es wieder aufgegriffen habe (2008), habe ich viele neue Funktionen bereits in der Sprache gefunden und noch mehr geplant (inzwischen eingeführt in C ++) 11). Ich hatte das Gefühl, ich muss die Sprache wieder lernen.

Als Entwickler bevorzuge ich ausgereifte, stabile Sprachen. Ich mag es, eine Sprache einmal zu lernen, ihre Gestaltungsprinzipien zu verstehen, wofür sie gut ist, und sie zu verwenden, wenn ich denke, dass sie das richtige Werkzeug für den Job ist. Ich mag es auch, verschiedene Sprachen zu lernen und die Sprache auszuwählen, die meinen Bedürfnissen entspricht (C, C ++, Java, Scala, Haskell usw.). Was ich nicht mag, ist, immer wieder die gleiche Sprache lernen zu müssen, weil sie sich immer weiter entwickelt und nie reif wird.

IMHO sollte eine Programmiersprache ein klares, kohärentes und stabiles Design haben. Ich mag den Ansatz von Designern wie Niklaus Wirth: Jedes Mal, wenn er das Bedürfnis nach einer anderen Sprache verspürte, entwarf er eine neue (Pascal, Modula-2, Modula-3, Oberon). Ich mag keine Sprachen, die alle 5 bis 10 Jahre wichtige Änderungen erfahren: Sie sind wie sich bewegende Ziele, und ich finde, es lohnt sich nie, meine Zeit darauf zu verwenden, sie gründlich zu lernen, da die Version, die ich jetzt lerne, wahrscheinlich in einigen Jahren veraltet sein wird Jahre sowieso.

In diesem Sinne ist C IMO ein Gewinner: Es ist für bestimmte Anwendungen gut und für andere weniger geeignet, hat aber den Vorteil, dass es einfach und relativ stabil ist.


4

Ich bin überrascht, dass noch niemand Worse Is Better erwähnt hat. Zu diesem Zeitpunkt ist es über 20 Jahre alt, aber es lohnt sich immer noch, es zu lesen. Während es manchmal etwas ironisch ist, kann es sehr gut umreißen, wie und warum das Mittel oft das Ideal gewinnt, wobei C (gegen LISP) als eines seiner zentralen Beispiele verwendet wird.


Dinge, die ich in die Kategorie "schlechter aber besser" einordnete: Englisch, PHP, Windows. .. McDonalds vielleicht. Obwohl ich Spanisch, Python, Linux und Artisan French Cooking immer noch neide / bevorzuge; so viel wie möglich, wenn nicht allgemein möglich.
ThorSummoner

1

Sie wollten wahrscheinlich fragen, warum C anstelle von C ++ verwendet wird, obwohl Sie bei einem C-Compiler in der Regel auch einen C ++ - Compiler haben.

  • C-Sprache ist viel einfacher als C ++. Ich kenne keine Firma, die den vollständigen C ++ - Standard in ihrer Codierungskonvention verwendet. Schauen Sie sich als Beispiel den C ++ - Codestil von Google an: http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml
  • C ist viel schneller zu kompilieren. Dank dem Mangel an schwer zu kompilierenden Konstrukten.

Dieser Link ist kaputt.
ar2015

0

Nichts. TIOBE ist ein wertloser Index. Wenn man sich die Maße anschaut, ist das bestenfalls eine Vermutung.


10
Die Tatsache, dass TIOBE wertlos ist, bedeutet nicht, dass C nicht beliebt ist
Raynos

Es wird jedoch definitiv das im OP vorgebrachte Argument zunichte machen, dass C populär ist und daher eine gewisse Verwendung haben muss.
DeadMG

2
Ein besseres Maß für die Popularität von C ist, dass fast jede Plattform einen C-Compiler hat
Raynos

@ Raynos: Das ist überhaupt keine Messung. Das einzige, was bedeutet, ist, dass es einfach zu implementieren ist. Es sagt nichts darüber aus, wie viele Leute es benutzen oder warum.
DeadMG

2
Nicht ganz, ich akzeptiere gerne gegensätzliche Standpunkte. Ihre einzeilige Antwort scheint wenig Gedanken zu haben, und Sie sind argumentativ und nicht konstruktiv mit Ihren Antworten.
Mattnz

0

Viele ältere Software

Viele Unternehmen können nicht sofort ihren gesamten Code auf C ++ oder ähnliches ändern.

Viele Unternehmen können es sich nicht leisten, ihren Code zu ändern.

Viele Unternehmen können es sich leisten, ihren Code zu ändern, aber das ist ihnen egal oder sie sind "billig".

Viele Unternehmen migrieren, sind aber noch nicht fertig.

Wimmelbildorientierung

(Nicht objektorientierter) C-Quellcode, der als objektorientierter C-Quellcode konzipiert ist, Anwendungen, die mit Objektorientierung modelliert und mit "reinem C" codiert sind, oder Tools, die aus "C ++" oder einem anderen OO-Programm übersetzt werden. lang in C.

Ich habe gehört, dass einige Videospiele so gemacht werden. Einige plattformübergreifende Tools sowie die visuelle Schnittstellenbibliothek GTK (GObject, GLibrary) für die GNome Linux-Betriebssystemdistributionen.


3
Die zweite Hälfte dieser Antwort muss enttarnt werden.
Aramis

@aramis. Der zweite Teil bedeutet: Viele Codes scheinen direkt in "C" zu sein, aber tatsächlich in einer anderen Sprache und übersetzt in "C"
umlcat

0

Ich sehe einige der Antwortenden, die erklären, warum C am beliebtesten ist, es gibt es schon lange, es ist auf den meisten Plattformen verfügbar, kostenlos usw.

Das Gleiche gilt jedoch auch für andere Sprachen, zum Beispiel free Pascal - es ist kostenlos und wird für nahezu alle Plattformen unterstützt.

Pascal wurde um 1970 erfunden, C wurde um 1972 erfunden, also glaube ich, dass Pascal genauso lange existiert wie C.

Persönlich denke ich, dass C die beliebteste Sprache ist, da es einfach mehr Open Source-Code gibt, der von jedermann wiederverwendet werden kann. Und ja, es ist niedriger als Pascal, also nähert es sich der Assemblierung, aber es ist viel lesbarer als die Assemblierung.

Ich denke, es gibt einfach viel zu viele Programmiersprachen. Als Programmierer müssen wir die meisten wichtigen kennen, aber am Ende sollte das nicht nötig sein. Es kann eine Programmiersprache implementiert werden, um alles von der Erstellung von Websites bis zu iOS-Computerspielen zu erledigen.

C scheint diese globale Sprache zu sein, aber ich wünschte, es wäre so etwas wie Object Pascal. Warum Object Pascal, eine besser lesbare Programmiersprache, OOP-Code ist in der Regel wiederverwendbarer und weniger fehleranfällig (meiner Meinung nach) als C.

Sehr große Anwendungen lassen sich mit Object Pascal einfacher verwalten als mit C / C ++.

Was eine Programmiersprache angeht, die seit den 70er Jahren verbreitet ist, und Sprachen, die sich alle 5 oder 10 Jahre ändern, nicht mag. Mit der Zeit werden technologische Fortschritte und Programmiermethoden verbessert. Wenn sich eine Sprache alle paar Jahre drastisch ändert, wurde sie von ihrem Designer wahrscheinlich nicht gut durchdacht. Aber 1970 bis 2012 ist fast ein halbes Jahrhundert. Es ist in Ordnung, in dieser Zeit Änderungen an einer Sprache vorzunehmen, um die in der Softwareentwicklung verwendeten Fortschritte zu berücksichtigen.

C selbst wurde mehrfach überarbeitet. Es ist also nicht besser als andere Sprachen aus dieser Sicht.


3
Ein Problem mit Pascal war, dass die "offizielle" Version der Sprache einige sehr notwendige Funktionen ausließ. Sowohl auf dem PC als auch auf dem Macintosh gab es seit einiger Zeit Pascal-Compiler, die viel benutzerfreundlicher waren als alle damals existierenden C-Compiler, aber solche Compiler fügten Spracherweiterungen hinzu, die von keinem "offiziellen" Standard unterstützt wurden. Ich denke, wenn man sich bemüht hätte, einen offiziellen Standard zu erstellen, der solche Erweiterungen kodifiziert, hätte Pascal diesen Hack einer Sprache, die als "C" bekannt ist, verdrängt.
Supercat

0

Weil C eine riesige Anwenderbasis hat. Ja, es ist ein kleiner Haken, aber wenn ich bei StackOverflow eine Frage zu C stelle, bekomme ich die Antwort fast sofort. Dieselbe Frage zu Python kann Stunden dauern, bis sie beantwortet wird.

In Bezug auf C ++ ist das Erlernen von IMO komplizierter. Nachdem ich OOP 10 Jahre lang ausprobiert habe, finde ich es außerdem nicht immer nützlich und oft ist es einfacher, stattdessen prozedurale Programmierung zu verwenden.


haben Sie verglichen, SO Fragen für C # oder Java zu stellen?
gnat

@gnat es war ein isoliertes Beispiel für C v Python (was übrigens mehr Fragen aufwirft!). Ich habe keine Erfahrung mit C # (haben Sie bemerkt, dass ich keine SO-Fragen für C # oder jav gestellt habe?)
puk

Heh, ich finde, die # Python-Community auf StackOverflow ist fast immer super schnell. Es würde mich allerdings wundern, wenn die C-Community der JavaScript-Community hinsichtlich der Geschwindigkeit der Antworten überlegen wäre. (
Hauptsächlich
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.