Ich bin ein C # -Programmierer und entwickle hauptsächlich Websites sowie einige Windows-Anwendungen. Was C angeht, habe ich es lange nicht mehr benutzt, da es nicht nötig war. Ich war überrascht, als eine meiner Freundinnen sagte, sie müsse C lernen, um Jobs zu testen, während ich ihr beim Erlernen von C # half.
Ich nahm an, dass jemand C nur zum Testen lernen würde, wenn die Entwicklung in C durchgeführt wird. Meines Wissens wird die gesamte Entwicklung in Bezug auf COM und Hardware-Design auch in C ++ durchgeführt. Daher macht das Erlernen von C keinen Sinn, wenn Sie C ++ verwenden müssen. Ich glaube auch nicht an historische Bedeutung, warum also Zeit und Geld verschwenden, um C zu lernen?
Wird C immer noch in irgendeiner Art von neuer Software-Entwicklung oder etwas anderem verwendet?
quelle
Antworten:
C hat den Vorteil, dass es eine relativ kleine Sprache ist , was die Implementierung eines C-Compilers vereinfacht (während ein C ++ - Compiler ein Monster zum Schreiben ist) und das Erlernen der Sprache erleichtert . Siehe auch den TIOBE-Index , wonach C etwas vor C ++ steht.
In (IMO) abnehmender Reihenfolge der Rechtfertigung wird für C immer noch viel verwendet
Eingebettetes Material
Es ist viel einfacher, einen C-Compiler auf eine kleine Plattform zu portieren, als einen C ++ - Compiler. Auch C-Befürworter behaupten, dass C ++ "hinter ihrem Rücken zu viel tut". Allerdings ist IMO das FUD.
Systemprogrammierung
Auch dies ist normalerweise darauf zurückzuführen, dass behauptet wird, es sei einfacher, "zu wissen, was der Compiler tut". Viele eingebettete Programme würden jedoch beispielsweise von Vorlagen und anderen C ++ - Schlüsselfunktionen profitieren.
Open-Source-Software
Das ist jedoch meistens ein Einstellungsproblem: OSS hat C immer C ++ vorgezogen (während es in weiten Teilen der Branche das Gegenteil ist). Der irrationale Hass von Torvalds könnte tatsächlich der wichtigste Grund dafür unter Linux sein .
quelle
std::vector
oder astd::map
für ein bestimmtes Stück Code verwenden sollen - aber Sie müssen es nicht selbst implementieren, sondern können sich auf gut getestete, leistungsstarke, und zuverlässige Bibliotheksimplementierungen, die hohe Abstraktionen bieten.C wird häufig in der Embedded-Hardware-Programmierung verwendet, wo die Ressourcen knapp sind.
Der Linux-Kernel ist in C geschrieben, weil C ++ laut Linus Torvalds eine schreckliche Sprache ist .
quelle
Alle modernen Sprachen, die ich gesehen habe, können mit C interagieren:
Die Notwendigkeit, mit C zu interagieren, ergibt sich aus:
Da diese Sprachen mit C kommunizieren können, können sie:
Und ich würde wetten, dass sie sich alle für ihre Laufzeiten auf C verlassen (es sei denn, sie sind komplett versammelt? Zweifelhaft).
C ist die Lingua Franca der Programmiersprachen und eine der einfachsten (ABI-weise), die nicht an eine bestimmte Architektur gebunden ist (wie dies bei Assemblys der Fall ist).
quelle
Meiner Meinung nach ist dies eine sehr kurzsichtige Frage, ähnlich wie "Meine Freunde und ich hören Reggae. Hört jemand wirklich noch Rap?".
Jede Sprache hat ihren Gebrauch. Verschiedene Sprachen haben definitiv ihre Nischen. Aber nach C fragen! Ich bin sicher, dass weniger Menschen täglich C # als C verwenden (aus der voreingenommenen Sicht der Arbeit in einem Geschäft, in dem niemand C # verwendet).
Schneller Google-Blick auf die relative Beliebtheit von Sprachen.
Ich bin sicher, dass nichts davon maßgeblich ist, aber wir können es verwenden, um Trends zu erkennen:
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
http://langpop.com/
Sogar bei SO Verhältnis der Fragen zu Tags:
https://stackoverflow.com/tags
Also ist C das 18 populärste Thema auf SO (und es gibt viele andere Sprachen dort).
Hinweis: Der obige TIOBE-Index wurde über ein Jahrzehnt lang ständig aktualisiert (und einige Daten stammen aus drei Jahrzehnten). Er soll Ingenieure messen, die in jeder Sprache arbeiten (obwohl ich keine Ahnung habe, wie genau das ist). Von den Top-10-Sprachen außer Java / Visual Basic spiegelt es das wider, was die Leute in meinem Shop wissen (obwohl unsere Verhältnisse leicht abweichen werden, da wir eine viel kleinere Stichprobengröße haben).
quelle
I am sure none of this is authoritative but we can use it to see trends
Aber ich bin nicht einverstanden mit Ihrer zweiten Aussage; C ist nicht mehr die Hauptsprache, die an Hochschulen unterrichtet wird (wenn es dann die neue Gruppe von Absolventen wäre, wäre es nicht so nutzlos). Heutzutage neigen die Leute dazu, Java / C # sharp zu lernen. Auch im Tiobe-Bericht geht es um Aufträge, nicht um Abfragen.Möglicherweise müssen Sie C verwenden, wenn Sie wenig Ressourcen haben und keine objektorientierten Funktionen benötigen.
Viele der heute verwendeten Softwareprogramme sind immer noch in C geschrieben, ganz zu schweigen von den Hardwaretreibern.
Laut Tiobe- Index ist C immer noch die am häufigsten verwendete Sprache.
Wie Tcrosley vorschlug, möchten Sie vielleicht einen Blick auf diese verwandte Frage werfen .
Sie sollten auch nach verwandten Artikeln über die Unterschiede zwischen C und C ++ suchen, wie z. B. diesem Wiki oder diesem .
quelle
Es hört sich so an, als wollten Sie sich selbst davon überzeugen, dass C nutzlos ist und daher ignoriert werden kann. Lassen Sie uns Ihre Frage zusammenfassen:
"Ich dachte mir, dass jemand C nur zum Testen lernen würde, wenn es in C entwickelt wird."
Nein, es gibt viele Gründe, C zu lernen. Auch wenn Sie nicht wüssten, dass ich solche pauschalen Aussagen immer noch vermeiden würde, insbesondere in Verbindung mit zirkulärer Logik. Natürlich muss man die Sprache kennen, in der der Code geschrieben ist, um ihn richtig testen / korrigieren zu können, aber das setzt voraus, dass die Sprache immer noch als gegeben verwendet wird und für jede Sprache und nicht nur für C gilt.
"Meines Wissens werden alle Entwicklungen im Zusammenhang mit COM und Hardware-Design auch in C ++ durchgeführt."
Das ist falsch.
"Daher macht das Erlernen von C keinen Sinn, wenn Sie C ++ verwenden müssen. Ich glaube auch nicht an die historische Bedeutung. Warum also Zeit und Geld für das Erlernen von C verschwenden?"
Dies ist die fragwürdigste Logik von allen. Zuallererst sollten Sie an die historische Bedeutung glauben, denn wenn Sie wüssten, dass C eine Teilmenge von C ++ ist, und aus diesem Grund kann Ihnen das Wissen um C helfen, ein besserer C ++ - Programmierer zu sein. Natürlich hatte C auch Einfluss auf die meisten Sprachen, die darauf folgten, sodass die Vorteile hier nicht aufhören. Da C so wichtig ist, kann es nicht als nur historisch bedeutsam angesehen werden. Es ist immer noch weit verbreitet und kann daher nicht in eine solche Nebenposition verbannt werden. Sie können argumentieren, dass es sich nicht um eine Sprache handelt, die jeder Programmierer verwenden muss und die er gründlich beherrscht, und das wäre richtig, aber begründen Sie Ihr Argument bitte nicht damit, dass Sie etwas nicht glauben, ohne zuerst seine wahren Vorzüge zu prüfen.
quelle
Zusätzlich zu eingebetteten Systemen haben die meisten neueren Sprachen eine Schnittstelle zu C. Wenn Sie eine Bibliothek schreiben, die Sie in all diesen Sprachen problemlos verwenden möchten, ist C eine naheliegende Wahl. C ++ kann zwar auch mit einigen Sprachen (wie z. B. Python (nur CPython)) kommunizieren, C ++ kann jedoch aufgrund einiger seiner Funktionen nicht mit einer größeren Anzahl von Sprachen kommunizieren (insbesondere Namensverfälschung, aber Vorlagen helfen dem Problem nicht). Das C ABI ist eines der am einfachsten zu bedienenden Interfaces (ich weiß, Sie können C ++ schreiben und externes "C" für das Interface verwenden. Es ist mir egal).
Es hat auch den Vorteil, dass C und C ++ die wirklich besten Sprachen für die Systemprogrammierung sind und die C-Kompilierungszeiten viel schneller sind. Die C ++ - Kompilierungszeiten sind merklich die schlechtesten aller von mir verwendeten Sprachen.
Nun, da es andere Sprachen gibt, die die populäre Systemsprache werden wollen (ich weiß insbesondere über D Bescheid ), ist ein Großteil der Software in C / C ++ geschrieben. Sprachen wie D erfordern, dass jemand einen Wrapper um die C-Bibliothek erstellt, anstatt ihn direkt zu verwenden (wie Sie es von C ++ gewohnt sind).
quelle
extern(C)
in D, während Sie in C ++ schreibenextern "C"
Schauen Sie sich langpop.com an , insbesondere die Grafiken von Freshmeat und Google Code. Es zeigt, dass C immer noch weit voraus ist.
C ist immer noch beliebt auf Systemen, bei denen Sie sich dem Metall (dh dem eingebetteten System) und leistungshungrigen Anwendungen nähern müssen.
quelle
Ich benutze es fast jeden Tag und entwickle es für iPad / iPhone. Viele Bibliotheken sind in C geschrieben und haben kein Objective-C-Äquivalent. Also ja, es wird immer noch verwendet und von einem der neuesten Geräte auf dem Markt.
Mit C können Sie viele eingebettete Systeme programmieren, es ist klein und handlich und wird wahrscheinlich noch viele Jahre bestehen (auch wenn Sie weder Zeit noch Geld damit verschwenden, es zu lernen).
quelle
Im Allgemeinen wird für eingebettete Systeme C immer noch häufig verwendet.
Diese Frage gibt ein anderes Beispiel.
Der Tiobe-Index , der versucht, die Sprache nach Beliebtheit / Gebrauch zu klassifizieren , setzt C konsequent an die erste Stelle.
quelle
Portabilität.
Erstellen Sie eine Liste aller Systeme, von denen Sie glauben, dass sie C-Code ausführen, und erstellen Sie dann eine ähnliche Liste für jede andere Sprache, die Sie mögen.
Wenn Sie die gleiche Antwort wie ich gefunden haben, lautet die Schlussfolgerung ja.
quelle
Nun, ich denke C ist die mächtigste Sprache Aus den folgenden Gründen!
1) AT first C, Es ist eine Systemsprache (was bedeutet, dass es verwendet werden kann, um Low-Level-Programmierung mit minimaler oder keiner Laufzeit durchzuführen).
2) Geschwindigkeit der resultierenden Anwendung. C-Quellcode kann viel besser optimiert werden als übergeordnete Sprachen, da der Sprachensatz relativ klein und sehr effizient ist. Es ist ungefähr so nah wie möglich an der Programmierung in Assemblersprache, ohne in Assemblersprache zu programmieren. und Sie können sogar Assembly und C zusammen verwenden!
3) C hat was seine Anwendung in der Firmware-Programmierung (Hardware) ist. Dies ist auf seine Fähigkeit zurückzuführen, Baugruppen zu verwenden / damit zu arbeiten und direkt mit Controllern, Prozessoren und anderen Geräten zu kommunizieren.
4) C ist ein Baustein für viele andere derzeit bekannte Sprachen. Wenn Sie die Geschichte von C nachschlagen, werden Sie feststellen, dass es sie schon seit einiger Zeit gibt (da die Programmiersprachen sowieso funktionieren). Schauen Sie sich Python an, zum Beispiel eine vollständig objektorientierte High-Level-Programmiersprache. Es ist in C geschrieben (vielleicht auch in C ++). Das sagt Ihnen, ob Sie jemals wissen möchten, was in anderen Sprachen unter der Haube vor sich geht. Verständnis C und wie es funktioniert, ist von wesentlicher Bedeutung.
Eine Anwendungssprache wird für die Programmierung auf hoher Ebene verwendet, z. B. zum Schreiben eines Textverarbeitungsprogramms oder eines Spiels. Beispiele für Anwendungssprachen sind Java, C #. Der Grund dafür ist, dass sie Garbage Collection, automatische Typisierung, Laufzeitvalidierung usw. enthalten - wobei der Schwerpunkt auf der Produktivität liegt.
Für die einfache Programmierung wird eine Systemsprache verwendet. zB Ein Mikrocontroller, ein Treiber und ein Betriebssystemkernel. Beispiele hierfür sind Assembly, C. Sie benötigen wenig oder keine Laufzeit, um Code direkt auf der Hardware auszuführen, und der Fokus liegt darauf, dass der Programmierer die direkte Kontrolle über die Hardware hat.
Insgesamt ist es als Anwendungssprache rückläufig, aber als Systemsprache nach wie vor stark.
quelle
Oh ja, es wird benutzt. Ich arbeite auf dem Gebiet der Netzwerkpaketverarbeitung. Ich war in zwei verschiedenen Unternehmen, in denen wir Netzwerkpakete verarbeiten. Wir arbeiten also auf der Ethernet- oder IP-Ebene, nicht auf der Ebene über TCP.
Interessanterweise wurde in beiden Unternehmen C gegenüber C ++ ausgewählt. In einem der Unternehmen wurde eines der beiden Produkte auf dem Linux-Kernel erstellt, während das andere Produkt im Linux-Anwenderbereich erstellt wurde. Das Kernel-Produkt, das offensichtlich C als Linux-Kernel verwendete, ist in C programmiert, aber sie entschieden sich dafür, C auch für das Userspace-Produkt zu verwenden. Beide Produkte wurden ab etwa 2000 entwickelt (das Kernel-Produkt etwas vor 2000 und das Userspace-Produkt etwas nach 2000).
In der Firma, in die ich danach gegangen bin, wurde das Produkt auf C gebaut, nicht auf C ++. Tatsächlich handelt es sich um eine Fortsetzung eines Projekts aus der Mitte der neunziger Jahre, obwohl aufgrund der jüngsten Leistungsverbesserungsanforderungen beschlossen wurde, im Wesentlichen alles neu zu schreiben. Aufgrund dieses Umschreibens hatten wir die Option, C ++ auszuwählen, taten dies jedoch nicht.
Im Bereich der Netzwerkpaketverarbeitung spielt die Leistung eine große Rolle. Daher möchte ich meine eigene Hash-Tabelle implementieren, die eine höhere Leistung als vorhandene Hash-Tabellen aufweist. Ich, nicht der Autor der Hash-Tabelle, bin derjenige, der auswählt, welche Hash-Funktion verwendet werden soll. Vielleicht möchte ich Leistung und für MurMurHash3 gehen . Vielleicht will ich Sicherheit und greife zu SipHash . Speicherzuordnungen sind offensichtlich benutzerdefiniert. Tatsächlich wurden alle wichtigen Datenstrukturen, die wir verwenden, für eine höchstmögliche Leistung kundenspezifisch implementiert.
Es gibt zwar nichts, was die Verwendung von C ++ verhindern würde, aber es ist normalerweise eine schlechte Idee. Eine einzelne ausgelöste Ausnahme pro Paket senkt die Paketverarbeitungsrate auf nicht akzeptable Werte! Daher können wir die Ausnahmen von C ++ nicht verwenden. Viel zu langsam. Wir verwenden bereits eine Art objektorientierten C-Code, indem wir Datenstrukturen als Strukturen implementieren und dann Funktionen implementieren, die mit diesen Strukturen arbeiten. C ++ würde virtuelle Funktionen erlauben, aber virtuelle Funktionsaufrufe würden die Leistung beeinträchtigen, wenn sie überall verwendet würden. Es ist also besser, explizit zu sein und einen Funktionszeiger zu haben, wenn virtuelle Funktionsaufrufe benötigt werden.
C ++ erledigt eine Menge Dinge hinter Ihrem Rücken: Speicherzuweisung usw. In C dagegen passiert das normalerweise nicht. Sie können eine Funktion schreiben, die Speicher zuweist. In der Regel wird jedoch anhand der Schnittstelle der Funktion deutlich, dass die Zuweisung erfolgt.
Als Beispiel für die Art von Mikrooptimierungen, die Sie beim Programmieren in C vornehmen können, sehen Sie sich das Makro container_of im Linux-Kernel an. Sicher, Sie könnten container_of in C ++ benutzen, aber wer macht das? Ich meine, es ist in den meisten C-Programmen völlig akzeptabel, aber typische C ++ - Programmierer würden sofort etwas anderes vorschlagen, beispielsweise eine verknüpfte Liste, die die Verknüpfungsknoten als separate Blöcke zuordnet. Wir wollen das nicht, weil jeder zugewiesene Speicherblock schlecht für die Leistung ist.
Vielleicht ist das Einzige, was uns in C ++ zugute kommt, dass C ++ die Metaprogrammierung von Vorlagen ermöglicht. Dies bedeutet, dass Sie manchmal virtuelle Funktionsaufrufe vermeiden können, während Sie noch einen Funktionsparameter haben, und dass der Compiler die Funktionen einbinden kann. Die Metaprogrammierung von Vorlagen ist jedoch kompliziert, und wir haben es geschafft, alle Anforderungen in C zu erfüllen. Daher ist der Nutzen dieser Funktion in C ++ nicht so kritisch.
In einem der Unternehmen hatten wir tatsächlich eine benutzerdefinierte kompilierte Sprache, in der ein Teil der Funktionen implementiert war. Ratet mal, welche Zielsprache der Compiler hatte? Versammlung? Nein, wir mussten sowohl 32-Bit- als auch 64-Bit-Architekturen unterstützen. C ++? Sicher scherzen Sie. Offensichtlich war es C mit GCCs berechnetem goto . Daher wurde die benutzerdefinierte Sprache in C kompiliert (oder tatsächlich in die gcc-Variante von C, die computed goto unterstützt), und der C-Compiler erstellte eine Assembly.
quelle
Ich benutze C immer noch täglich und einer der Hauptgründe ist die Interoperabilität mit anderen Sprachen und ein SDK, das für Plugins entwickelt wurde, die von allen Arten von Compilern in verschiedenen Sprachen erstellt wurden.
Ich kann keine C ++ - API schreiben, die Klassen mit Konstruktoren und Destruktoren und vtables, Funktionsüberladung, Ausnahmen usw. verwendet, die von Lua, C #, Python, C usw. verwendet werden können, geschweige denn ein C ++ - Plugin, das mit verschiedenen Compilern geschrieben wurde und Einstellungen von unseren eigenen.
Ich kann kein C # SDK schreiben, das beispielsweise von Python aus aufgerufen werden kann, oder kein Python-SDK, das von C # aus aufgerufen werden kann.
C ist die einzige Sprache, mit der ich eine API erstellen kann, die aus jeder dieser Sprachen aufgerufen werden kann. Das heißt, ich verwende oft C ++, um diese C-Schnittstellen zu implementieren (obwohl ich sie manchmal nur in C implementiere).
Außerdem finde ich C manchmal die am einfachsten zu verwendende Sprache für Dinge wie Datenstrukturen auf niedriger Ebene und Speicherzuordnungen. Die zusätzliche Typensicherheit, die Sie in C ++ erhalten, hilft nicht, wenn Sie einen Speicherzuweiser schreiben, der für das Poolen von ausgerichteten Bits und Bytes ausgelegt ist. Und im Gegensatz zu C ++ ist es nicht einfach, Ihre eigenen Datenstrukturen zu erstellen. Sehen Sie sich nur an, wie viel Aufwand es kostet, eine Datenstruktur so trivial zu schreiben, als
std::vector
ob Sie sie ausnahmesicher machen und das Aufrufen vermeiden möchten ctors und dtors für Elemente, die Sie nicht in den Container eingefügt haben (ich spreche als einer, der die gesamte C ++ - Standardbibliothek implementiert hat). Wenn es sehr schwierig ist, nur ein anbaubares Array gut zu implementieren, stellen Sie sich die Arbeit vor, die zur Implementierung eines BVH in Produktionsqualität erforderlich ist.Ich ziehe C ++ über C , wenn ich will verwenden bestehenden Strukturen Daten oder höherer Ebene diejenigen zu implementieren , indem bestehende verwenden, aber wenn ich werde eine Low-Level - Datenstruktur im Kern eines Motors zu implementieren , die keine Verwendung hat für Bestehende Datenstrukturen, C macht dies mit seinem überaus simplen Typensystem, mit dem Sie nur
memcpy
Dinge hier undmemmove
dort,malloc
einen zusammenhängenden Block undrealloc
es dort tun können, viel einfacher , ohne sich Gedanken über Konstruktoren, Destruktoren und Ausnahmen zu machen.quelle