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 ++?
Antworten:
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. JavasArrays.sort
Funktion gibt es in mehreren Varianten. Eines von ihnen sortiert beliebige Objekte und erfordert die Übergabe einesComparator
Objekts, das ähnlich wie der Funktionszeiger in Cs funktioniertqsort
. Für die "nativen" Java-Typen gibt es jedoch noch mehrere Überladungen. Und jeder von ihnen hat eine eigene Kopie dersort
Methode - eine schreckliche Code-Vervielfältigung.Java veranschaulicht hier eine allgemeine Zweiteilung: Entweder haben Sie eine Codeduplizierung oder Sie verursachen einen Laufzeit-Overhead.
In C ++
sort
funktioniert die Funktion ähnlich wieqsort
in 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 ++ -
sort
Funktion die von C übertrifft,sort
auch 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.
quelle
Arrays.sort
Implementierungen). 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.vector.push_back
fürvector<int>
und einen anderen für)vector<float>
. Bei der Arbeit mit einemvector<int>
gibt es jedoch kaum einen Grund, warum sich dervector<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 - ImplementierungenIch 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:
Wenn ich die Farbe interpoliere ("Gouraud" -Schattierung genannt, wobei die Felder "Rot", "Grün" und "Blau" durch einen Schrittwert bei jedem Pixel interpoliert werden):
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:
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!
..und dann haben Sie eine Funktion ...
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.green
bei der Berechnung von "dgreen" zugreife? Der Compiler hat es Ihnen sicherlich nicht gesagt.Dann gibt es überall Wiederholungen - die
for
Schleife 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:
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:
Das heißt, die aufzurufende Funktion wird basierend auf dem Typ festgelegt. Zur Kompilierzeit!
So formulieren Sie es erneut:
WorkOnPixel
Versionen Funktionszeiger verwendet, ist der C ++ - Code SCHNELLER als C, da der Compiler die typspezifischeWorkOnPixel
Schablonenspezialisierung 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*
,strcmp
und Makros, stattstd::string
und 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.
quelle
RAII für das Win Baby.
Im Ernst, die deterministische Zerstörung in C ++ macht Code ohne jeglichen Overhead viel klarer und sicherer.
quelle
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.
Die Textverarbeitung in C ++ ist um Größenordnungen schmerzfreier als in C.
quelle
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 verschiedenengoto
Elementen 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."
quelle
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.
quelle
restrict
wird 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?T (&arr)[n]
oder ermöglicht, was noch untersuchtstd::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.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.
quelle
Laut Linus nein:
quelle
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.
quelle
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.
quelle
Ich wechsle nur von C zu C ++ und ich denke, der Gewinn ist beträchtlich, auch wenn Sie keine Vorlagen und OOP benötigen.
quelle
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:
Anstatt von:
Viel sicherer und einfacher ... und ohne Wertverlust.
quelle
Das Wo und Warum wird normalerweise sein:
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.
quelle
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 ....)
quelle
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!
quelle
Linux? Was ist mit „objektorientierten Pascal“ oder „D“?
Vorschläge:
quelle
Das C ++, das ich benutze, heißt C mit Klassen!
quelle
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.)
quelle
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.
quelle