it-swarm-eu.dev

Gibt es einen Grund, C ++ anstelle von C, Perl, Python usw. zu verwenden?

Als Linux-Entwickler (serverseitig) weiß ich nicht, wo und warum ich C++ verwenden soll.

Wenn ich zur Aufführung gehe, ist die erste und letzte Wahl C.

Wenn "Leistung" nicht das Hauptproblem ist, sind Programmiersprachen wie Perl und Python] eine gute Wahl.

Fast alle Open-Source-Anwendungen, die ich in diesem Bereich kenne, wurden in C, Perl, Python, Bash-Skript, AWK oder sogar PHP geschrieben, aber niemand verwendet C++ .

Ich spreche nicht über andere Bereiche wie GUI oder Webanwendungen, sondern nur über Linux, CLI und Daemons.

Gibt es einen zufriedenstellenden Grund für die Verwendung von C++?

166
Ehsan

Wenn ich zur Aufführung gehe, ist die erste und letzte Wahl C.

Und hier sollten Sie sichern. Jetzt kann ich überhaupt nicht für die Serverentwicklung sprechen. Vielleicht gibt es in der Tat keinen zwingenden Grund, C++ den Alternativen vorzuziehen.

Im Allgemeinen ist der Grund für die Verwendung von C++ anstelle anderer Sprachen in der Tat die Leistung. Der Grund dafür ist, dass C++ ein Abstraktionsmittel bietet, das im Gegensatz zu allen anderen Sprachen, die ich kenne, hat. Kein Leistungsaufwand zur Laufzeit.

Dies ermöglicht das Schreiben von sehr effizientem Code, der immer noch eine sehr hohe Abstraktionsstufe aufweist.

Betrachten Sie die üblichen Abstraktionen: virtuelle Funktionen, Funktionszeiger und das PIMPL-Idiom. All dies beruht auf einer Indirektion, die zur Laufzeit durch Zeigerarithmetik aufgelöst wird. Mit anderen Worten, es entstehen Leistungskosten (wie gering diese auch sein mögen).

C++ bietet andererseits einen Indirektionsmechanismus, der keine (Leistungs-) Kosten verursacht: Vorlagen. (Dieser Vorteil wird mit einer (manchmal enorm) längeren Kompilierungszeit bezahlt.)

Betrachten Sie das Beispiel einer generischen Sortierfunktion.

In C verwendet die Funktion qsort einen Funktionszeiger, der die Logik implementiert, nach der Elemente relativ zueinander angeordnet sind. Java Arrays.sort Funktion gibt es in mehreren Varianten; Einer von ihnen sortiert beliebige Objekte und erfordert die Übergabe eines Comparator - Objekts, das dem Funktionszeiger in Cs qsort sehr ähnlich ist. Es gibt jedoch noch einige weitere Überladungen für die "nativen" Java -Typen). Und jeder von ihnen hat eine eigene Kopie der sort -Methode - eine schreckliche Codeduplizierung.

Java veranschaulicht hier eine allgemeine Zweiteilung: Entweder haben Sie eine Codeduplizierung oder es entsteht ein Laufzeit-Overhead.

In C++ funktioniert die Funktion sort ähnlich wie qsort in C, mit einem kleinen, aber grundlegenden Unterschied: Der Komparator, der an die Funktion übergeben wird, ist eine Vorlage Parameter. Das bedeutet, dass sein Aufruf inline sein kann. Es ist keine Indirektion erforderlich, um zwei Objekte zu vergleichen. In einer engen Schleife (wie hier) kann dies tatsächlich einen wesentlichen Unterschied machen.

Es überrascht nicht, dass die C++ sort -Funktion Cs sort übertrifft, selbst wenn der zugrunde liegende Algorithmus derselbe ist. Dies macht sich insbesondere dann bemerkbar, wenn die tatsächliche Vergleichslogik billig ist.

Jetzt sage ich nicht , dass C++ a priori effizienter ist als C (oder andere Sprachen), noch dass es a priori eine höhere Abstraktion bietet. Was es bietet, ist eine Abstraktion, die sehr hoch und gleichzeitig unglaublich billig ist, so dass Sie häufig nicht zwischen effizientem und wiederverwendbarem Code wählen müssen.

310
Konrad Rudolph

Ich sehe viel zu viele C-Programmierer, die C++ hassen. Ich habe einige Zeit (Jahre) gebraucht, um langsam zu verstehen, was gut und was schlecht daran ist. Ich denke, der beste Weg, es auszudrücken, ist folgender:

Weniger Code, kein Laufzeitaufwand, mehr Sicherheit.

Je weniger Code wir schreiben, desto besser. Dies wird allen Ingenieuren, die nach Spitzenleistungen streben, schnell klar. Sie beheben einen Fehler an einer Stelle, nicht an vielen - Sie drücken einen Algorithmus einmal aus und verwenden ihn an vielen Stellen wieder usw. Die Griechen haben sogar ein Sprichwort, das auf die alten Spartaner zurückgeht: "Etwas in weniger Worten zu sagen, bedeutet dass du darüber weise bist ". Tatsache ist, dass bei korrekter Verwendung mit C++ Sie sich in weit weniger Code als C ausdrücken können, ohne die Laufzeit zu beeinträchtigen sicherer sein (dh mehr Fehler beim Kompilieren abfangen) als C.

Hier ist ein vereinfachtes Beispiel aus meinem Renderer : Beim Interpolieren von Pixelwerten über die Scanlinie eines Dreiecks. Ich muss von einer X-Koordinate x1 ausgehen und eine X-Koordinate x2 erreichen (von der linken zur rechten Seite eines Dreiecks). Und über jeden Schritt, über jedes Pixel, über das ich gehe, muss ich Werte interpolieren.

Wenn ich das Umgebungslicht interpoliere, das das Pixel erreicht:

  typedef struct tagPixelDataAmbient {
      int x;
      float ambientLight;
  } PixelDataAmbient;

  ...
  // inner loop
  currentPixel.ambientLight += dv;

Wenn ich die Farbe interpoliere (als "Gouraud" -Schattierung bezeichnet, wobei die Felder "Rot", "Grün" und "Blau" bei jedem Pixel durch einen Schrittwert interpoliert werden):

  typedef struct tagPixelDataGouraud {
      int x;
      float red;
      float green;
      float blue;  // The RGB color interpolated per pixel
  } PixelDataGouraud;

  ...
  // inner loop
  currentPixel.red += dred;
  currentPixel.green += dgreen;
  currentPixel.blue += dblue;

Wenn ich in "Phong" -Schattierung rendere, interpoliere ich keine Intensität (Umgebungslicht) oder Farbe (Rot/Grün/Blau) mehr - ich interpoliere einen normalen Vektor (nx, ny, nz) und muss bei jedem Schritt neu -Berechnen Sie die Beleuchtungsgleichung basierend auf dem interpolierten Normalenvektor:

  typedef struct tagPixelDataPhong {
      int x;
      float nX;
      float nY;
      float nZ; // The normal vector interpolated per pixel
  } PixelDataPhong;

  ...
  // inner loop
  currentPixel.nX += dx;
  currentPixel.nY += dy;
  currentPixel.nZ += dz;

Der erste Instinkt von C-Programmierern wäre nun "zum Teufel, schreibe drei Funktionen, die die Werte interpolieren, und rufe sie abhängig vom eingestellten Modus auf". Dies bedeutet zunächst einmal, dass ich ein Typproblem habe - womit arbeite ich? Sind meine Pixel PixelDataAmbient? PixelDataGouraud? PixelDataPhong? Oh, warte, sagt der effiziente C-Programmierer, benutze eine Gewerkschaft!

  typedef union tagSuperPixel {
      PixelDataAmbient a;
      PixelDataGouraud g;
      PixelDataPhong   p;
  } SuperPixel;

..und dann hast du eine Funktion ...

  RasterizeTriangleScanline(
      enum mode, // { ambient, gouraud, phong }
      SuperPixel left,
      SuperPixel right)
  {
      int i,j;
      if (mode == ambient) {
          // handle pixels as ambient...
          int steps = right.a.x - left.a.x;
          float dv = (right.a.ambientLight - left.a.ambientLight)/steps;
          float currentIntensity = left.a.ambientLight;
          for (i=left.a.x; i<right.a.x; i++) {
              WorkOnPixelAmbient(i, dv);
              currentIntensity+=dv;
          }
      } else if (mode == gouraud) {
          // handle pixels as gouraud...
          int steps = right.g.x - left.g.x;
          float dred = (right.g.red - left.g.red)/steps;
          float dgreen = (right.g.green - left.a.green)/steps;
          float dblue = (right.g.blue - left.g.blue)/steps;
          float currentRed = left.g.red;
          float currentGreen = left.g.green;
          float currentBlue = left.g.blue;
          for (j=left.g.x; i<right.g.x; j++) {
              WorkOnPixelGouraud(j, currentRed, currentBlue, currentGreen);
              currentRed+=dred;
              currentGreen+=dgreen;
              currentBlue+=dblue;
          }
...

Spürst du das Chaos?

Zuallererst ist nur ein Tippfehler erforderlich, um meinen Code zum Absturz zu bringen, da der Compiler mich im Abschnitt "Gouraud" der Funktion niemals aufhalten wird, um tatsächlich auf die ".a" zuzugreifen. (Umgebungs-) Werte. Ein Fehler, der nicht vom C-Typ-System abgefangen wird (dh während der Kompilierung), bedeutet einen Fehler, der sich zur Laufzeit manifestiert und ein Debugging erfordert. Haben Sie bemerkt, dass ich bei der Berechnung von "dgreen" auf left.a.green Zugreife? Der Compiler hat es Ihnen sicherlich nicht gesagt.

Dann gibt es überall Wiederholungen - die for -Schleife ist so oft vorhanden, wie es Rendering-Modi gibt. Wir machen weiterhin "rechts minus links geteilt durch Schritte". Hässlich und fehleranfällig. Haben Sie bemerkt, dass ich mit "i" in der Gouraud-Schleife vergleiche, wenn ich "j" hätte verwenden sollen? Der Compiler ist wieder still.

Was ist mit der if/else/Leiter für die Modi? Was ist, wenn ich in drei Wochen einen neuen Rendering-Modus hinzufüge? Werde ich mich daran erinnern, den neuen Modus in allen "if mode ==" in meinem gesamten Code zu behandeln?

Vergleichen Sie nun die obige Hässlichkeit mit diesem Satz von C++ - Strukturen und einer Vorlagenfunktion:

  struct CommonPixelData {
      int x;
  };
  struct AmbientPixelData : CommonPixelData {
      float ambientLight;
  };
  struct GouraudPixelData : CommonPixelData {
      float red;
      float green;
      float blue;  // The RGB color interpolated per pixel
  };
  struct PhongPixelData : CommonPixelData {
      float nX;
      float nY;
      float nZ; // The normal vector interpolated per pixel
  };

  template <class PixelData>
  RasterizeTriangleScanline(
      PixelData left,
      PixelData right)
  {
      PixelData interpolated = left;
      PixelData step = right;
      step -= left;
      step /= int(right.x - left.x); // divide by pixel span
      for(int i=left.x; i<right.x; i++) {
          WorkOnPixel<PixelData>(interpolated);
          interpolated += step;
      }
  }

Nun sieh dir das an. Wir machen keine Union-Typ-Suppe mehr: Wir haben für jeden Modus bestimmte Typen. Sie verwenden ihre allgemeinen Inhalte (das "x" -Feld) wieder, indem sie von einer Basisklasse (CommonPixelData) erben. Und die Vorlage lässt den Compiler die drei verschiedenen Funktionen erstellen (dh Code generieren), die wir selbst in C geschrieben hätten, aber gleichzeitig sehr streng in Bezug auf die Typen!

Unsere Schleife in der Vorlage kann nicht vermasseln und auf ungültige Felder zugreifen - der Compiler bellt, wenn wir dies tun.

Die Vorlage führt die allgemeine Arbeit aus (die Schleife wird jedes Mal um "Schritt" erhöht) und kann dies auf eine Weise tun, die einfach KEINE Laufzeitfehler verursachen kann. Die Interpolation pro Typ (AmbientPixelData, GouraudPixelData, PhongPixelData) erfolgt mit der operator+=(), die wir in den Strukturen hinzufügen werden - die im Grunde diktieren wie jeder Typ interpoliert wird.

Und sehen Sie, was wir mit WorkOnPixel <T> gemacht haben? Wir wollen unterschiedliche Arbeiten pro Typ machen? Wir nennen einfach eine Vorlagenspezialisierung:

void WorkOnPixel<AmbientPixelData>(AmbientPixelData& p)
{
    // use the p.ambientLight field
}


void WorkOnPixel<GouraudPixelData>(GouraudPixelData& p)
{
    // use the p.red/green/blue fields
}

Das heißt - die aufzurufende Funktion wird basierend auf dem Typ festgelegt. Zur Kompilierungszeit!

Um es noch einmal umzuformulieren:

  1. wir minimieren den Code (über die Vorlage) und verwenden gemeinsame Teile wieder.
  2. wir verwenden keine hässlichen Hacks, wir halten ein striktes Typsystem ein, damit der Compiler uns jederzeit überprüfen kann.
  3. und das Beste von allem: Nichts von dem, was wir getan haben, hat Auswirkungen auf die Laufzeit. Dieser Code wird NUR so schnell ausgeführt wie der entsprechende C-Code. Wenn der C-Code Funktionszeiger zum Aufrufen der verschiedenen WorkOnPixel -Versionen verwendet hat, ist der C++ - Code SCHNELLER als C, da der Compiler inline ist der typspezifische WorkOnPixel Template-Spezialisierungsaufruf!

Weniger Code, kein Laufzeitaufwand, mehr Sicherheit.

Bedeutet dies, dass C++ das A und O der Sprachen ist? Natürlich nicht. Sie müssen noch Kompromisse messen. Ignorante Leute verwenden C++, wenn sie ein Bash/Perl/Python-Skript hätten schreiben sollen. Trigger-fröhliche C++ - Neulinge erstellen tief verschachtelte Klassen mit virtueller Mehrfachvererbung, bevor Sie sie stoppen und zum Packen senden können. Sie werden komplexe Boost Metaprogrammierung verwenden, bevor sie erkennen, dass dies nicht notwendig ist. Sie verwenden NOCH char*, strcmp und Makros anstelle von std::string Und Vorlagen.

Aber das sagt nichts weiter als ... beobachte, mit wem du arbeitest. Es gibt keine Sprache, die Sie vor inkompetenten Benutzern schützt (nein, nicht einmal Java).

Lernen Sie weiter und verwenden Sie C++ - überdesignen Sie einfach nicht.

167
ttsiodras

RAII für das Win-Baby.

Im Ernst, die deterministische Zerstörung in C++ macht Code viel klarer und sicherer, ohne jeglichen Overhead.

79
Motti

Gibt es einen zufriedenstellenden Grund für die Verwendung von C++?

  1. Vorlagen und die STL. Sie tauschen ein wenig Build-Zeit (und einige möglicherweise unverständliche Fehlermeldungen) gegen eine Menge nützlicher Abstraktions- und arbeitssparender Tools ohne nennenswerte Laufzeit Leistungseinbußen (obwohl der binäre Footprint möglicherweise etwas größer ist).

    Es dauert eine Weile, bis Sie Ihren Kopf umwickelt haben (ich habe ein paar Jahre gebraucht, bevor er geklickt hat), aber wenn Sie dies tun, kann dies das Leben um eine Menge einfacher machen .

  2. Die Textverarbeitung in C++ ist Größenordnungen weniger schmerzhaft als in C.

70
John Bode

Ja.

Wenn Sie nach ausführbarer Effizienz suchen, müssen Sie C oder C++ verwenden, also werde ich mich darauf konzentrieren.

Noch bevor Vorlagen üblich waren, habe ich aus zwei sehr einfachen Gründen die Verwendung von C++ gegenüber C für die Arten von ausführbaren Dateien vorgezogen, die Sie bereits Mitte der neunziger Jahre besprochen haben: Objektpolymorphismus und RAII .

Ich habe polymorphe C++ - Objekte für alle möglichen interessanten Dinge verwendet. Ich habe zum Beispiel an einem eingebetteten Linux-System mit Frame Buffer Overlays auf OMAP und XScale gearbeitet ARM CPUs. Die beiden Hardwarearchitekturen haben unterschiedliche Overlay-Funktionen mit sehr unterschiedlichen APIs. Ich habe eine gemeinsame virtuelle " Overlay "-Basisklasse, um eine idealisierte Ansicht von Overlays bereitzustellen, und schrieb dann" OmapOverlay "- und" XScaleOverlay "-Klassen, die zur Laufzeit entsprechend instanziiert wurden, je nachdem, auf welcher Architektur der Code sie ausgeführt hat.

Um es zu vereinfachen, ist RAII die Idee, dass Sie Ressourcen, die mit einem Objekt verbunden sind, während des Objektkonstruktors oder später im Leben des Objekts zuweisen und die Ressourcen im Destruktor des Objekts freigegeben oder freigegeben werden. Das ist wirklich schön in C++, weil Objekte, die automatische Variablen sind, zerstört werden, wenn sie den Gültigkeitsbereich verlassen. Für jemanden, der in C und C++ gleichermaßen kompetent ist, ist es viel einfacher, Ressourcen- und Speicherlecks in C++ zu vermeiden. Sie sehen auch nicht viel C++ - Code mit dem sehr häufigen C-Mem eines Labels am Ende einer Funktion vor einer Reihe von Aufrufen von free() und verschiedenen goto im Funktionsblock dort springen.

Ich bin mir völlig bewusst, dass Sie all diese Dinge mit C erledigen können - es ist nur viel mehr Arbeit, viel mehr Codezeilen, und was Sie am Ende haben, ist viel hässlicher und oft schwerer zu verstehen. Es gibt Polymorphismus-Code überall in den X-Server Interna, und Mann, ist es flüchtig und seltsam und häufig schwer zu verfolgen.

Ich arbeite auch viel mit GNOME-Technologien wie GTK + und Clutter, die alle mit dem GObject-System in C geschrieben sind. GObject ist wie das C++ - Objektsystem, bei dem das Nice-Cover entfernt und alle hässlichen Interna freigelegt sind. Normalerweise sind ein halbes Dutzend Codezeilen erforderlich, um das zu tun, was ein einzeiliger C++ - Methodenaufruf tun würde. Ich schreibe gerade einige ClutterActors und während die Mathematik wirklich interessant ist, denke ich ständig: "Das alles wäre in C++ so viel prägnanter und verständlicher.".

Ich denke auch oft: "Weißt du, wenn ich dies in C++ anstelle von C schreiben würde, wäre ich draußen im Wohnzimmer und würde MythBusters mit meiner Frau zuschauen, anstatt um 21 Uhr in meinem Büro zu sitzen . "

41
Bob Murphy

C++ ist ungefähr so ​​schnell wie C (einige Dinge sind schneller, andere langsamer) und bietet bessere Abstraktionen und Organisation. Klassen funktionieren ähnlich wie primitive Typen, sodass große Mengen an Code verwendet werden können, ohne dass dies berücksichtigt wird. Operatorüberladung und Vorlagen ermöglichen das Schreiben von Code, der besser funktioniert, wenn sich die Datendarstellung ändert. Ausnahmen können eine einfachere Fehlerbehandlung ermöglichen. Der Compiler kann verwendet werden, um beim Kompilieren weitere Informationen zu überprüfen.

Der Preis, den Sie dafür zahlen, ist eine ziemlich unangenehme Lernkurve, und es ist einfacher, subtile Fehler darin zu machen als in den meisten anderen Sprachen, die ich kenne.

Ich kann also nicht sagen, ob es sich für Sie lohnt, es für das zu lernen, was Sie gerade tun. Sie können sicherlich mit Kombinationen von Python oder Perl und C) auskommen, aber C++ bietet sowohl Abstraktion als auch Leistung in einem schwer zu gewöhnenden Paket.

29
David Thornley

Ich betrachte C++ als eine Sprache der neunziger Jahre, eine Sprache vergangener Zeiten.

Damals war es groß, weil es übergeordnete Sprachkonstrukte und -mechanismen zu geringeren Leistungskosten anbot. Es war das universelle Werkzeug für die Entwicklung von Adressbuchanwendungen bis hin zu Avionik-Software, und das inspirierte die OO Begeisterung. OOP hat Hunger und AIDS gelöst, und ja, ich beschuldige C++, mich Ende der 90er Jahre einer Gehirnwäsche unterzogen zu haben, als ich anfing zu programmieren, dass eine Nicht-OO-Sprache es nicht wert ist, gelernt zu werden.

Jetzt, da die Hardware so weit fortgeschritten ist und neuere, moderne Sprachen aufgetaucht sind, sehe ich C++ nicht als relevante Wahl für die meisten Anwendungsprogramme, außer für rechenintensive Software, für die Sie noch eine gewisse Abstraktion benötigen (Spiele, Physiksimulationen, CAD). Systeme usw.). Selbst letzteres kann vermieden werden, wenn Sie eine kompakte, modulare Engine in C schreiben und eine übergeordnete Anwendungslogik an eine übersichtliche Skriptsprache delegiert haben.

Wenn Sie auf das Metall zurückgreifen müssen, verwenden Sie C vernünftig, und wenn Sie auf hohem Niveau arbeiten müssen, tun Sie dies in einer modernen Sprache, die keine Kapselung ankündigt, während Sie jedes Byte durch einen Zeiger frei ändern können.

28

Laut Linus , nein:

Als ich mir Git-Quellcode zum ersten Mal ansah, kamen mir zwei Dinge seltsam vor: 1. Pure C im Gegensatz zu C++. Keine Ahnung warum. Bitte sprechen Sie nicht über Portabilität, es ist BS.

[~ # ~] du [~ # ~] bist voller Scheiße.

C++ ist eine schreckliche Sprache. Es wird schrecklicher durch die Tatsache, dass viele minderwertige Programmierer es verwenden, bis zu dem Punkt, an dem es viel einfacher ist, damit totalen und völligen Mist zu erzeugen. Ehrlich gesagt, selbst wenn die Wahl von C nichts tun würde , aber die C++ - Programmierer fernhalten würde, wäre dies an sich ein großer Grund, C zu verwenden.

Mit anderen Worten: Die Wahl von C ist die einzig vernünftige Wahl. Ich weiß, dass Miles Bader scherzhaft sagte "um dich wütend zu machen", aber es ist tatsächlich wahr. Ich bin zu dem Schluss gekommen, dass jeder Programmierer, der das Projekt lieber in C++ als in C haben möchte, wahrscheinlich ein Programmierer ist, den ich wirklich lieber pissen würde aus, damit er nicht kommt und irgendein Projekt vermasselt, an dem ich beteiligt bin.

C++ führt zu wirklich sehr, sehr schlechten Designentscheidungen. Sie beginnen ausnahmslos damit, die "Nice" -Bibliotheksfunktionen der Sprache wie STL und Boost und anderen totalen und völligen Mist zu verwenden, der Ihnen beim Programmieren "helfen" kann, aber Folgendes verursacht:

  • unendlich viel Schmerz, wenn sie nicht funktionieren (und jeder, der mir sagt, dass STL und insbesondere Boost stabil und tragbar sind, ist so voll von BS, dass es nicht einmal lustig ist)

  • ineffiziente abstrahierte Programmiermodelle, bei denen Sie zwei Jahre später feststellen, dass einige Abstraktionen nicht sehr effizient waren, aber jetzt hängt Ihr gesamter Code von allen Nice-Objektmodellen ab, und Sie können ihn nicht reparieren, ohne Ihre App neu zu schreiben.

Mit anderen Worten, die einzige Möglichkeit, gutes, effizientes und portables und portables C++ zu erstellen, besteht darin, sich auf alle Dinge zu beschränken, die in C grundsätzlich verfügbar sind. Wenn Sie Ihr Projekt auf C beschränken, bedeutet dies, dass die Leute das nicht vermasseln und bedeutet auch, dass Sie eine Menge Programmierer haben, die tatsächlich Probleme auf niedriger Ebene verstehen und nichts mit einem idiotischen "Objektmodell" -Dreck vermasseln.

Es tut mir leid, aber für etwas wie Git, bei dem Effizienz ein vorrangiges Ziel war, sind die "Vorteile" von C++ nur ein großer Fehler. Die Tatsache, dass wir auch Leute verärgern, die das nicht sehen können, ist nur ein großer zusätzlicher Vorteil.

Wenn Sie ein VCS möchten, das in C++ geschrieben ist, spielen Sie mit Monotone. Ja wirklich. Sie verwenden eine "echte Datenbank". Sie verwenden "Schöne objektorientierte Bibliotheken". Sie verwenden "Schöne C++ - Abstraktionen". Und ehrlich gesagt, als Ergebnis all dieser Designentscheidungen, die für einige CS-Leute so ansprechend klingen, ist das Endergebnis ein schreckliches und nicht zu wartendes Durcheinander.

Aber ich bin sicher, es würde dir mehr gefallen als nur Schwachsinn.

      Linus
21
Jeremy Heiler

Ich glaube nicht, dass es einen zwingenden Grund gibt, C++ zu verwenden. Wenn Sie OO) programmieren möchten, können Sie stattdessen Python] verwenden und die Teile, die eine schnelle Leistung benötigen, in C schreiben.

BEARBEITEN: Es gibt andere Sprachen, die sich gut mit C verbinden lassen. Wenn Sie Python nicht mögen, gibt es Alternativen.

18
Larry Coleman

Gibt es einen Grund, C++ zu verwenden? Bestimmt.

Einige Leute bevorzugen vielleicht einfach verwenden C++ gegenüber anderen Optionen. Zu fragen, ob es einen Grund gibt, C++ zu verwenden, ist wie zu fragen, warum wir Hunderte von Eissorten brauchen. Nicht jeder mag es einfach, bei Vanille zu bleiben.

Wenn Entwickler bereits sehr kompetent mit C++ sind, lautet die Frage für sie möglicherweise nicht "Warum verwenden?", Sondern "Warum nicht?". Es scheint diese trendige Anti-C++ - Sache in SO im Moment) zu geben, aber ob Sie es glauben oder nicht, nicht jeder abonniert das. Einige Leute mögen C++ einfach besser als die anderen Sprachen.

Muss C++ für Apps verwendet werden? Natürlich nicht. Diese genaue Frage kann aber auch für jede andere Sprache gestellt werden. Es gibt sehr, sehr wenige Fälle, in denen eine bestimmte Sprache für eine Anwendung verwendet werden muss.

13
GrandmasterB

Ich wechsle nur von C zu C++ und ich denke, der Gewinn ist beträchtlich, auch wenn Sie keine Vorlagen und OOP benötigen.

  • Bessere Speicherverwaltung
  • Stärkeres Typsystem
  • Eine bessere Standardbibliothek
  • Namespaces
  • usw.
12
Oliver Weiler

Ich bin überrascht, dass dies noch niemand erwähnt hat, aber C++ hat uns Referenzen vorgestellt, die fast alle Probleme und Fallstricke von Zeigern lösen:

void ModifyVar(int& var)
{
    var = 5;
}

int test = 4;
ModifyVar(test);

Anstatt:

void ModifyVar(int * var)
{
    *var = 5;
}

int test = 4;
ModifyVar(&test);

Viel sicherer und auch einfacher ... und ohne den Aufwand der Wertübergabe.

8
Nathan Osman

Das Wo und Warum wird normalerweise sein:

  • vertrautheit
  • gewünschte Sprachfunktionen
  • bestimmte Bibliotheken, die Sie verwenden möchten
  • leistungsanforderungen

Für die serverseitige Programmierung können Sie häufig aus einer Vielzahl verschiedener Sprachen auswählen, die kompiliert oder interpretiert werden. Normalerweise hängt die Wahl der Sprache davon ab, auf welcher Plattform Sie oder Ihr Team am effektivsten sind. Oder wenn Sie noch kein Team haben, die Verfügbarkeit von Fähigkeiten auf dem Markt.

Nebenbei bemerkt verstehe ich die Entscheidung für C/C++ nicht wirklich aufgrund der Leistung (nur), da viele Skriptsprachen mit C/C++ erweiterbar sind. Sie profitieren von einer schnellen Entwicklungssprache und der Möglichkeit, die langsamen Teile in C/C++ - Erweiterungen zu migrieren. Natürlich ist es verständlich, wenn Sie Systeme programmieren, bei denen jede Operation zählt, aber in den meisten App-Entwicklungen verstehe ich das nicht.

5
dietbuddha

C++ vs Python vs Perl kann nicht einfach beurteilt werden. Dies hängt vom Projekt und den Anforderungen ab.

C++ verfügt über ein Arsenal an Dienstprogrammen von vor langer Zeit, die auf vielen Plattformen ausgeführt werden. Es ist jedoch schmerzhaft, durch Streams zu laufen, um String an Integer zu übergeben und umzukehren.

C++ hingegen hat schreckliche Probleme mit Abhängigkeiten von Bibliotheken. Sobald Sie etwas in GCC X oder VC++ Y kompiliert haben, können Sie sich nicht darauf verlassen, dass der Code von der nächsten Version dieser Tools ausgeführt wird. Die gleiche Hölle ist unter Windows, die gleiche Hölle ist auch unter Unix.

Perl bezieht seine Kraft aus der Unix-Welt, insbesondere aber als Werkzeug für reguläre Ausdrücke. Dies ist, was es die meiste Zeit verwendet wird. Zusammen mit einigen ziemlich ernsthaften Tools, die selbst Java kann es nicht auf normale Weise tun (siehe Hochladen einer Datei auf einen Webserver)), ist Perl "einfach machen".

Python ist einfach, flexibel und eine dynamische Sprache. Das Skript ist so einfach, dass Sie eine Ganzzahl an eine Funktion senden können. Es erwartet eine Zeichenfolge, aber Sie können ein Ergebnis erzielen! Unerwartet, aber ein Ergebnis. Der Programmierer muss also sehr vorsichtig sein. IDLE bietet einige Debugging-Funktionen, aber wenn Sie TELNET auf ein System oder SSH auf drei Ebenen nach unten übertragen haben und Ihr Problem finden möchten, das Der Debugger wird nicht da sein, um neben Ihnen zu stehen. Aber es kann schnell großartige Mathe-Arbeit leisten.

Java ist ein Ökosystem aus Schlagworten, fremden Technologien und großen Wörtern. Wenn Sie nur eine Datei auf den Webserver hochladen möchten, können Sie dies nur tun, wenn der Server über JSP . Wenn Sie Systembibliotheken oder Systemfunktionen wie Überwachung aufrufen möchten, müssen Sie viel ausgraben. Und vielleicht um JNI und OK zu erreichen ... du denkst dann ... "Warum, Herr?"

Abgesehen davon ist Java ein großartiges Tool für Business-Suiten und Multithreading, es hat mir sehr gut gefallen.

Erstellen Sie schnell ein Programm und zeigen Sie Ihrem Lebenslauf "Oh, ich kenne diese Technologie auch" und Ihrem Chef, der sein will, staunen Sie! Auch wenn die Technologie möglicherweise nicht so benötigt wird ... (OK, Leute, ich hasse das Spring Framework ....)

4
hephestos

Linux? Was ist mit "objektorientiertem Pascal" oder "D"?

Vorschläge:

3
mramirez

Beachten Sie bei der Auswahl einer Sprache, welchen Nutzen Sie aus der Verwendung dieser Sprache ziehen und wie lange es dauern wird, bis Sie sie erhalten.

Die Hauptidee zwischen Sprachen wie python und Perl ist, mehr mit weniger Arbeitszeit, aber mit mehr CPU-Zeit zu erreichen. Tatsächlich werden Sie mehr Zeit damit verbringen, ein python - oder Perl-Skript zu codieren, als es ausgeführt wird, aber Sie verstehen, worum es geht.

Der Vorteil von C/C++ ist, dass sie schnell sind, aber Syntax und starkes Tippen kosten: Sie müssen viel selbst tun, damit der Computer sie beim Kompilieren nicht auswählen muss.

Wenn Sie einen Code erstellen, werden einige Zeilen viel häufiger ausgeführt als andere, und diese Zeilen sind diejenigen, die ein Problem darstellen. Auf der anderen Seite wird der gesamte Rest des Codes, für den Sie viel Zeit aufgewendet haben, viel seltener ausgeführt. Sie haben es vielleicht gehört, aber es ist die berüchtigte 80/20-Regel, und Sie können diese Regel nicht umgehen.

Die Lösung für dieses Problem besteht darin, eine einfachere Sprache zu verwenden (mit einfacher meine ich entwicklerfreundlicher: weniger Tippen, verzögerte Interpretation, viele bereits vorhandene Routinen und andere Dinge usw.), um Ihren gesamten Code zu erstellen.

Sie werden es so schnell tun, als wenn Sie es mit C oder C++ getan hätten, es hätte viel mehr Gehirnschmerzen gekostet.

Ihr Programm wird langsam sein, aber mit einem Profiler isolieren Sie den Teil, der 80% der Zeit ausgeführt wird, und Sie tun dies mit C oder C++.

Durch das Programmieren auf diese Weise haben Sie viel Zeit gespart, und Ihr Programm ist ebenso effizient wie schnell, hat viel weniger Chancen, Speicher zu verlieren, und Sie haben Zeit gespart.

Skriptsprachen wurden entwickelt, um auf der Seite des Entwicklers zu stehen, aber eine Optimierung ist weiterhin möglich. Natürlich können Sie ein Designmuster-Magier oder ein STL-Voodoo oder sogar ein LISP-Krieger und vielleicht ein Haskell-Mönch sein. Aber Sprachen bringen uns dazu, mit Computern zu sprechen. Sprachen sind nicht dafür gemacht, dass wir Computer sind!

3
jokoon

Das C++, das ich benutze, heißt C mit Klassen!

2
willspeak

Nein überhaupt nicht. Wenn Sie die Leistung nicht benötigen und es eine Bibliothek gibt, können Sie die andere Sprache verwenden, dann kümmern Sie sich nicht um C/C++. Ich mache es heutzutage nur, wenn ich auf eingebettete Systeme abziele, die (einfach?) Keine Sprachen ausführen können. Manchmal benutze ich C, weil ich ein Plugin schreibe, aber wirklich nein.

Ich würde jedoch Python, Perl usw. nicht verwenden, um die Verwendung von C zu vermeiden. Meine Präferenz ist eigentlich C #, da ich eine gute Bibliothek (die eine Stärke von .NET ist) und statisch typisierte Sprachen mag. Boo ist eine gute Alternative. Aber wirklich Haskell , OCaml , D , ML und solche sind alle in Ordnung.

0
user2528

Es gibt tatsächlich eine einzige Antwort auf alle Fragen, die sich so ergeben. Der beste Grund, Tech X anstelle von Tech Y zu verwenden (wobei X und Y ungefähr auf dem gleichen Niveau liegen [wie fast alle modernen Programmiersprachen]), ist, dass Sie X bereits kennen und Y nicht kennen.

(aber nachdem Haskell angekommen ist, gab es keinen Grund mehr, etwas anderes zu verwenden)

0
vegai