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?
programming-languages
object-oriented
c
GradGuy
quelle
quelle
+"<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.Antworten:
Einige Faktoren, die dazu beitragen:
quelle
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!
quelle
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.
quelle
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.
quelle
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
string
Datentyp 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 diestring
Funktionen 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.quelle
std
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.std::string
es 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 altenchar*
s verwenden, um sicherzugehen. (Zeichenfolgen sind überraschend komplex, auch wenn Sie damitEingebettete Systeme und Treiber werden normalerweise in C programmiert. Abgesehen davon gibt es Unmengen von älteren C-Systemen, die noch gewartet und erweitert werden.
quelle
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.
quelle
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.
quelle
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):
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.
quelle
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.
quelle
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.
quelle
Nichts. TIOBE ist ein wertloser Index. Wenn man sich die Maße anschaut, ist das bestenfalls eine Vermutung.
quelle
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.
quelle
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.
quelle
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.
quelle