Wenn ja, wo und warum würden Sie es verwenden?
Falls nein, erläutern Sie bitte, warum C für Sie nicht akzeptabel ist.
Wenn ja, wo und warum würden Sie es verwenden?
Falls nein, erläutern Sie bitte, warum C für Sie nicht akzeptabel ist.
Antworten:
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.
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.
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).
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.
virtual
Funktionen 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.
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.
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.
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).
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:
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 .
wenn es beides sein muss
dann benutze ich C. Vielleicht C ++.
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.
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!
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.
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 .
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.