it-swarm.dev

Wird die Programmiersprache C noch verwendet?

Ich bin ein C # -Programmierer und der größte Teil meiner Entwicklung ist für Websites zusammen mit einigen Windows-Anwendungen. Was C betrifft, habe ich es lange nicht mehr benutzt, da es nicht nötig war. Es war eine Überraschung für mich, als eine meiner Freundinnen sagte, dass sie C lernen muss, um Jobs zu testen, während ich ihr half, C # zu lernen.

Ich nahm an, dass jemand C nur zum Testen lernen würde, wenn in C eine Entwicklung durchgeführt wird. Meines Wissens nach erfolgt die gesamte Entwicklung in Bezug auf COM und Hardware-Design auch in C++. Daher ist das Erlernen von C nicht sinnvoll, 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 noch in irgendeiner neuen Softwareentwicklung oder in irgendetwas anderem verwendet?

97
Pankaj Upadhyay

C hat den Vorteil, dass es eine relativ kleine Sprache ist, was es macht ) einfach einen C-Compiler zu implementieren (während ein C++ - Compiler ein Monster zum Schreiben ist), und macht es = leichter die Sprache zu lernen. Siehe auch TIOBE-Index , wonach C etwas vor C++ liegt.

In (IMO) abnehmender Reihenfolge der Rechtfertigung wird C immer noch häufig verwendet

  • Eingebettetes Zeug
    Es ist viel einfacher, einen C-Compiler auf eine kleine Plattform zu portieren, als einen C++ - Compiler zu portieren. Außerdem behaupten C-Befürworter, dass C++ "hinter ihrem Rücken zu viel tut". Allerdings IMO das ist FUD.

  • Systemprogrammierung
    Auch dies ist normalerweise auf die Behauptung zurückzuführen, dass es einfacher ist, "zu wissen, was der Compiler tut". Viele eingebettete Programme würden jedoch beispielsweise von Vorlagen und anderen C++ - Schlüsselfunktionen profitieren.

  • Quelloffene Software
    Das ist jedoch meistens ein Einstellungsproblem: OSS hat C immer C++ vorgezogen (während es in großen Teilen der Branche das Gegenteil ist). Torvalds irrationaler Hass könnte tatsächlich der wichtigste Grund dafür sein unter Linux.

215
sbi

C wird häufig in der Embedded-Hardware-Programmierung verwendet, wo die Ressourcen knapp sind.

Der Linux-Kernel ist in C geschrieben, weil laut Linus Torvalds C++ ist eine schreckliche Sprache .

119
Joonas Pulakka

Alle der modernen Sprachen, die ich gesehen habe, können mit C interagieren:

  • C++
  • Java
  • C #
  • Python
  • Haskell
  • Ziel c

Die Notwendigkeit, mit C zu interagieren, ergibt sich aus:

  • C mit einem einfachen ABI
  • C ist schon lange da

Da diese Sprachen mit C kommunizieren können, können sie:

  • nutzen Sie seine Bibliotheken
  • miteinander kommunizieren über C (zum Beispiel ist Clang in C++ geschrieben, bietet aber Python Bindungen, die an sein C gebunden sind) Schnittstelle).

Und ich würde wetten, dass sich alle für ihre Laufzeiten auf C verlassen (es sei denn, sie gingen zur Vollversammlung? Zweifelhaft).

C ist die Lingua Franca der Programmiersprachen und eine der einfachsten (ABI-weise), die nicht an eine bestimmte Architektur gebunden ist (wie Assembly) Ich werde eine große Verschiebung machen, um es loszuwerden.

94
Matthieu M.

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 da draußen hat ihren Gebrauch. Verschiedene Sprachen haben definitiv ihre Nischen. Aber nach C fragen! Ich bin sicher, dass täglich weniger Menschen C # als C verwenden (aus der völlig voreingenommenen Sicht der Arbeit in einem Geschäft, in dem niemand C # verwendet).

Schnelle Google-Suche nach der relativen 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 beim Betrachten von SO Verhältnis der Fragen zu Tags:
https://stackoverflow.com/tags

  • C #: 209845
  • 16 weitere Tags
  • C: 38790

C ist also das 18 beliebteste Thema auf SO (und es gibt dort viele andere Sprachen).

Hinweis: Der obige TIOBE-Index wurde seit über einem Jahrzehnt 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 wider, was die Leute in meinem Shop wissen (obwohl unsere Verhältnisse etwas anders sein werden, da wir eine viel kleinere Stichprobengröße haben).

45
Martin York

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.

Nach Tiobe Index ist C immer noch die am häufigsten verwendete Sprache.


Wie von tcrosley vorgeschlagen, sollten Sie sich diese verwandte Frage ansehen.


Sie sollten auch nach verwandten Artikeln über die Unterschiede zwischen C und C++ suchen, wie z. B. dieses Wiki oder dieses .

23
Jose Faeti

Es hört sich so an, als würden Sie versuchen, sich selbst davon zu überzeugen, dass C nutzlos ist und daher ignoriert werden kann. Lassen Sie uns Ihre Frage aufschlüsseln:

"Ich dachte mir, dass jemand C nur zum Testen lernen würde, wenn in C eine Entwicklung durchgeführt wird."

Nein, es gibt viele Gründe, C zu lernen. Auch wenn Sie nicht wüssten, dass ich solche pauschalen Anweisungen 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/reparieren 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 in Bezug auf 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 historische Bedeutung. Warum also Zeit und Geld für das Erlernen von C verschwenden?"

Dies ist die fragwürdigste Logik von allen. Zuallererst ist historische Bedeutung etwas, an das Sie sollten glauben, denn wenn Sie es wüssten, würden Sie wissen, dass C eine Teilmenge von C++ ist, und aus diesem Grund kann das Wissen über C Ihnen helfen, ein besseres C++ zu sein Programmierer. Natürlich hatte C auch Einfluss auf die meisten Sprachen, die danach kamen, damit die Vorteile hier nicht aufhören. Da C so wichtig ist, kann es nicht nur als historisch bedeutsam angesehen werden. Es ist immer noch weit verbreitet und kann daher nicht in eine solche sekundäre Position verbannt werden. Sie können argumentieren, dass es nicht eine Sprache ist, die jeder Programmierer verwenden muss und die er gründlich kennt, und das wäre richtig, aber bitte bauen Sie Ihr Argument nicht darauf auf, dass Sie etwas nicht glauben, ohne zuerst seine wahren Vorzüge zu untersuchen.

20
GonzoKnight

Zusätzlich zu eingebetteten Systemen haben die meisten neueren Sprachen eine Möglichkeit, mit C zu kommunizieren. Wenn Sie eine Bibliothek schreiben, deren Verwendung in all diesen Sprachen einfach sein soll, ist C eine naheliegende Wahl. C++ kann zwar auch mit einigen Sprachen (z. B. Python (nur CPython))) zusammenarbeiten, C++ kann jedoch aufgrund einiger seiner Funktionen (insbesondere mit der Namensverfälschung, aber nicht mit einer größeren Anzahl von Sprachen) Vorlagen helfen dem Problem nicht). Das C ABI ist eines der am einfachsten zu bedienenden (ich weiß, dass Sie C++ schreiben und externes "C" für die Schnittstelle verwenden können. Es ist mir egal).

Es hat auch den Vorteil, dass C und C++ wirklich die besten Sprachen für die Systemprogrammierung sind und die C-Kompilierungszeiten viel viel schneller sind. C++ - Kompilierungszeiten sind merklich die schlechtesten aller von mir verwendeten Sprachen.

Während es andere Sprachen gibt, die die populäre Systemsprache werden wollen (ich weiß insbesondere über D ), ist ein Großteil der Software geschrieben C/C++. Bei Sprachen wie D muss jemand einen Wrapper um die C-Bibliothek erstellen, anstatt ihn direkt zu verwenden (wie Sie es von C++ aus tun würden).

16
jsternberg

Ich benutze es fast jeden Tag 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 praktisch und wird wahrscheinlich noch viele Jahre bestehen (auch wenn Sie weder Zeit noch Geld verschwenden, um es zu lernen).

11
Valentin Radu

check out langpop.com , insbesondere die Grafiken von Freshmeat und Google Code. Es zeigt, dass C noch weit voraus ist.

C ist immer noch beliebt bei Systemen, bei denen Sie sich dem Metall (dh dem eingebetteten System) und leistungshungrigen Anwendungen nähern müssen.

11
tehnyit

Portabilität.

Erstellen Sie eine Liste aller Systeme, von denen Sie glauben, dass sie C-Code ausführen, und 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.

7
tidbeck

Im Allgemeinen ist C für eingebettete Systeme immer noch weit verbreitet.

Diese Frage gibt ein anderes Beispiel.

Der Tiobe-Index , der versucht, die Sprache nach Beliebtheit zu klassifizieren / Verwendung setzt C konsequent an die erste Stelle.

7
Xavier T.

Nun, ich denke C ist die mächtigste Sprache aus den folgenden Gründen!

1) AT erstes 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 mehr 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 welche Anwendung in der Firmware-Programmierung (Hardware). Dies liegt an der Fähigkeit, Assembly zu verwenden/mit ihm 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. Schauen Sie sich die Geschichte von C an und Sie werden feststellen, dass es sie schon seit einiger Zeit gibt (wie die Programmiersprachen sowieso gehen). Schauen Sie sich Python zum Beispiel eine vollständig objektorientierte Programmiersprache auf hoher Ebene an. Sie ist in C geschrieben (möglicherweise auch in C++). Das sagt Ihnen, ob Sie jemals wissen möchten, was los ist in anderen Sprachen unter der Haube, C und seine Funktionsweise zu verstehen ist unerlässlich.

Eine Anwendungssprache wird für die Programmierung auf hoher Ebene verwendet, z. Schreiben eines Textverarbeitungsprogramms oder eines Spiels. Beispiele für Anwendungssprachen sind Java, C #. Der Grund dafür ist, dass sie Speicherbereinigung, automatische Eingabe, Laufzeitüberprüfung usw. enthalten - wobei der Schwerpunkt auf der Produktivität liegt.

Eine Systemsprache wird für die Programmierung auf niedriger Ebene verwendet. z.B. 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 nimmt es als Anwendungssprache ab, bleibt aber als Systemsprache stark.

5
niko

Oh ja, es wird benutzt. Ich arbeite im Bereich der Netzwerkpaketverarbeitung. Ich war bei zwei verschiedenen Unternehmen, in denen wir Netzwerkpakete verarbeiten. Wir arbeiten also auf Ethernet- oder IP-Ebene, nicht auf der Ebene über TCP.

Interessanterweise wurde in beiden Unternehmen C gegenüber C++ gewählt. In einem der Unternehmen wurde eines der beiden Produkte auf dem Linux-Kernel erstellt, während das andere Produkt im Linux-Benutzerbereich erstellt wurde. Das Kernel-Produkt, das offensichtlich C als Linux-Kernel verwendet, ist in C programmiert, aber sie haben sich dafür entschieden, C auch für das Userspace-Produkt zu verwenden. Beide Produkte wurden ab etwa dem Jahr 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++. Es ist eigentlich eine Fortsetzung eines Projekts aus der Mitte der neunziger Jahre, obwohl aufgrund der jüngsten Anforderungen an die Leistungsverbesserung entschieden wurde, dass im Wesentlichen alles neu geschrieben wird. Wir hatten aufgrund dieses Umschreibens die Möglichkeit, C++ auszuwählen, haben dies aber nicht getan.

Im Bereich der Netzwerkpaketverarbeitung zählt die Leistung sehr. 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 strebe nach MurMurHash . Vielleicht möchte ich Sicherheit und strebe nach SipHash . Speicherzuordnungen sind offensichtlich benutzerdefiniert. Tatsächlich wurden alle wichtigen Datenstrukturen, die wir verwenden, speziell für die höchstmögliche Leistung 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 ermöglichen, aber virtuelle Funktionsaufrufe würden die Leistung beeinträchtigen, wenn sie überall verwendet würden. Es ist daher besser, explizit zu sein und einen Funktionszeiger zu haben, wenn virtuelle Funktionsaufrufe benötigt werden.

C++ erledigt viele Dinge hinter Ihrem Rücken: Speicherzuweisung usw. In C ist dies normalerweise nicht der Fall. Sie können eine Funktion schreiben, die Speicher zuweist. In der Regel ist jedoch an der Schnittstelle der Funktion ersichtlich, dass die Zuweisung erfolgt.

Schauen Sie sich als Beispiel für die Art von Mikrooptimierungen, die Sie beim Programmieren in C durchführen können, das Makro container_of im Linux-Kernel an. Sicher, Sie könnten container_of in C++ - Code verwenden, 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 zuweist. Wir wollen das nicht, weil jeder zugewiesene Speicherblock die Leistung beeinträchtigt.

Vielleicht ist das einzige, was uns in C++ zugute kommen würde, dass C++ die Metaprogrammierung von Vorlagen ermöglicht, was bedeutet, dass Sie manchmal virtuelle Funktionsaufrufe vermeiden können, während Sie noch einen Funktionsparameter haben, und dem Compiler erlauben können, die Funktionen zu integrieren. Die Metaprogrammierung von Vorlagen ist jedoch kompliziert, und wir haben es geschafft, alle Anforderungen in C zu erfüllen, sodass der Nutzen dieser Funktion in C++ nicht so kritisch ist.

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 war? Versammlung? Nein, wir mussten sowohl 32-Bit- als auch 64-Bit-Architekturen unterstützen. C++? Sicher scherzen Sie. Offensichtlich war es C mit GCCs berechnet goto . Daher wurde die benutzerdefinierte Sprache nach C kompiliert (oder tatsächlich nach der gcc-Variante von C, die computed goto unterstützt), und der C-Compiler hat Assembly erstellt.

1
juhist

Ich benutze C immer noch täglich und einer der Hauptgründe ist die Interaktion mit anderen Sprachen und ein SDK, das für Plugins entwickelt wurde, die von Compilern aller Art in verschiedenen Sprachen erstellt wurden.

Ich kann keine C++ - API schreiben, die Klassen mit Konstruktoren und Destruktoren und vtables, Funktionsüberladung, Auslösen von 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 von Python aus aufgerufen werden kann, z. B. oder ein Python SDK, das von C # aufgerufen werden kann.

C ist hier die einzige Sprache, mit der ich eine API erstellen kann, die von jeder dieser Sprachen aus aufgerufen werden kann. Das heißt, ich benutze 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 bearbeitende 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, mit dem ausgerichtete Bits und Bytes zusammengefasst werden. Und angesichts des umfangreichen Typsystems und der Ausnahmebehandlung von C++ ist es nicht einfach, eigene Datenstrukturen zu erstellen. Sehen Sie sich nur an, wie viel Aufwand erforderlich ist, um eine Datenstruktur zu schreiben, die so trivial ist wie std::vector wenn Sie es ausnahmesicher machen und vermeiden möchten, ctors und dtors für Elemente aufzurufen, 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 wachsbares Array gut zu implementieren, stellen Sie sich die Arbeit vor, die für die Implementierung eines BVH in Produktionsqualität erforderlich ist.

Ich bevorzuge C++ gegenüber C, wenn ich verwenden vorhandene Datenstrukturen oder übergeordnete durch Implementierung vorhandener Datenstrukturen implementieren möchte, aber wenn ich eine Datenstruktur auf niedriger Ebene im Kern von implementieren möchte C ist eine Engine, die keine Verwendung für vorhandene Datenstrukturen hat. Mit ihrem überaus simplen Typsystem, mit dem Sie nur memcpy Dinge hier und memmove Dinge dort, malloc ein zusammenhängender Block und realloc dort, ohne sich Gedanken darüber zu machen, ob Konstruktoren, Destruktoren und Ausnahmen ausgelöst werden.

0
user204677