Würden Sie C heute für ein Softwareprojekt verwenden? [geschlossen]

18

Wenn ja, wo und warum würden Sie es verwenden?

Falls nein, erläutern Sie bitte, warum C für Sie nicht akzeptabel ist.

Luca Matteis
quelle
10
Natürlich gibt es Anwendungen, für die C die richtige und offensichtliche Wahl ist, aber persönlich, wenn ich nie wieder einen Speicherblock malloc, werde ich glücklich sterben.
Adam Crossland
Ja- Pferde für Kurse.
Martijn Verburg
Was bedeutet das?
Luca Matteis
Es ist ein altes Sprichwort für diejenigen, die Pferderennen folgen. Grundsätzlich bedeutet dies, dass jedes Pferd an seinem Tag gewinnen kann, solange der Kurs (trocken, matschig, lang, kurz, was auch immer) dazu passt. Gleiches gilt für Programmiersprachen - dies hängt immer vom Kontext und der Problemdomäne ab.
Martijn Verburg
2
Nein, aber nur, weil ich heute nicht an Projekten arbeite, für die C eine gute Sprachwahl wäre. Frag mich morgen nochmal.
James McNellis

Antworten:

38

C ist eine großartige Sprache für die Systemprogrammierung

Ich würde C verwenden, wenn ich einige Harware-Treiber implementieren würde. Und ich würde C verwenden, wenn ich meinen eigenen Betriebssystemkern oder meine eigene virtuelle Maschine implementiere.

Es ist eine sehr gute Sprache, um einfache Aufgaben zu erledigen, wenn Sie mit Hardware oder einfachen Betriebssystem-APIs für Windows-API, Linux, Mac OS X, Solaris usw. arbeiten müssen. Eingebettete Systeme bieten normalerweise eine gute Unterstützung für C mit einem Compiler + Development Kit.

Jonas
quelle
4
Können Sie herausfinden, wo "Mac OS Linux ist"? Ich dachte , Mac OS ist Darwin: en.wikipedia.org/wiki/Darwin_%28operating_system%29
LennyProgrammers
1
@ Stephen Furlani: LOL - ja, das ist eine Art Untertreibung. :-) Es gibt viele tote Unices wie Xenix, DYNIX und A / UX und aktuelle Versionen, die die meisten von uns nicht wie HP-UX sehen. Der Stammbaum ist so kompliziert und verworren wie der der europäischen Königsfamilien.
Bob Murphy
4
C ist eine schreckliche Sprache für die Systemprogrammierung. Wir wissen seit mehr als 20 Jahren, dass der Morris-Wurm und jeder, der ihn noch für ein Projekt mit Sicherheitsanforderungen einsetzt, insbesondere Betriebssysteme oder netzwerkbasierte Anwendungen, strafrechtlich verfolgt werden muss.
Mason Wheeler
2
@Mason Wheeler: Was sollen wir stattdessen verwenden?
Steve S
1
@Mason Wheeler: Hmm ... Ich habe Pascal in der Vergangenheit entlassen, aber vielleicht ist es Zeit, einen weiteren (genaueren) Blick darauf zu werfen. Haben Sie noch andere Vorschläge?
Steve S
17

Ja natürlich. Ich würde C verwenden, um leistungskritische Teile von System- oder Kommunikationsteilen auf niedriger Ebene zu schreiben. Zum Beispiel würde ich C zum Schreiben von NIFs in Erlang-Projekten verwenden, nur weil es das richtige Werkzeug für diese Art von Job ist. Oder ich würde C verwenden, um ähnliche Teile (XS) in Perl-Projekt zu schreiben.

Hynek-Pichi-Vychodil
quelle
16

Ich benutze C professionell, fast jeden Tag. Tatsächlich ist C die Sprache der höchsten Stufe, in der ich regelmäßig programmiere.

Wo ich C verwende: Ich schreibe einfachen Bibliothekscode, der so effizient wie möglich sein muss. Mein Klebercode ist in C geschrieben, innere Rechenschleifen sind in Assembler geschrieben.

Warum ich C verwende: Es ist viel einfacher, komplexe Argumentstrukturen und Fehlerbedingungen zu verarbeiten als in der Assembly, und der Leistungsaufwand für diese Art der Bedingungsprüfung vor dem Starten der eigentlichen Berechnung ist häufig vernachlässigbar. Da C eine einfache, gut spezifizierte Sprache ist, fällt es mir leicht, mit dem Compilerteam bei der Arbeit zusammenzuarbeiten, um die Codegenerierung zu verbessern, wenn ich kompilierten Code mit inakzeptablen Leistungsrisiken sehe.

Portabilität ist eine weitere große Tugend von C. Mein Glue-Code wird von mehreren hardwarespezifischen Implementierungen der Bibliotheken, an denen ich arbeite, gemeinsam genutzt, was die Unterstützung für neue Plattformen erheblich vereinfacht. Die meisten Plattformen verfügen nicht über eine virtuelle Maschine oder einen Interpreter für die Sprachversion des Monats. Einige Plattformen haben keinen guten C ++ - Compiler. Es gibt nur sehr wenige Plattformen, auf denen es keinen brauchbaren C-Compiler gibt (und da ich mit unserem Compilerteam gut zusammenarbeite, fällt es mir normalerweise nicht schwer, die Unterstützung zu bekommen, die ich benötige).

Stephen Canon
quelle
6
Klingt so, als hättest du einen wirklich lustigen Job!
Paul Nathan
Das ist mein Traumjob.
Rsmahanti
5

Ja, ich würde C in einem stark ressourcenbeschränkten eingebetteten System verwenden. Ich kann stattdessen C ++ verwenden, weil es einfach ist, starke Schnittstellen zwischen Softwarekomponenten zu fördern, aber nur, wenn alle an dem Projekt arbeitenden Ingenieure verstehen, dass C ++ leicht missbraucht werden kann, was zu einer Aufblähung der Codegröße führt (virtuelle Funktionen und Vorlagen sind Beispiele für Dinge, die vermieden werden sollten) ).

Ich habe auch einen C ++ - Programmierer gesehen, der versucht hat, ein 10-KB-Objekt auf einem 1-KB-Stapel zu erstellen, was keine gute Idee ist.

geekbrit
quelle
2
Tatsächlich sind die virtualFunktionen in Ordnung, da sie dem Prinzip "Sie zahlen nicht für das, was Sie nicht verwenden" folgen. In einer Umgebung mit eingeschränktem Speicher können Sie jedoch Ausnahmen und RTTI deaktivieren.
Matthieu M.
Ich habe das Gefühl, dass ich immer nur Singleton-Objekte in C ++ erstelle, um periphere Schnittstellen bereitzustellen. Ich denke, die Leute entscheiden sich in eingebetteten Systemen für C ++ gegenüber C, weil sie C ++ für "besser" halten.
Erik
5

Ich arbeite hauptsächlich mit dem Xen-Hypervisor, den verschiedenen Bibliotheken und dem Linux-Kernel. Gelegentlich muss ich einen Gerätetreiber schreiben (oder einen neu schreiben, damit nxx virtuelle Maschinen ein einzelnes Gerät wie eine HRNG gemeinsam nutzen können). C ist meine Hauptsprache und damit bin ich sehr zufrieden.

Würde ich versuchen, ein Tabellenkalkulationsprogramm damit zu schreiben? Auf keinen Fall. Jedes Werkzeug hat seine Anwendungen und ich bin froh, dass ich viele Werkzeuge habe.

Ich liebe C, aber ich versuche nicht, Schrauben mit einem Hammer zu schlagen.

Wenn C eine sinnvolle Wahl für ein neues Projekt ist, ist dies sicher. Wenn nicht, werde ich etwas anderes verwenden.

Tim Post
quelle
4

Ich würde für einige Projekte. Würde auf jeden Fall, wenn ich ein eingebettetes System implementieren müsste, zum Beispiel für die Steuerung eines autonomen Flugzeugs. Bei einigen Bauteilen kann es bei der Montage sogar zu einer Absenkung kommen.

Wenn es zum Projekt passt, habe ich kein Problem damit.

Wenn Sie eine Webanwendung entwickeln möchten, hmm, wahrscheinlich nicht (oder ich würde eine sehr starke und faktengestützte Begründung benötigen).

Ich würde es auch aus anderen Projekten verwenden, die hauptsächlich mit anderen Sprachen entwickelt wurden, wenn ein Engpass eindeutig identifiziert wurde und eine Optimierung mit nativem Code implementiert werden kann. Zum Beispiel eine Java-Lösung, für die intensive Berechnungen für fortgeschrittenes Rendering erforderlich sind (z. B. eine Rendering-Engine oder ähnliches). Wenn es sich nicht um eine unterstützte Plattform handelt, können Sie standardmäßig eine Java-Implementierung verwenden, für einige unterstützte Plattformen jedoch eine nativ kompilierte Implementierung aus C bereitstellen und eine gute Leistungssteigerung erzielen.

Haylem
quelle
Sie möchten einen Grund, es für eine Webanwendung zu verwenden? Memcached ist in C geschrieben und ein zentraler Bestandteil vieler Webanwendungen. Ein Kollege von mir hat auch einen Code für eine Social-Networking-Site in C geschrieben - einmal algorithmisch komplex, mit Datenmengen, die an die Größe des wirtschaftlich verfügbaren Arbeitsspeichers grenzen, und Abfragen, die durchschnittlich 23 Mal pro Seite gerendert werden. Mit einer 4-tägigen C-Anwendung haben wir 4 Monate des Gehalts eines Programmierers an Servern gespart.
qdot
@ qdot: Das ist ein triftiger Grund. Es gibt auch einen Grund, warum es gute Frameworks für C- und C ++ - Webentwickler gibt. Wäre einfach nicht meine erste Wahl, wenn ich eine allgemeine Web-App oder Website entwickeln müsste. Im Falle eines Frameworks wie memcached ist dies offensichtlich vollkommen sinnvoll. Ebenso kann es sinnvoll sein, den Server in C zu haben. Daher wohl auch nicht. Memcached (und Ihre spezifische C-Implementierung eines rechenintensiven Teils einer Web-App) sind absolut gültige Verwendungen von C für Web-Entwickler. Aber Sie brauchen einen guten C-Programmierer, um das zu tun. Nur nicht jemand, der es unterwegs abholen oder Probleme erwarten würde.
Haylem
Und wenn andere Leute andere gültige Gründe wie diese haben, posten Sie sie bitte hier! Es ist nützlich für Leser.
Haylem
Wenn Sie C verwenden, werden Sie lernen, zunächst große Leistung, gute Lernerfahrung und jede Menge ungeklärter Probleme zu erwarten. Ich habe nur versucht, die Leute zur Verwendung von C zu ermutigen, da es schnell entscheidend wird, wenn Sie von einem "Eins-in-der-Million" -Entwickler für PHP / Ruby / Python aufbrechen und sich vor großen Rechenproblemen den Kopf zerkratzen.
qdot
@ qdot: in der Tat. Schade, dass viele Leute C nicht mehr wirklich kennen.
Haylem
4

Jede einzelne Sprache hat eine anständige Nische. Ich stelle häufig fest, dass ich Dinge in höheren Sprachen implementiere und sie dann nach und nach in C-land herunterbringe, wenn ich möchte, dass sie leistungsfähiger oder einfach nur portabler sind. Es gibt C-Compiler für fast alles, und wenn Sie in eine universell verfügbare API (wie POSIX) schreiben, kann dies sehr nützlich sein.

Was ich heute oft Leuten erzähle, die daran interessiert sind, Programmieren zu lernen, ist sicherzustellen, dass sie irgendwann C lernen und sich damit vertraut machen. Sie könnten sich in Situationen befinden, in denen Sie es brauchen. Bei mehr als einer Gelegenheit musste ich ein winziges, statisch verknüpftes "Fast Reboot" -Programm kompilieren und mit scp auf einer RAM-Disk auf einem Server ablegen, auf dem das Disk-Subsystem vollständig verschwunden war. (Günstige, billige Server, keine Online-Redundanz und nur die Möglichkeit, ein kleines Programm zu laden? C ist der richtige Weg.)

Das Erlernen des Arbeitens in C, ohne sich in den Fuß zu schießen, kann erheblich zur Fähigkeit beitragen, effizient in anderen Sprachen und Umgebungen zu schreiben. Zumindest war das meine Erfahrung.

Ich benutze es sicherlich nicht für alles oder die meisten Dinge, aber es hat seinen Platz und ist ziemlich universell: also ja, ich habe es in der Vergangenheit benutzt und werde es in Zukunft benutzen (obwohl ich es nicht tun) weiß wann im Moment).

Michael Trausch
quelle
4

Ja, ich mache es die ganze Zeit.

Wenn Sie keine Bibliotheken aufrufen, erfordert aus C generierter Code keine Betriebssystemunterstützung. Sie haben auch die Möglichkeit, die generierte Maschinensprache genau zu steuern. Daher eignet es sich hervorragend zum Schreiben von Treibern oder anderem Code, der in Kernelbereichen und in anderen eingeschränkten Situationen wie vielen Arten von eingebetteten Systemen verwendet wird. Es ist auch die Hauptsprache für Open-Source-Projekte, mit denen ich arbeite, wie X Windows, GTK + und Clutter.

Während Sie in C alles tun können, was Sie in C ++ tun können, machen es die Mechanismen von C ++ häufig schneller und einfacher, Code zu schreiben. Ich liebe OOP und die Art und Weise, wie C ++ - Klassen Funktionalität verkapseln, und ich liebe RAII. Die sorgfältige Verwendung des automatischen Destruktoraufrufs, wenn ein Objekt den Gültigkeitsbereich verlässt, beseitigt den größten Teil der Speicher- und Ressourcenlecks, die der Fluch der C-Programmierung sind. Die STL ist im Grunde eine riesige Bibliothek hochoptimierter Algorithmen und Datenstrukturen. Wenn Sie sie von C verwenden möchten, müssen Sie sie selbst schreiben oder irgendwo kaufen.

Leider erfordert das Laufzeitsystem unter Linux aus Gründen, die ich nicht verstehe, eine spezielle gemeinsam genutzte Objektbibliothek (entspricht DLL unter Windows, dylib unter Mac), um C ++ auszuführen, und wird nicht gefunden, wenn Sie ein C-Programm ausführen. Daher kann ich keinen meiner bevorzugten Mac- und Windows-Tricks ausführen, nämlich ein C ++ - basiertes freigegebenes Objekt mit einer C-basierten API zu schreiben und es aus einem C-Programm aufzurufen.

Also hier ist mein Entscheidungsprozess:

  1. Arbeite ich in einer eingeschränkten Situation wie ein Gerätetreiber? Verwenden Sie C.
  2. Schreibe ich eine Linux-Bibliothek, die irgendjemand anders benutzen muss? Verwenden Sie C.
  3. Arbeite ich in Code, der bereits in C geschrieben ist? Verwenden Sie C.
  4. Schreibe ich eine Mac- oder Windows-Bibliothek oder nur eine Linux-Bibliothek, die ich verwenden werde? Schreiben Sie die Interna in C ++, machen Sie jedoch nur eine C-Schnittstelle verfügbar, um das fragile Problem der binären Schnittstelle zu vermeiden.
  5. Verwenden Sie C ++.

Eine nette Sache ist, dass, da C ++ C kompilieren kann, wenn Sie wirklich eine detaillierte Kontrolle über den für eine bestimmte Situation generierten Code benötigen, Sie einfach C dafür und C ++ für den Rest schreiben und alles mit dem C ++ - Compiler kompilieren können .

Bob Murphy
quelle
Sie können nicht "alles mit einem C-Compiler kompilieren", weil es ein Malloc-Problem mit C ++ gibt. Sie müssen C ++ aber nicht C verwenden. Natürlich ist alles in Ordnung, wenn Sie den C-Code verwenden, der vollkommen legal, aber ärgerlich ist .
Alternative
1
@mathepic: Ja, C ++ ist in vielerlei Hinsicht strenger als C, einschließlich der Zuweisung von ungültigen Zeigern zu typisierten Zeigern. Ich behebe jedoch Fehler in einigen älteren Projekten, zum Teil durch Kompilieren von C-Dateien mit C ++. Ich bin der Meinung, dass das Typ-Casting der Ergebnisse von malloc ein kleiner Preis ist, den man dafür zahlen muss, dass der C ++ - Compiler subtile Fehler aufdeckt, da der Code in C vollkommen legal ist.
Bob Murphy
3

Ja, hängt aber vom Projekt ab. C ist sehr gut für einige Low-Level-Projekte oder Teil der größten Lösung.

Z.B. Für Geschäftslogik ok, aber nicht für Benutzeroberfläche.

Svisstack
quelle
2

wenn es beides sein muss

  • schnell und
  • tragbar

dann benutze ich C. Vielleicht C ++.

Steven A. Lowe
quelle
Schnell und portabel, das kann auch Java oder C # sein.
Jonas
11
@Jonas: nicht. Portable bedeutet nicht nur "Windows oder Linux" ;-)
Steven A. Lowe
1
@Jonas: Schnell und portabel, das wäre weder Java noch C #. C ++ ist plattformübergreifend und für eingebettete Geräte wie Mikrocontroller portierbar, und C ist sogar (als Fremdfunktionen) für andere Sprachen portierbar. Beide sind schneller als nicht funktionierende und daher stapelbasierte, aber immer noch müllsammelnde Sprachen. Sie brauchen nicht beides: einen Stack und einen Garbage Collector.
Comonad
2
@Jonas: lies es; beachte die einschränkungen und wieder bedeutet "portable" nicht nur windows / linux. In der Frage wird gefragt, wann Sie C verwenden würden. Die Antwort lautet: Wenn es überall schnell gehen muss . Ich liebe Java und C #, aber sie sind Vorschlaghammer, und ältere / eingebettete Systeme haben keine Laufzeiten. Viele von ihnen haben nicht einmal Platz für eine Laufzeit!
Steven A. Lowe
2
@Jonas: Ich schätze deine Leidenschaft, aber "neue Plattformen" sind nicht das Thema. Lassen Sie mich ein konkretes Beispiel geben, um zu sehen, ob dies hilft: Die Mikroprozessoren, die Panzer auf dem Schlachtfeld unterstützen, verfügen über C-Compiler. Sie haben noch nie eine JVM.
Steven A. Lowe
2

Ja, in der Tat habe ich vor kurzem!

Ich programmiere gern in C. Ich programmiere am meisten in Python, aber manchmal brauche ich schnellen Code und ich genieße die Eleganz, die sich aus der Einfachheit der Sprache ergibt.

Das Projekt, an dem ich gerade arbeite, ist eine Datenbank, die, wie Sie sich vorstellen können, leistungskritisch ist. Im Moment benutze ich C und etwas Python, aber irgendwann wird es überwiegend sein, wenn nicht ganz C.

dan_waterworth
quelle
2

Ja!

C ist eine einfache Sprache, und es gibt Situationen, in denen C fast die einzige Option ist, wie ich C zum Programmieren von Mikrocontrollern verwende oder Code zusammenstelle, um mit Geräten von klassischen Ports wie Parallel, Seriell oder sogar Modem zu interagieren!

omeid
quelle
2

Ja. Ich habe den größten Teil meiner Karriere damit verbracht, C ++ zu programmieren, aber jetzt schreibe ich den größten Teil meines Codes in Ruby. Wenn ich Leistung oder Zugriff auf Low-Level-Inhalte benötige, schreibe ich eine C-Erweiterung. Es ist der zukünftige Mann!

Henry
quelle
Einige Antworten bezogen sich auf Portabilität und Geschwindigkeit als die Vorteile von C-Code, aber die Verknüpfung ist ein weiteres wichtiges Merkmal. Es ist relativ einfach, in C geschriebenen "fremden" Code zu verknüpfen, da dies eine einfache "klassische" Stack-Disziplin ist. Viele C-Compiler erlauben "Inline-Assembler" aus Bequemlichkeit, in einer Architektur auf sehr niedrigem Niveau zu arbeiten (was offensichtlich die Portabilität auf frischer Tat beeinträchtigt).
Hardmath
1

Ich würde C verwenden, wenn ich ein Betriebssystem schreibe. Da das in den nächsten zwanzig Jahren nicht passieren wird, wenn ich nicht Lotto spiele und nichts anderes zu tun habe, als meine eigene großartige Linux-Distribution zu erstellen, werde ich mich wahrscheinlich nur an C #, Java, Python usw. halten Ich habe C schon sehr lange nicht mehr benutzt, aber es hat mir immer Spaß gemacht. Ich denke aber, heutzutage ist mein Kopf so umhüllt von OO, dass ich ein bisschen brauchen würde, um wieder ins Rollen zu kommen, wenn ich zurückgehen müsste.

Nodey The Node Guy
quelle
0

C ++ ist plattformübergreifend und auf eingebetteten Geräten wie Mikrocontrollern portierbar. (C ++ kann zu C kompiliert werden, daher Mikrocontroller.)

C ist sogar portabel (als Fremdfunktionalität) für andere Sprachen. Wenn ich daher Bibliotheken auf niedriger Ebene programmiere, dann möchte ich mehr Kompatibilität als mit C ++.

Haskell ist plattformübergreifend (ARM ist in Kürze erhältlich), jedoch NICHT für eingebettete Geräte wie Mikrocontroller. Die Geschwindigkeit ist vergleichbar mit C und C ++; Da es jedoch funktionsfähig ist, verwendet es einen Garbage-Collector anstelle eines Runtime-Stacks. Daher kann es zu verschiedenen Zeiten (Garbage-Collection) und in verschiedenen Situationen (Fortsetzungen anstelle von Unterprogrammaufrufen) schneller und langsamer als C sein.


Ich wähle die abstrakteste Sprache, da sich die Programmgeschwindigkeit nicht unterscheidet, sondern die Entwicklungszeit und die Fehlerrate. C und C ++ unterscheiden sich stark, jedoch nicht aus Sicht von Haskell.

Ich bevorzuge keine anderen Sprachen, obwohl ich ein oder zwei Hände voll kann. … Außer in einigen Fällen, na ja , bash .

comonad
quelle
0

Eingebettete Systeme haben häufig nicht mehr als ein paar Kilobyte RAM und vielleicht ein paar Dutzend Kilobyte Flash bei einer Prozessortaktrate von ein paar MHz. C ist die einzige Option, die in einer solchen Bare-Metal-Umgebung Sinn macht.


quelle