Wird die Programmiersprache C noch verwendet?

96

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?

Monomeeth
quelle
46
Haben Sie jemals einen C ++ - Compiler für PICs gesehen?
SK-logic
195
Bin ich der einzige, der traurig ist, dass jemand das Lernen mit Zeit- und Geldverschwendung gleichsetzen würde?
Jetti
37
" Meines Wissens werden alle Entwicklungen im Zusammenhang mit COM und Hardware-Design auch in C ++ durchgeführt. " - Klingt für mich so, als würden Sie eigentlich kein Hardware-Interface-Design durchführen.
Ed S.
32
Die Leute vergessen, dass die ausgefallenen höheren Sprachen, die wir alle lieben, oft in C.
David Cowden,
13
@ThomasEding Tote Sprache? Sie haben sicherlich nur sehr begrenzte Kenntnisse in Programmiersprachen, wenn Sie C für eine tote Sprache halten.
JesperE

Antworten:

214

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 .

sbi
quelle
16
Es ist mehr Geschichte als Haltung. Viele der von Ihnen als "Kern" bezeichneten Open Source-Pakete wurden ursprünglich entwickelt, als C ++ noch nicht so weit verbreitet war wie heute und die Ressourcen noch knapp waren.
Blrfl
65
Der TIOBE-Index ist ein Witz. Suchmaschinentreffer sind bedeutungslos.
DeadMG
29
@Sedate: Dass Templates generell zum Aufblähen von Code führen, ist ein Mythos aus der Zeit der alten C ++ - Compiler. Moderne Compiler falten identische Template-Instanzen. OTOH-Vorlagen ermöglichen die Metaprogrammierung von Vorlagen, bei der Code nicht zur Laufzeit, sondern zur Kompilierungszeit ausgeführt wird, wodurch weniger Code generiert wird. Außerdem sorgen sie für viel sicherere Programme (weniger Casting), was im eingebetteten Bereich oft sehr wichtig ist. EC ++ wurde von C ++ - Experten (unter anderem) wegen der Dummheit, Vorlagen herauszuwerfen, zu Tode geprügelt.
sbi
18
@James: Du meinst Dinge wie effiziente Abstraktionen, generische Programmierung und Typensicherheit? Ja, wer würde das wollen.
Xeo
11
@JesperE Seitdem ich das geschrieben habe, habe ich die Jobs gewechselt und programmiere jetzt für eingebettete Geräte. Wir verwenden C ++ und es ist bemerkenswert, was die STL- und Template-Metaprogrammierung für Sie tun kann, wenn Sie schwache Hardware- und Echtzeitbeschränkungen sowie Zuverlässigkeitsanforderungen haben. (Wir machen Kraftwerke.) Ja, Sie müssen wissen, ob Sie a std::vectoroder a std::mapfü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.
sbi
119

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 .

Joonas Pulakka
quelle
14
Ich denke, ein großer Teil des Windows-Kernels ist auch C. Und viele Legacy-Systeme.
Coder
14
Um vollständig zu sein, hat Linus C ++ im Kernel ausprobiert. Das war eher ein Problem als ein Plus. Wie auch immer, Kernel-Entwicklung ist ein wirklich spezifisches Thema, das heißt nicht, dass C ++ im Allgemeinen schlecht ist.
Deadalnix
75
Nach anderen ist Linus' Argumentation schrecklich.
sbi
36
Die Argumente von Linus mögen gültig sein oder auch nicht, aber der Linux-Kernel ist immer noch in C geschrieben :-)
Joonas Pulakka
15
Linus ist ein Idiot.
Ubiyubix
94

Alle 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
  • Ich bin schon lange da

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

  • Nutzen Sie seine Bibliotheken
  • Kommunikation untereinander über C (Clang ist beispielsweise in C ++ geschrieben, bietet aber Python-Bindungen an, die an die C-Schnittstelle gebunden sind).

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

Matthieu M.
quelle
45

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

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

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

Loki Astari
quelle
1
Diese Antwort verwirrt mich ... Sie gehen weiter zu C # und zeigen dann SO Fragetags an, aber nichts davon hat wirklich etwas damit zu tun, dass C verwendet wird. Popularität (insbesondere bei Langpop, wo Suchmaschinen-Abfragen verwendet werden, um die Beliebtheit zu bestimmen) zeigt nicht wirklich die moderne Verwendung einer Sprache, sondern nur die moderne Suche nach einer Sprache. Sie müssen bei der Suche berücksichtigen, dass C an Universitäten häufig für Klassen der unteren Ebene verwendet wird, um die Anzahl der Abfragen und auch der SO-Posts zu erhöhen.
Jetti
3
@ Jetti: Deshalb sage ich ausdrücklich: I am sure none of this is authoritative but we can use it to see trendsAber 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.
Martin York
Rückblickend scheint es für mich eine schlechte Wortwahl zu geben. Ich meinte nicht die Klassen mit niedriger Anzahl (Anfangsklassen), sondern die Systemklassen (Computerarchitektur), in denen C verwendet wird.
Jetti
4
Die Anzahl der SO-Tags definiert nicht die Sprachbeliebtheit im Allgemeinen, sondern zeigt lediglich die Sprachbeliebtheit zwischen Benutzern von SO an .
Ed S.
4
@ Ed S. Offensichtlich. Aber es geht nicht um Popularität. Es geht um die Existenz von C als Sprache. Die Anzahl der SO-Tags zeigt uns, dass es sich definitiv nicht um eine tote Sprache handelt. Die Tatsache, dass C auf den anderen Websites unter den Top 2 liegt, macht es nicht zur ersten / zweithäufigsten verwendeten Sprache. Aber seine Existenz in den Top 10 ist ein wichtiger Hinweis darauf, dass es nicht tot ist. Natürlich ist nichts davon ein Beweis dafür, dass C immer noch aktiv verwendet wird.
Martin York
23

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 .

Jose Faeti
quelle
4
ahem !! Das ist ein großartiger Punkt. Ich habe nie darüber nachgedacht, dass "OOP-Funktionen tatsächlich den Overhead für die Sprache erhöhen". Vielen Dank, dass Sie diesen gültigen Punkt klargestellt haben. Jetzt kann ich verstehen, wo C vor anderen ist
Pankaj Upadhyay
7
Mit @Pankaj C ++ wird in der Regel nicht unbedingt ein großer Zeitaufwand für die Ausführung verursacht. Ein großer Teil der Komplexität der Sprache beruht auf dem Prinzip "Nicht für das bezahlen, was Sie nicht verwenden" - wenn Sie keine Ausnahmen verwenden, tun Ausnahmen dies nicht Verlangsamen oder vergrößern Sie Ihren Code. Der Compiler ist jedoch größer und komplexer
Martin Beckett
2
Bezüglich
6
Sie brauchen eigentlich nie OOP-Funktionen, es funktioniert einfach gut in einigen Szenarien.
Ed S.
2
@ Jose Faeti: Mein Chef würde zustimmen, weil mein Chef ein erfahrener, rationaler Typ ist. Er mag es nicht, Religion zu programmieren.
Ed S.
20

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.

GonzoKnight
quelle
7
C ist eine Teilmenge von C ++ . Ist es das, was Sie gemeint haben? . C ist keine Teilmenge von C ++; Tatsächlich sind sie ziemlich unterschiedlich. Ja, C ++ ist eine Erweiterung von C oder wird manchmal als C mit Klassen und OOP bezeichnet , aber zu sagen, dass C eine Teilmenge ist, rechtfertigt dies nicht
Pankaj Upadhyay,
7
C ++ ist größtenteils eine Obermenge einer alten Version von C, und C ist seitdem in eine etwas andere Richtung gegangen. Einige Aspekte der Sprachen sind weitgehend parallel verlaufen, andere jedoch nicht (und C ++ hat noch viele andere Aspekte ).
Donal Fellows
Ich stimme bei der Abstimmung für die Klarstellung dieser Tatsache zu, dass nicht alle gültigen C-Programme gültige C ++ - Programme sind, dh C ++ ist keine Obermenge von C. Es ist jedoch eine Obermenge dessen, wie C zum Zeitpunkt der Entscheidung dafür war eine Obermenge, wie Donal Fellows erwähnte. Es macht einfach keinen Sinn mehr zu sagen, dass es nicht mehr stimmt, obwohl es nicht mehr stimmt.
Joshua Hedges
16

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

Sternberg
quelle
D kann C-Code direkt aufrufen, genau wie C ++. Alles was Sie brauchen, wenn der Funktionsprototyp (wieder wie C ++). Sie schreiben einfach extern(C)in D, während Sie in C ++ schreibenextern "C"
Peter Alexander
@Peter Alexander Mir ist in D extern (C) bekannt. Darauf bezog ich mich, als ich Wrapper-Datei sagte. Sie können den C-Header nicht direkt einschließen (was Sie in C ++ tun können, vorausgesetzt, der C-Header verwendet externes "C" und hat die #ifdef __cplusplus-Blöcke, die die meisten tun). Es gibt dann andere Inkompatibilitäten, wenn Sie nur extern (C) verwenden (insbesondere, wie Zeichenfolgen behandelt werden. Meines Wissens haben sie in D kein Null-Abschlusszeichen. Sie müssen das Array also speziell ändern, wenn Sie es an C übergeben).
Sternberg
11

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.

tehnyit
quelle
4
ÖFFNEN SIE DIESE URL NICHT ! Die Website existiert nicht mehr und die URL leitet auf einige lästige Spam-Seiten weiter.
Nikolay Suvandzhiev
11

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

Valentin Radu
quelle
2
"Objective-C ist noch jung" ist eigentlich ab Mitte der 1980er Jahre so alt wie C ++. Die meisten Leute, die es benutzen, sind jedoch erst 2007 darauf gestoßen.
Was ich sagen wollte, ist, dass es viele C-Bibliotheken gibt, die in Objective-C für iOS kein Äquivalent haben. Tatsächlich ist die Sprache selbst überhaupt nicht jung (siehe Wiki). Vielen Dank für den Hinweis.
Valentin Radu
7

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.

Xavier T.
quelle
2. Platz (nach Java).
Martin York
7
Interessanterweise scheinen sowohl C ++ als auch Java in den letzten 10 Jahren an Popularität zu verlieren, während C mehr oder weniger statisch bleibt.
Paul R
7

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.

Tidbeck
quelle
5

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.

niko
quelle
1

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.

juhist
quelle
0

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::vectorob 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 memcpyDinge hier und memmovedort, malloceinen zusammenhängenden Block und realloces dort tun können, viel einfacher , ohne sich Gedanken über Konstruktoren, Destruktoren und Ausnahmen zu machen.

user204677
quelle