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


164

Als Linux-Entwickler (auf der Serverseite) 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 ++?


5
Ich betrachte C ++ nur wegen STL.
Dan_waterworth

46
So kann etwas, das mit C, Perl und Python zusammen gemacht werden kann, nur mit C ++ gemacht werden. Und Sie fragen, warum Sie C ++ verwenden sollen?
Manoj R

36
«Wenn ich zur Vorstellung gehe, ist die erste und letzte Wahl C.» Ja sicher: D Dies ist eine unbewiesene und trivial falsche Behauptung.
Deadalnix

16
@deadalnix: Das würde ich nicht sagen. C ++ hat komplexe Regeln, die im Optimierer möglicherweise nach hinten losgehen, weil es nicht erlaubt ist, einige Dinge zu tun. Und es ist super einfach, in unsichtbare Performance-Killer einzusteigen. Es ist ziemlich axiomatisch und daher wahr: D In Wirklichkeit ist C ++ - Code manchmal schneller, weil Sie effektivere Algorithmen und Datenstrukturen verwenden und niemand den C-Code tatsächlich optimiert. Wenn C ++ korrekt ausgeführt wird, ist es sicherer und effektiver, und Sie sollten C ++ anstelle von C auswählen, wenn keine Kompatibilitätsprobleme vorliegen oder eine Software mit 100% iger Verfügbarkeit erforderlich ist.
Coder

4
Der beste Grund, der in den veröffentlichten Antworten nicht berücksichtigt wird, bezieht sich direkt auf die Frage des OP. ABHÄNGIGKEITEN !!!! Nicht, dass Ihrem durchschnittlichen System die c ++ - Bibliotheken fehlen, aber ein eingebettetes System verfügt möglicherweise nicht über diese. Der einzige Weg, um Ihr Programm in jedes System zu bekommen, besteht darin, Ihr Programm in regulärem C zu schreiben. Alles andere ist nur eine Debatte darüber, warum Sie C ++ nicht verwenden sollten, oder weniger dargestellt. Nichts davon spricht an, warum C ++ nicht häufiger verwendet wird, und der Grund dafür sind - unabhängig von den Vorteilen - Abhängigkeiten.
JM Becker

Antworten:


308

Wenn ich zur Vorstellung gehe, ist die erste und letzte Wahl C.

Und hier sollten Sie ein Backup durchführen. Nun, ich kann nicht, überhaupt , sprechen für Server - Entwicklung. Vielleicht gibt es in der Tat keinen zwingenden Grund, C ++ den Alternativen vorzuziehen.

Grund für die Verwendung von C ++ anstelle anderer Sprachen ist jedoch 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, zur Laufzeit keinen Performance-Overhead hat.

Dies ermöglicht das Schreiben von sehr effizientem Code, der immer noch einen sehr hohen Abstraktionsgrad 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).

Andererseits bietet C ++ einen Indirektionsmechanismus, der keine (Performance-) Kosten verursacht: Vorlagen. (Dieser Vorteil wird mit einer (manchmal sehr) erhöhten Kompilierzeit bezahlt.)

Betrachten Sie das Beispiel einer generischen Sortierfunktion.

In C qsortübernimmt die Funktion einen Funktionszeiger, der die Logik implementiert, nach der die Elemente relativ zueinander angeordnet sind. Javas Arrays.sortFunktion gibt es in mehreren Varianten. Eines von ihnen sortiert beliebige Objekte und erfordert die Übergabe eines ComparatorObjekts, das ähnlich wie der Funktionszeiger in Cs funktioniert qsort. Für die "nativen" Java-Typen gibt es jedoch noch mehrere Überladungen. Und jeder von ihnen hat eine eigene Kopie der sortMethode - eine schreckliche Code-Vervielfältigung.

Java veranschaulicht hier eine allgemeine Zweiteilung: Entweder haben Sie eine Codeduplizierung oder Sie verursachen einen Laufzeit-Overhead.

In C ++ sortfunktioniert die Funktion ähnlich wie qsortin C, mit einem kleinen, aber grundlegenden Unterschied: Der Komparator, der an die Funktion übergeben wird, ist ein Vorlagenparameter . Das bedeutet, dass sein Aufruf eingebunden werden kann . Es ist keine Indirektion erforderlich, um zwei Objekte zu vergleichen. In einer engen Schleife (wie hier) kann dies tatsächlich einen wesentlichen Unterschied bewirken.

Es überrascht nicht, dass die C ++ - sortFunktion die von C übertrifft, sortauch wenn der zugrunde liegende Algorithmus derselbe ist. Dies macht sich insbesondere dann bemerkbar, wenn die eigentliche Vergleichslogik günstig ist.

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


16
Ich weiß jetzt genug über C ++, um zu wissen, ob Sie richtig oder falsch liegen. Aber auch hinzufügen wollen Sie nur 1 Downvote erhalten, also entspannen Sie sich. Dies ist das Internet und Abstimmungen passieren. Tolle Antwort, wenn es technisch einwandfrei ist!
Chris

46
Kein Performance-Overhead zur Laufzeit - das stimmt nicht immer. Wenn Sie sich STL-Vektorimplementierungen ansehen, werden Sie feststellen, dass sie nicht den Vorteil von realloc () nutzen (dies ist aufgrund von Zeigern und langer Geschichte nicht möglich), wohingegen alle höheren Sprachen, die ich kenne, realloc () verwenden können. ) in Vektorgeräten. Dies ist nur ein Beispiel dafür, dass es nicht so offensichtlich und nur in Schwarzweiß ist.
Mojuba

19
@Jaroslaw, @Steve: Das Gleiche (= Aufblähen des Codes, Fehlschlagen des Befehls-Cache) gilt für handoptimierten Code, der für jeden Datentyp angepasst ist (siehe Javas verschiedene Arrays.sortImplementierungen). Nur Sie verlieren den Vorteil einer hohen Abstraktion. Dies ist kein spezifischer Nachteil von Vorlagen, sondern ein Nachteil der Codeduplizierung im Allgemeinen. Darüber hinaus spielt dies in der Regel keine Rolle, da in engen Schleifen normalerweise immer derselbe Code geladen wird.
Konrad Rudolph

18
@ Jaroslaw: Das Lustige am Anweisungs-Cache ist, dass es sich um einen Cache handelt . Das heißt, es wird nicht versucht, alles zu speichern, sondern nur den zuletzt verwendeten Code . Vorlagen generieren möglicherweise viele ähnliche Codes für verschiedene Typen (einen vector.push_backfür vector<int>und einen anderen für) vector<float>. Bei der Arbeit mit einem vector<int>gibt es jedoch kaum einen Grund, warum sich der vector<float>Code im Anweisungscache befindet. Ich verstehe also nicht, wie das wirklich wichtig ist individuelle Template - Instantiierung ist hoch optimierte und in der Regel mehr kompakter als generisches catch-all - Implementierungen
JALF

29
@ Steve314: Was du als "Aufblähen" bezeichnest, ist das, was für C und Java manuell gemacht wird. In C ++ kann es automatisiert werden, und Compiler können so intelligent sein, wie Anbieter es wagen, sie dazu zu bringen, Aufblähungen zu vermeiden. Wenn ich entscheiden muss, ob ich langsam bin (wie in C) oder doppelten Code verwende (wie in Java), erscheint es mir ziemlich gut, wenn der Compiler die Duplizierung durchführt (und vielleicht schlau darüber ist), nein?
sbi

166

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 ist. Ich denke, der beste Weg, es auszudrücken, ist dieser:

Weniger Code, kein Laufzeitaufwand, mehr Sicherheit.

Je weniger Code wir schreiben, desto besser. Dies zeigt sich schnell bei allen Ingenieuren, die nach Spitzenleistungen streben. Man behebt einen Fehler an einer Stelle, nicht an vielen - man drückt einen Algorithmus einmal aus und verwendet ihn an vielen Stellen wieder usw. Die Griechen haben sogar ein Sprichwort, das auf die alten Spartaner zurückgeht: "Etwas mit weniger Worten zu sagen, bedeutet dass du darüber weise bist ". Tatsache ist, dass Sie sich mit C ++ bei richtiger Verwendung in weitaus weniger Code als mit C ausdrücken können, ohne die Laufzeit zu beeinträchtigen, und dabei sicherer sind (dh mehr Fehler zur Kompilierungszeit abfangen) als mit 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 ("Gouraud" -Schattierung genannt, wobei die Felder "Rot", "Grün" und "Blau" durch einen Schrittwert bei jedem Pixel 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 (ambientLight) oder Farbe (rot / grün / blau) mehr - ich interpoliere einen normalen Vektor (nx, ny, nz) und muss bei jedem Schritt neu einstellen -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;

Jetzt wäre der erste Instinkt von C-Programmierern "Verdammt, schreibe drei Funktionen, die die Werte interpolieren, und rufe sie in Abhängigkeit 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, der effiziente C-Programmierer sagt, benutze eine Vereinigung!

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

..und dann haben Sie 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üren Sie das Chaos?

Zunächst genügt ein Tippfehler, um meinen Code zum Absturz zu bringen, da der Compiler mich im Abschnitt "Gouraud" der Funktion niemals anhält, um tatsächlich auf ".a" zuzugreifen. (Umgebungs-) Werte. Ein Fehler, der nicht vom C-Typ-System (dh während der Kompilierung) abgefangen wird, bedeutet einen Fehler, der zur Laufzeit auftritt und das Debuggen erfordert. Haben Sie bemerkt, dass ich left.a.greenbei der Berechnung von "dgreen" zugreife? Der Compiler hat es Ihnen sicherlich nicht gesagt.

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

Was ist mit dem if / else / ladder für die Modi? Was ist, wenn ich in drei Wochen einen neuen Rendermodus hinzufüge? Werde ich daran denken, den neuen Modus in allen "if mode ==" in meinem gesamten Code zu behandeln?

Vergleichen Sie nun die obige Hässlichkeit mit dieser Menge von C ++ - Strukturen und einer Template-Funktion:

  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 spezifische Typen für jeden Modus. Sie verwenden ihre gemeinsamen Daten (das "x" -Feld) erneut, indem sie von einer Basisklasse ( CommonPixelData) erben . Und das Template lässt den Compiler CREATE (das heißt, Code generieren) die drei verschiedenen Funktionen, die wir selbst in C geschrieben hätten, aber gleichzeitig sehr streng in Bezug auf die Typen sein!

Unsere Schleife in der Vorlage kann nicht fälschen und auf ungültige Felder zugreifen - der Compiler wird bellen, wenn wir dies tun.

Die Vorlage führt die übliche Arbeit aus (die Schleife wird jedes Mal um "step" 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 structs hinzufügen wird - das ist im Grunde diktieren , wie jede Art interpoliert wird.

Und sehen Sie, was wir mit WorkOnPixel <T> gemacht haben? Wir möchten unterschiedliche Arbeiten pro Typ ausführen? Wir nennen einfach eine Template-Spezialisierung:

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 Kompilierzeit!

So formulieren Sie es erneut:

  1. Wir minimieren den Code (über die Vorlage), indem wir gemeinsame Teile wiederverwenden.
  2. Wir verwenden keine hässlichen Hacks, wir halten ein striktes Typensystem ein, damit der Compiler uns jederzeit überprüfen kann.
  3. und das Beste von allem: Nichts von dem, was wir getan haben, hat eine Auswirkung auf die Laufzeit. Dieser Code wird NUR so schnell ausgeführt wie der entsprechende C-Code. Wenn der C-Code zum Aufrufen der verschiedenen WorkOnPixelVersionen Funktionszeiger verwendet, ist der C ++ - Code SCHNELLER als C, da der Compiler die typspezifische WorkOnPixelSchablonenspezialisierung einfügt Anruf!

Weniger Code, kein Laufzeitaufwand, mehr Sicherheit.

Bedeutet dies, dass C ++ das A und O aller Sprachen ist? Natürlich nicht. Sie müssen noch die 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 packen können. Sie werden komplexe Boost -Metaprogramme verwenden, bevor sie erkennen, dass dies nicht erforderlich ist. Sie werden immer noch verwendet werden char*, strcmpund Makros, statt std::stringund Vorlagen.

Aber das sagt nichts mehr als ... schau 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 es einfach nicht.


18
+1 für "nein, nicht einmal Java" :)
Nathan Osman

53
+1 für das Beispiel. Es war ein langer Beitrag, aber der Vergleich zwischen C- und C ++ - Code ist beeindruckend.
Paercebal

Und deshalb, meine Damen und Herren, gibt es Lex / Yacc. Dieselbe Überlegung, ich habe nie realisiert, dass Teile von c ++ in die gleiche Philosophie der Codegenerierung fallen. Ich werde es mir irgendwann noch einmal ansehen müssen.
Spencer Rathbun

2
Ich habe viel 2D-Rendering-Code geschrieben (vor mehr als einem Jahrzehnt) und bin beim Portieren von C nach C ++ auf dieses Problem gestoßen: Wie definieren Sie eine Pixelstruktur, wenn Ihre Scanlinie aus 1-Bit-Pixeln besteht (8 Pixel in ein Byte)? Und wenn Ihre Scanlinie aus R-, G- und B-Bytes besteht (3 Bytes pro Pixel)? Und wenn Sie drei separate Puffer für R, G und B haben? Sie kennen die Antwort: C ++ hilft da nicht weiter, und wenn Sie auf die Verwendung von Vorlagen bestehen, verlieren Sie eine Menge Platz- und Zeitoptimierungen
Walter Tross,

Warum verwenden Sie in C ++ dafür Vorlagen? Ihre Methode deklariert einen Parameter der Basisklasse, so dass es aus Sicht meines [C # -Programmierers] so aussieht, als könnten Sie einfach eine Instanz eines abgeleiteten Typs an einen Parameter des Basistyps übergeben. Ich kenne C ++ nicht, können Sie das bitte erklären?
Vlad

79

RAII für das Win Baby.

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


20
"C ++: Die einzige ernsthaft deterministische Option. Fragen Sie Ihren Arzt noch heute danach."
Kyle Strand

2
Follow-up: Rust ist jetzt ein Anwärter auf diesem Gebiet. Sehen Sie sich ein einfaches RAII-Beispiel und eine Dokumentation zu Rusts Destruktor-Methoden an .
Kyle Strand

1
C wird so deterministisch sein, erfordert aber mehr Arbeit, um sicherzustellen, dass es tatsächlich passiert, wenn malloced Speicher verwendet wird
Baldrickk

1
@Baldrickk In C müssen Sie Bereinigungscode überall dort schreiben, wo Sie eine Ressource verwenden. In C ++ schreiben Sie es einmal in die Definition der Ressource. Sowohl C als auch Java leiden unter Fehlern "Ressource wird nach der Entsorgung verwendet" und "Ressourcenlecks", da die Bereinigung nicht automatisch erfolgt . Der Speicher ist nicht die einzige Ressource.
Caleth

70

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

  1. Vorlagen und die AWL. Sie tauschen ein wenig Erstellungszeit (und einige möglicherweise unverständliche Fehlermeldungen) gegen viele nützliche Abstraktions- und arbeitssparende Tools aus, ohne dass die Laufzeitleistung spürbar beeinträchtigt wird (obwohl der binäre Footprint möglicherweise etwas größer ist).

    Es dauert eine Weile, bis du deinen Kopf umhüllt hast (es hat ein paar Jahre gedauert, bis es geklickt hat), aber wenn du es einmal getan hast, kann es das Leben viel einfacher machen.

  2. Die Textverarbeitung in C ++ ist um Größenordnungen schmerzfreier als in C.


35
+1 für die Textverarbeitung, die ich in meiner Antwort völlig vergessen habe.
Konrad Rudolph

8
Heh fand ich besonders Textverarbeitung schmerzhaft im Vergleich zu sagen wir Python ..
Nils

7
Boost ist der einzige Grund, warum ich immer noch C ++ benutze.
Ferruccio

33
@Nils: Auf einer Skala von 1 bis Pain-in-the-Ass ist die Textverarbeitung in C ++ definitiv schlechter als in moderneren Sprachen wie Python. Es ist nur , dass die Textverarbeitung in C definiert Schmerz-in-the-ass. Wenn die Wahl zwischen C und C ++ für diese bestimmte Anwendung liegt, gewinnt C ++ leicht.
John Bode

8
Ich weiß nicht, warum Menschen solche Schwierigkeiten mit Dingen wie der Textverarbeitung in C / C ++ haben. Benutze einfach eine Bibliothek oder schreibe deine eigene. Sobald Sie die Low-Level-Funktionen (einmalige Schmerzen) geschrieben haben, erhalten Sie eine enorme Leistung, engen Code und größere Flexibilität. Ja, ich werde Python für schnelle / unsaubere Befehlszeilenprogramme verwenden, aber für ernsthaften Produktionscode ist es C / C ++.

41

Ja.

Wenn Sie nach ausführbarer Effizienz suchen, sind Sie bei C oder C ++ angelangt, also werde ich mich darauf konzentrieren.

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

Ich habe polymorphe C ++ - Objekte für alle Arten von interessanten Dingen verwendet. Ich habe zum Beispiel an einem eingebetteten Linux-System mit Frame Buffer-Overlays auf OMAP- und XScale ARM-CPUs gearbeitet. Die beiden Hardwarearchitekturen verfügen über unterschiedliche Overlay-Funktionen mit sehr unterschiedlichen APIs. Ich habe eine allgemeine virtuelle "Overlay" -Basisklasse verwendet, um eine idealisierte Ansicht von Overlays bereitzustellen, und dann "OmapOverlay" - und "XScaleOverlay" -Klassen geschrieben, die zur Laufzeit entsprechend der Architektur instanziiert wurden, auf der der erkannte Code ausgeführt wurde.

Um es zu vereinfachen, ist RAII die Idee, dass Sie Ressourcen, die mit einem Objekt verbunden sind, während des Konstruktors des Objekts oder später im Leben des Objekts zuweisen und die Ressourcen im Destruktor des Objekts freigegeben oder freigegeben werden. Das ist in C ++ sehr schön, da 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 Speicherverluste in C ++ zu vermeiden. Sie sehen auch nicht viel C ++ - Code mit dem sehr gebräuchlichen C-Mem eines Labels am Ende einer Funktion, die einer Reihe von Aufrufen vorangeht free(), und verschiedenen gotoElementen im Funktionsblock, die dorthin springen.

Ich bin mir völlig bewusst, dass Sie all diese Dinge mit C tun 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 in allen X-Server- Interna, und Mann, es ist flüchtig und seltsam und häufig schwer zu finden.

Ich arbeite auch viel mit GNOME-Technologien wie GTK + und Clutter, die alle mit dem GObject-System in C geschrieben wurden. GObject ähnelt dem C ++ - Objektsystem, bei dem die hübsche Abdeckung entfernt und alle hässlichen Interna offengelegt wurden. 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 obwohl 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 ++ anstatt in C schreibe, bin ich mit meiner Frau im Wohnzimmer und schaue MythBusters, anstatt um 21 Uhr in meinem Büro zu sitzen."


9
Ich kann mich wirklich auf das beziehen, was Sie hier sagen, insbesondere auf 1) den Punkt über RAII und 2) den Gedanken "Weißt du, wenn ich dies in C ++ anstatt in C ... schreibe". Ich entwickle viel eingebettete Systeme , und selbst wenn das Team eine Art "C" oder "C mit Klassen" ist, versuche ich RAII wirklich für Dinge wie Interrupt - Manipulation, Mutex - Operationen und Tracing / Logging zu ermutigen (insb. Dinge wie das Umschalten von I / O) Linien). Und Ihre Beschreibung von polymorphen Frame-Puffern hat mich an meine Verwendung von polymorphen Message-Puffern in einem verteilten System erinnert.
Radian

29

C ++ ist ungefähr so ​​schnell wie C (manche Dinge sind schneller, manche langsamer) und bietet bessere Abstraktionen und eine bessere Organisation. Klassen funktionieren ähnlich wie primitive Typen, sodass große Mengen an Code verwendet werden können, ohne dass dies berücksichtigt wird. Überladungen von Operatoren und Vorlagen ermöglichen das Schreiben von Code, der besser funktioniert, wenn sich die Datendarstellung ändert. Ausnahmen können eine einfachere Fehlerbehandlung ermöglichen. Mit dem Compiler können Sie während der Kompilierung weitere Informationen überprüfen.

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

Daher kann ich nicht sagen, ob es sich für Sie lohnt, es für das zu lernen, was Sie gerade tun. Mit Kombinationen aus Python oder Perl und C kommen Sie sicher zurecht, aber C ++ bietet sowohl Abstraktion als auch Leistung in einem schwer zu gewöhnenden Paket.


13
Es gibt keinen Fall, in dem C ++ langsamer ist als C, da Sie den C-Weg immer verwenden können, wenn er schneller ist (und Sie sich darum kümmern).
Jack Aidley

1
@ JackAidley - Außer, dass C ++ keine einschränkenden und statischen Array-Parameter unterstützt. Und mit der Ausnahme, dass die Verwendung des C ++ - Stils an einer Stelle Sie dazu zwingt, ihn an einer anderen Stelle zu verwenden.
Martinkunev

@martinkunev restrictwird verwendet, um Ausschlüsse von Aliasing-Optimierungen zu machen. Wie kann dies helfen, die Dinge schneller zu machen ? und was ist ein "static array parameter"? und wie wirkt sich "Stil" auf die Leistung aus?
Underscore_d

1
@underscore_d einschränken erlaubt Optimierungen, basierend auf einer Garantie für Non-Aliasing; Bei statischen Array-Parametern geht der Compiler davon aus, dass ein Zeigerargument nicht NULL ist und dieser Zeiger auf mindestens eine bestimmte Anzahl von Elementen verweist. Das Wort "Stil" hat mehrere Bedeutungen, und wenn es aus dem Zusammenhang gerissen wird, ändert sich seine Bedeutung. Ich spreche davon, wie beispielsweise Ausnahmen die Verwendung intelligenter Zeiger erzwingen.
Martinkunev

1
@martinkunev Hmm, also frage ich mich, ob ein statischer Array-Parameter irgendetwas anderes als eine C ++ - Vorlage mit einem T (&arr)[n]oder ermöglicht, was noch untersucht std::array<T, n>werden muss, da es nicht viele Informationen gibt. Das macht bei intelligenten Zeigern Sinn, definitiv ein gutes Beispiel. Wenn wir unter gleichen Bedingungen codieren, würden wir keine Ausnahmen verwenden, sodass keine der potenziellen Kosten anfallen würde. Ich vermute jedoch, dass Sie darauf hinweisen, dass, sobald Bibliotheken von Drittanbietern in das Bild eingehen, viele Annahmen getroffen werden sind gefährdet.
Underscore_d

27

Ich betrachte C ++ als eine Sprache der neunziger Jahre, eine Sprache einer vergangenen Ära.

Damals war es groß, weil es übergeordnete Sprachkonstruktionen und -mechanismen zu geringeren Kosten in Bezug auf die Leistung anbot. Es war das universelle Werkzeug für die Entwicklung von Adressbuchanwendungen bis hin zu Avionik-Software, und das hat den OO-Wahnsinn beflügelt. OOP löste Hunger und AIDS, und ja, ich beschuldige C ++, mich Ende der 1990er-Jahre einer Gehirnwäsche unterzogen zu haben, als ich zum ersten Mal programmierte, dass es sich nicht lohnt, eine andere Sprache als OO zu lernen.

Nachdem die Hardware so weit fortgeschritten ist und neuere, moderne Sprachen erschienen sind, sehe ich C ++ nicht mehr als eine relevante Wahl für die meisten Anwendungsprogramme, mit Ausnahme von rechenintensiver Software, bei der Sie noch 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 delegieren.

Wenn Sie auf die Metal-Verwendung C zurückgreifen müssen, und wenn Sie eine höhere Ebene benötigen, tun Sie dies in einer modernen Sprache, die keine Verkapselung ankündigt, während Sie jedes Byte durch einen Zeiger frei ändern können.


11
Ändern Sie also keine zufälligen Bytes mit Zeigern. Das ist doch gar nicht so schwer zu vermeiden, oder?
David Thornley

11
@Blagovest: Ich stimme Ihnen in Bezug auf die Komplexität von C ++ zu und würde es niemals verwenden, um eine objektorientierte Sprache zu ersetzen. Aber trotz seiner Komplexität überzeugt es C für mich immer noch aufgrund seiner vielen Vorteile, die sich in unterschiedlichen Antworten (Abstraktion, Ressourcenhandhabung, String-Handling…) niederschlagen. Tatsächlich haben Sie einige gültige Bereiche benannt, in denen C ++ noch relevant ist und in denen es C.
Konrad Rudolph

6
@Blagovest: Deshalb halte ich mich von den dunklen Ecken fern. Es ist einfacher, in C ++ überfallen zu werden als in jeder anderen Sprache, die ich kenne. Indem ich es benutze, profitiere ich von RAII, einem viel besseren String-Handling als C, den STL-Typ-Template-Klassen, OO-Features und anderen Vorteilen, die es gegenüber C hat.
David Thornley

24
@Blagovest: Nein, das tust du nicht. Was Sie erwähnt haben, reicht beispielsweise nicht aus, um RAII zu erreichen, und die Containerklassen verfügen über Funktionen, die über einfache handgefertigte Datenstrukturen hinausgehen. Wenn Sie das für möglich halten, haben Sie C ++ nie gut gelernt.
David Thornley

5
@ Jaroslaw Ich verstehe nicht, warum Multi-Core-Maschinen OOP ins Grab legen würden. Wenn Sie C ++ meinen, könnte ich sehen, wo Sie herkommen. OOP ist ein grundlegendes Konzept in vielen modernen Programmiersprachen, insbesondere Hochsprachen. Sogar C kann OO sein, wenn Sie es so programmieren. Es ist einfach nicht so bequem wie C ++ IMO.
vedosity

21

Laut Linus nein:

Als ich mir den Git-Quellcode zum ersten Mal ansah, kamen mir zwei Dinge merkwürdig vor: 1. Reines 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. Erschreckender wird es durch die Tatsache, dass viele minderwertige Programmierer es verwenden, bis zu dem Punkt, an dem es viel einfacher ist, totalen und völligen Mist damit zu generieren. Ganz offen gesagt, selbst wenn die Wahl von C nichts anderes tun würde , als die C ++ - Programmierer fernzuhalten, wäre dies an sich schon 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 gesagt hat, er solle dich verärgern, aber das stimmt tatsächlich. Ich bin zu dem Schluss gekommen, dass jeder Programmierer, der es vorziehen würde, dass das Projekt in C ++ statt in C läuft, wahrscheinlich ein Programmierer ist, den ich am liebsten verärgert hätte, damit er kein Projekt vermasselt, an dem ich beteiligt bin mit.

C ++ führt zu wirklich sehr, sehr schlechten Designentscheidungen. Sie fangen ausnahmslos an, die "netten" Bibliotheksfunktionen der Sprache wie STL und Boost und andere totale und völlige Scheiße zu verwenden, die Ihnen beim Programmieren "helfen" können, aber Folgendes verursachen:

  • unendlich viele Schmerzen, wenn sie nicht funktionieren (und jeder, der mir sagt, dass STL und vor allem Boost stabil und tragbar sind, ist so voller BS, dass es nicht einmal lustig ist)

  • Ineffiziente abstrahierte Programmiermodelle, bei denen Sie zwei Jahre später bemerken, dass einige Abstraktionen nicht sehr effizient waren, aber jetzt hängt Ihr gesamter Code von all den netten Objektmodellen ab, die ihn umgeben, und Sie können es nicht reparieren, ohne Ihre App neu zu schreiben.

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

Tut mir leid, aber für so etwas wie git, wo 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 in C ++ geschriebenes VCS möchten, spielen Sie mit Monotone. Ja wirklich. Sie verwenden eine "echte Datenbank". Sie benutzen "nette objektorientierte Bibliotheken". Sie verwenden "nette C ++ - Abstraktionen". Und ehrlich gesagt, als Ergebnis all dieser Designentscheidungen, die für manche CS-Leute so ansprechend klingen, ist das Endergebnis ein schreckliches und unhaltbares Durcheinander.

Aber ich bin mir sicher, dass Sie es mehr als nur Schwachsinn mögen würden.

      Linus

62
Ich denke nicht, dass Linus derjenige sein sollte, der sich hier streiten sollte. Seine Beschimpfungen sind schrecklich subjektiv und unreif. Er hat tatsächlich ein paar gute Punkte, aber sie sind so tief vergraben (unter "Bullshit" sowie Bullshit), dass sie sehr schwer zu finden sind.
Konrad Rudolph

19
Haha, das war ein gutes Lachen. Ich möchte diesen Kerl nie treffen.
Felix Dombek

30
Linus erinnert mich an einen sehr talentierten Dachdecker, der noch nie Sheetrock gehängt hat, aber die Sheetrock-Jungs Stiefmütterchen nennt, weil sie Schrauben anstelle von Nägeln verwenden.
Bob Murphy

8
Linus hat einen Punkt, drückt ihn aber viel zu hart aus, um ernst genommen zu werden.
Blagovest Buyukliev

39
Ich stimme @Daniel zu. Wenn es jemanden gibt, der darüber reden kann, die Grenzen der Hardware zu verschieben, dann ist John Carmack der Schöpfer von Doom, Quake und anderen Spielen und der Gründer von Id-Software. Er schreibt dies vor ein paar Monaten über c und c ++: "IMO, guter C ++ - Code ist besser als guter C-Code, aber schlechtes C ++ kann viel, viel schlimmer sein als schlechter C-Code." twitter.com/#!/ID_AA_Carmack/status/26560399301
Onema

18

Ich glaube nicht, dass es einen zwingenden Grund gibt, C ++ zu verwenden. Wenn Sie OO-Programmierung ausführen möchten, können Sie stattdessen Python verwenden und die Teile, die eine schnelle Leistung erfordern, in C schreiben.

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


3
Was ist mit Embedded-Entwicklung? Python ist nicht immer verfügbar, und der Geschwindigkeitsunterschied zwischen C und gut geschriebenem C ++ ist auf Geräten ab einer bestimmten Rechenleistung vernachlässigbar. Natürlich würde auch ein C ++ - Compiler nicht immer verfügbar sein ...
James

6
@ James "gut geschriebenes C ++" - es gibt den Haken :(
dss539

5
Ich stimme dieser Antwort zu, mache das High-Level mit Python, da du es ungefähr dreimal schneller schreibst, profilierst und dann Engpässe behebst, indem du sie durch C / C ++ ersetzst. Es ist überflüssig, "Engpass durch C ++ - Code ersetzen" zu sagen, da Sie mit dem Code, der schnell sein muss, kein High-Level machen, da es sich um Low-Level-Code handelt. Es gibt eine Sache: Ich weiß nicht, wie ich C ++ mit Python verbinden soll: /. Aber in Bezug auf Zeitaufwand vor dem Bildschirm und Effizienz halte ich das für die beste Lösung, da der Großteil des C ++ - Codes umsonst schnell sein wird!
jokoon

8
Arbeiten Sie für ein großes Finanzunternehmen und bauen Sie in einem großen, verteilten Team in Python ein komplexes Finanzsystem auf, und sehen Sie, wie es Ihnen gefällt. Die Erfahrung wird Sie lehren: a) Vorteile der Typensicherheit, b) Vorteile von Compilern, die Ihren Hintern retten, c) LUDICROUS-Code, den Python Noobs schreiben lässt. Die Leute sagen, dass es einfach ist, mit C ++ Fuß zu fassen -> einige Python-Sachen können funktionieren, sind aber grenzenloser Wahnsinn. Im Moment würde ich so viel lieber in C ++ arbeiten ...
MrFox

1
@suslik: Wow, ich bin schockiert, dass irgendjemand tatsächlich Python für diese Art von System verwenden würde. Ich stimme Ihnen in Bezug auf schlechten Noob-Python-Code zu. Ich habe selbst welche gesehen.
Larry Coleman

13

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

Manche Leute bevorzugen einfach C ++ gegenüber anderen Optionen. Zu fragen, ob es einen Grund für die Verwendung von C ++ gibt, ist wie zu fragen, warum wir Hunderte von Eissorten benötigen. 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 so, als ob es dieses trendige Anti-C ++ -Ding in SO gibt, aber ob Sie es glauben oder nicht, das abonnieren nicht alle. Manche mögen C ++ einfach besser als die anderen Sprachen.

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


12

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 Typensystem
  • Eine bessere Standardbibliothek
  • Namespaces
  • usw.

8

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 von:

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

int test = 4;
ModifyVar(&test);

Viel sicherer und einfacher ... und ohne Wertverlust.


3
Auch viel weniger flexibel. Referenzen (im C ++ - Stil) vereinfachen bestimmte gängige Konstrukte in einer Sprache, die auch Zeiger enthält. Sie sind jedoch noch lange kein Ersatz für Zeiger, und es ist nicht einmal lustig. Und Ihr Beispiel ist überhaupt kein guter Fall für Referenzen.
Ben Voigt

3
@ Ben: Kannst du dann bitte erklären, warum es ein schlechtes Beispiel ist?
Nathan Osman

6
@George: Weil sich nichts geändert hat, außer dass es zwei (Count 'Em) Zeichen kürzer ist? Sie löst keine Probleme, hebt keine Fallstricke hervor und kann nicht einmal die Lebensdauer einer temporären Variablen verlängern (deren Referenzen gut sind).
Ben Voigt

@ Ben: Du vergisst etwas - der Verweis ist immer gültig. Zeiger können auf alles verweisen (einschließlich NULL), was zu allen Arten von Speicherfehlern führen kann, wenn die Dinge nicht richtig gemacht werden. Referenzen können niemals NULL sein und die Adresse, auf die sie verweisen, kann niemals geändert werden.
Nathan Osman

5
@ George: "Die Referenz ist immer gültig" ist einfach falsch. Ich gebe ein Beispiel, wenn Sie eines brauchen, aber ich hoffe, dass Sie Experte genug sind, um sich dessen bereits bewusst zu sein. Und ich spreche auch nicht von der Bildung eines ungültigen Verweises mit einem ungültigen Zeiger. Funktionen, die Zeiger verwenden, benötigen eine Dokumentation, in der die Voraussetzungen für die Argumente angegeben sind. In der Praxis benötigen jedoch alle Funktionen diese Dokumentationsstufe. Es ist also absurd, das als Streik gegen Zeiger zu bezeichnen.
Ben Voigt

5

Das Wo und Warum wird normalerweise sein:

  • Vertrautheit
  • gewünschte Sprachmerkmale
  • bestimmte Bibliotheken, die Sie verwenden möchten
  • Leistungsanforderungen

Bei der serverseitigen Programmierung können Sie häufig aus einer Vielzahl von Sprachen auswählen, die kompiliert oder interpretiert wurden. Normalerweise hängt die Wahl der Sprache von der Plattform ab, auf der 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, ich verstehe die Entscheidung für C / C ++ nicht wirklich auf der Grundlage der Leistung (nur), da viele Skriptsprachen mit C / C ++ erweiterbar sind. Sie profitieren von einer schnellen Entwicklungssprache und der Möglichkeit, langsame Teile in C / C ++ - Erweiterungen zu migrieren. Natürlich ist es verständlich, wenn Sie Systeme programmieren, bei denen jede Aufgabe zählt, aber in den meisten Anwendungsentwicklungen verstehe ich das nicht.


2
Bekanntheit ist der Hauptgrund, und ich bin überrascht, dass Sie es als erster erwähnen.
Paul Butcher

4

C ++ vs Python vs Perl können nicht einfach beurteilt werden. Das hängt vom Projekt und den Anforderungen ab.

C ++ verfügt über ein Arsenal an Dienstprogrammen aus längst vergangenen Zeiten, die auf vielen Plattformen ausgeführt werden. Es ist jedoch schmerzhaft, durch Streams zu laufen, um String nur an Integer zu übergeben und umzukehren.

C ++ hat auf der anderen Seite eine Menge mit Abhängigkeiten von Bibliotheken zu tun. Sobald Sie etwas in GCC X oder VC ++ Y kompiliert haben, können Sie sich nicht mehr darauf verlassen, dass der Code in 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, vor allem aber als Werkzeug für reguläre Ausdrücke. Dies wird die meiste Zeit verwendet. Zusammen mit einigen ziemlich ernstzunehmenden Tools, die selbst Java nicht auf normale Weise ausführen kann (lesen Sie, wie Sie eine Datei auf einen Webserver hochladen), ist Perl "einfach".

Python ist einfach, flexibel und eine dynamische Sprache. So einfach, dass Sie eine Ganzzahl an eine Funktion senden können, erwartet das Skript eine Zeichenfolge, aber Sie können ein Ergebnis haben! Unerwartet, aber ein Ergebnis. Der Programmierer muss also sehr vorsichtig sein. IDLE bietet einige Möglichkeiten zum Debuggen. Wenn Sie jedoch eine TELNET-Verbindung zu einem System oder eine SSH-Verbindung in drei Ebenen hergestellt haben und Ihr Problem finden möchten, ist der Debugger nicht in Ihrer Nähe. Aber es kann schnell eine großartige mathematische Arbeit leisten.

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

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

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


1
Leider müssen Sie berücksichtigen, dass Python Versionsabhängigkeiten hat - besonders wenn Sie auf Python 3 migriert sind, genau wie bei Perl. Oder hat sich jemand die Mühe gemacht, schon auf Perl 6 umzusteigen? Alles hat böse Abhängigkeiten :(
gbjbaanb

3

Beachten Sie bei der Auswahl einer Sprache, welchen Nutzen Sie daraus ziehen und wie lange es dauern wird, diese Sprache zu verwenden.

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

Der Vorteil von C / C ++ ist, dass sie schnell sind, aber zu einem Preis von Syntax und starke Typisierung: Sie viel, was zu tun haben, sich so, dass der Computer nicht bei der Kompilierung zu wählen hat.

Wenn Sie einen Code machen, werden einige Zeilen viel mehr als andere ran, und diese Linien sind die, die ein Problem darstellen. Auf der anderen Seite, der Rest des Codes, diejenige, die Sie viel Zeit auf ausgegeben wird viel, viel weniger häufig ausgeführt. Vielleicht haben Sie es gehört haben, aber es ist die berüchtigte 80/20 Regel, und Sie werden nicht in der Lage sein, eine solche Regel zu umgehen.

Die Lösung für dieses Problem ist eine einfachere Sprache zu verwenden (von einfacher ich meine mehr Entwickler freundlich: weniger tippen, faul Interpretation, viele bereits existierende Routinen und Sachen, etc.) den gesamten Code zu tun.

Sie tun es so schnell im Vergleich zu, wenn Sie es mit C oder C ++ getan hätten, wäre es viel mehr Gehirnschmerzen genommen hat.

Ihr Programm wird langsam, aber mit einem Profiler, isolieren Sie den Teil, der 80% der Zeit lief werden, und Sie tun, um sie mit C oder C ++.

Durch prorgamming diese Weise gespeichert Sie viel Zeit, und das Programm ist so effizient, wie viel schneller, hat viel weniger Chancen, Speicher zu verlieren, und Sie sparte Zeit.

Skriptsprachen wurden auf der Seite des Entwicklers sein entworfen, aber Optimierung ist immer noch möglich. Natürlich kann man ein Design-Muster Zauberer oder ein STL Voodoo oder sogar ein Lisp Krieger, und vielleicht ein Haskell Mönch. Aber Sprachen uns zu Computern reden macht, sind Sprachen nicht für uns gemacht Computern zu SEIN!



2

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


8
Hurra, Sie haben das Schlüsselwort 'class' verwendet. Jetzt verstehst du OO Design!
dss539

Mein C ++ heißt C mit Namespaces.
jsz

6
Mein C ++ heißt, umm .. Manoj's C ++.
Manoj R

+1 Klassen es ist der einzige Grund, warum ich C ++ benutze.
mbq

... ok, auch Ausnahmen.
mbq

0

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 (wo X und Y ungefähr auf dem gleichen Niveau sind [wie es bei fast allen modernen Programmiersprachen der Fall ist]), ist, dass Sie X bereits kennen und Y nicht kennen.

(Aber nachdem Haskell angekommen war, gab es keinen Grund, etwas anderes zu benutzen.)


0

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

Allerdings würde ich Python, Perl usw. nicht verwenden, um C zu vermeiden. Meine Vorliebe ist C #, weil ich eine gute Bibliothek mag (eine Stärke von .NET) und ich statisch typisierte Sprachen mag. Boo ist eine gute Alternative. Aber wirklich, Haskell , OCaml , D , ML und so sind alle in Ordnung.


7
Sie haben den Punkt verpasst.
Matt Joiner

@ Matt Joiner: Ich bin sicher, ich habe nicht. Was habe ich verpasst?

Die Frage ist, ob C ++ nicht verwendet wird.
Matt Joiner

@ Matt Joiner: Hmm, auf einem anderen Blick kann ich sehen, dass gefragt wird. Aber es scheint, als hätte ich auch geantwortet (ich habe gesagt, es stört

Ich möchte dies fast wegen C #
ablehnen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.