Managed Coders vs Native Coders

19

Ich bin ein Programmierer und habe Erfahrung mit nativem und verwaltetem Code. Ich habe mit Pascal und C angefangen, bin dann zu C ++ und schließlich zu C # übergegangen.

In den letzten Jahren habe ich fast ausschließlich in C # codiert und viel von dem verloren, was früher als C ++ - Codierer natürlich war.

Als ich mich vor ein paar Wochen hinsetzte, um nativen C ++ - Code zu schreiben, fingerte ich herum, als ich mich langsam mit den Komplexitäten, Macken und Eigenheiten des Ganzen vertraut machte. Es ist mir fast peinlich zu sagen, dass ich völlig vergessen habe, dass die Übergabe eines dynamisch zugewiesenen Arrays an eine Funktion ohne die Übergabe seiner Größe bedeuten würde, dass die Empfangsfunktion nicht wissen kann, wie lang das Array ist.

Es gibt unzählige Artikel und Dokumente, die verwalteten und nicht verwalteten Code vergleichen und gegenüberstellen. Wir alle wissen, dass nativer Code, wenn er gut optimiert ist, erheblich schneller und leichter ausgeführt werden kann als verwalteter Code. Auf der anderen Seite verfügt verwalteter Code über Garbage Collectors und eine CPU-spezifische und betriebssystemspezifische Laufzeitoptimierung, die dem nativen Code einen Run für sein Geld geben können.

Rein technisch gesehen gibt es keinen klaren Sieger.

Es besteht kein Zweifel, dass verwalteter Code um Größenordnungen einfacher zu codieren und zu verstehen ist. Schauen Sie sich nur die Unterschiede in der Anzahl der Zeilen an, die zum Erstellen einer einfachen GUI in Win32 C ++ und C # erforderlich sind.

Damals schrieb ich hauptsächlich mathematische Simulationen, die auf Supercomputern liefen. Sie hatten hässliche CLIs und waren größtenteils algorithmisch ausgerichtet. Heutzutage schreibe ich in C # und produziere schöne GUI-Anwendungen, aber ich würde verloren gehen, wenn ich in einer Muttersprache etwas Ähnliches machen müsste. Selbst mit einem Framework wie QT würde es immer noch doppelt so lange dauern, etwas in C ++ / QT zu produzieren, als dies in C # der Fall wäre.

Immer wenn ich jemanden sehe, der eine umfangreiche GUI-Anwendung mit vollem Funktionsumfang in C / C ++ geschrieben hat, kann ich nicht anders, als Ehrfurcht und einen Hauch von Eifersucht zu empfinden.

Ich bin gespannt, wie andere erfahrene Programmierer verwaltete und nicht verwaltete Sprachen sehen. Sehen Sie verwalteten Code als amateurhaft an ? Sehen Sie native Codierer als Hardcore ?


quelle

Antworten:

26

Mein Tagesjob ist derzeit in C ++, aber ich habe lange genug in mehreren Sprachen programmiert, dass ich kaum noch einen Unterschied bemerke. Hier sind meine Beobachtungen:

  • Viele der angeblichen Ineffizienzen bei anderen Sprachen werden von C ++ - Programmierern häufig als Best Practices neu implementiert. Wir fügen genügend Nullprüfungen, Array-Begrenzungsprüfungen, Typprüfungen, Eingabevalidierungen usw. hinzu, um etwaige Vorteile in Bezug auf die Ausführungsgeschwindigkeit zu negieren, die durch die Sprache erzielt werden, die diese Dinge nicht automatisch ausführt, zumindest für Code, der nicht datenverarbeitungsintensiv ist.
  • Diese zusätzliche Kochplatte wird nach einer Weile zur Gewohnheit, so dass es sich nicht wirklich nach zusätzlicher Arbeit anfühlt und wie ein schmerzender Daumen herausragt, wenn sie fehlt.
  • Wenn ich in einer "verwalteten" Sprache programmiere, denke ich immer noch über die Speicherzuordnung nach, um sicherzustellen, dass kein Speicherverlust auftritt. Ich kann nicht explizit angeben delete, bin mir aber immer noch bewusst, zu welchem ​​Zeitpunkt der Garbage Collector der Ansicht ist, dass er zum Löschen berechtigt ist. Es war schwieriger als jemals zuvor, Probleme mit wenig Arbeitsspeicher in C ++ zu lösen, da es in C ++ sehr viel schwieriger ist, sie sehr lange zu ignorieren.
  • Gleiches gilt für die dynamische Eingabe. Ich muss immer noch im Kopf behalten, ob ein Funktionsparameter ein Array, ein Int oder ein String ist. Tatsächlich erfordert es mehr geistige Anstrengung, da der Typ für mich nicht eindeutig angegeben ist.
  • Der moderne C ++ - Stil unterscheidet sich stark von der Vor-C # -Ära. Anstatt die Sprache zu ändern, "entdeckten" die Benutzer, wie vorhandene C ++ - Funktionen auf einzigartige Weise verwendet werden können, um einen Großteil der früheren grundlegenden Speicherverwaltung zu vermeiden. Entwurfsmuster, die automatisch Speicher freigeben, sind heute weit verbreitet.
  • So weit ich weiß, sind Grafikdesigner wie QT Designer die am meisten bevorzugte Methode, obwohl es möglich ist, GUI-Anwendungen nur durch Schreiben von Code zu erstellen. Code wird meist nur für Event-Handler oder Laufzeitanpassungen verwendet.
  • Sprachen, die Sie längere Zeit nicht mehr verwendet haben, fühlen sich immer etwas ungeschickt an, auch wenn Sie sich hauptsächlich an die Syntax erinnern. Wenn ich ein Jahr lang kein Python schreibe, habe ich eine Menge Besonderheiten vergessen, und es fühlt sich eine Weile unangenehmer an als C ++, obwohl die meisten Leute Python objektiv für die "einfachere" Sprache halten.

Durch die Kombination all dieser Faktoren bleibt mein mentales Modell ziemlich konsistent, wenn ich in C ++ und anderen Sprachen programmiere, und die Unterschiede fühlen sich meistens nur syntaktisch an. Zugegeben, ein Großteil davon ist das Ergebnis von Training, Gewohnheiten, Codierungsstandards und modernen Designmustern, anstatt Eigenschaften, die für die C ++ - Sprache selbst typisch sind, aber der Vergleich bleibt bestehen.

Ich vermute, ich versuche zu sagen, dass die Ausbildung des Programmierers meiner Erfahrung nach einen viel größeren Unterschied macht als die Sprache, die er verwendet.

Karl Bielefeldt
quelle
20

Sehen Sie verwalteten Code als amateurhaft an? Sehen Sie native Codierer als Hardcore?

Nein.

Ich sehe die Unterschiede zwischen einem Ingenieur und einem Programmierer. Der Hardcore- Ingenieur wählt immer die Sprache / den Tech-Stack aus, die / der geeignet ist, um die Arbeit in kürzester Zeit bei einem akzeptablen Laufzeitstandard zu erledigen.

Mit Prozessorleistung in diesen Tagen, die Häufigkeit der tatsächlich benötigt so viel wie Sie aus einer Maschine kann man mit der niedrigeren Niveau mit, Muttersprachen werden immer weniger und weniger. Normalerweise gibt es dafür einfach keinen Business Case. Die Produktivität wird immer ein paar Millisekunden Unterschied in der Ausführungszeit übersteigen.

Demian Brecht
quelle
+1 aber denken Sie daran, dass dies ein wirtschaftlicher Effekt ist - wenn ein Rechenzyklus 1 Million US-Dollar kosten würde, würde eine extreme Optimierung die Regel sein - oder wir würden uns überhaupt nicht um Computer kümmern ...
Gary Rowe
10
mit der Ausnahme, dass wir insgesamt eine geringere Leistung feststellen - Word6 läuft wie eine Beleuchtung auf moderner Hardware, Word2010 benötigt nur eine Minute zum Laden. Heute brauchen wir diese superschnelle Hardware, um mit den Programmierern mithalten zu können!
gbjbaanb
2
@gbjbaanb: Egal welche Programmierer wählen, jede ausreichend große Codebasis wird langsam sein. IIRC, Word ist immer noch in C ++ geschrieben (und ich würde wetten, dass ein erheblicher Teil des gesamten älteren Word 6-Codes noch vorhanden ist).
Steven Evers
2
@gbjbaanb, Word 2010 ist keine direkte Neuschreibung von Word 6 in .NET. Es bietet viel mehr Funktionen und muss viel mehr Nutzungsszenarien bewältigen. Es ist eine sehr viel größere Anwendung als Word 6.
Mircea Chirea
6

Leider hat Microsoft uns dazu gebracht, "Managed Code" mit den C # /. Net-Klassenbibliotheken zusammenzuführen.

Hier spielen sich zwei getrennte und fast unabhängige Dinge ab.

  1. Coole .Net Bibliotheken.

  2. Verwalteter Code.

C # bietet beides in einem übersichtlichen, unterstützten und benutzerfreundlichen Paket zu einem Preis.

C ++ hat zahlreiche coole Bibliotheken, die fast alles können, was .Net kann. Anstatt "nativen C ++" -Code als "komplexer, eigenwilliger und eigenwilliger" als C # / .Net-Code zu bezeichnen, könnten Sie nach besseren C ++ - Bibliotheken suchen.

Mit besseren Bibliotheken können Sie auch guten C ++ - Code schreiben.

Immer wenn ich jemanden sehe, der eine umfangreiche GUI-Anwendung mit vollem Funktionsumfang in C / C ++ geschrieben hat, kann ich nicht anders, als Ehrfurcht und einen Hauch von Eifersucht zu empfinden

Schlechte Politik. Stattdessen sollten Sie herausfinden, welche Bibliotheken von Klassendefinitionen sie verwendet haben. Auch Sie könnten diese Bibliotheken benutzen.

Es dreht sich alles um die Werkzeuge. Ohne Werkzeug sind wir nur Tiere in Hosen.

"Native C ++" bedeutet nicht, dass Sie alle Ihre Werkzeuge wegwerfen sollten. Man muss also gute Werkzeuge finden. Microsoft hilft Ihnen nicht mehr, daher müssen Sie viel Zeit darauf verwenden, den richtigen Werkzeugmix zu finden.

S.Lott
quelle
+1 für "Finde heraus, was sie verwenden", aber ehrlich gesagt finde ich das nicht sehr schön für Tiere, die Werkzeuge verwenden oder gelegentlich Hosen tragen.
Ian Pugsley
@ Ian Pugsley: Die Tiere, die Hosen tragen, aber keine Werkzeuge benutzen, sind wahrscheinlich mit ihrem Status als Tiere einverstanden. Aber Sie haben Recht, dass die Tiere mit Werkzeug ohne Hose verärgert sein könnten. Meine Frau zum Beispiel zieht es vor, keine Hosen zu tragen, und benutzt Werkzeuge. Vielleicht liest sie diese Frage nicht.
S.Lott
Wir können nur hoffen (und auf die ziemlich hohen Chancen wetten). Ich will nur nicht auf ein Tier herabblicken, das klug genug ist, um eine Hose anzuziehen ... nur für den Fall.
Ian Pugsley
Ja, anders als die Standardbibliothek von C # ist C ++ alt und es fehlen moderne Anforderungen (GUI, coole Netzwerkschnittstelle usw.).
Moshe Revah
Microsoft unterstützt Sie erneut bei C ++ in Windows 8 (die gesamte Windows 8-Entwicklungsoberfläche ist systemeigener Code, und C ++ ist neben C # und JavaScript ein erstklassiger Bürger): msdn.microsoft.com/en-us/library/windows/ apps /…
Zach
5

Hier geht es nicht um Hardcore-Programmierung oder ähnliches, sondern um Kontrolle. Tatsache ist, dass C # Produktivität zu Kontrollkosten bietet. Wenn Sie ein Programm schreiben, das viel Kontrolle benötigt (dieser Speicher wird gerade freigegeben), müssen Sie C ++ verwenden. Wenn Sie es schnell erledigen müssen, müssen Sie möglicherweise C # verwenden. Das Problem ist, dass die unterstützenden Bibliotheken für C # viel besser und aktueller sind als für C ++. Zum Beispiel ist MFC sehr, sehr alt und seine Praktiken sind bekanntermaßen schrecklich. Sie wurden meistens lange vor der Standardisierung geschrieben. Wenn Microsoft einige Anstrengungen unternimmt, um beispielsweise neue C ++ - Bibliotheken bereitzustellen, überprüfen Sie die neue PPL in Visual Studio 2010, und seltsamerweise wird diese Aufgabe in C ++ einfach. Und ich denke, dass sie auf diese Weise migrieren,

Auf der anderen Seite verfügt verwalteter Code über Garbage Collectors und eine CPU-spezifische und betriebssystemspezifische Laufzeitoptimierung, die dem nativen Code einen Run für sein Geld geben können.

Ich habe viele Befürworter von verwalteten Sprachen dies sagen hören, aber ich habe es so gut wie nie als wahr angesehen. Tatsache ist, dass die neuen CPU-Anweisungen, die in neueren CPUs verfügbar sind, nur dann einen so großen Vorteil bieten, wenn Sie sehr hardcore-mathematisch arbeiten. In diesem Fall können Sie sich den Aufwand nicht leisten, sie beim Ausführen kompilieren oder interpretieren zu müssen -Zeit und Sie könnten einfach Intels C ++ - Compiler verwenden, um die neueste und beste Version von SSE zu verwenden. Der Umfang der C ++ - Compileroptimierungen ist im Vergleich zu den Möglichkeiten des JIT enorm, da das JIT während der Ausführung des Programms in einem Bruchteil der Zeit ausgeführt werden muss, während C ++ - Compiler legendär dafür sind, dass sie sich die Zeit zum Kompilieren nehmen.

Garbage Collection ist keine magisch großartige Sache oder so etwas - es ist eine Algorithmus-Wahl. Ist es für alle Situationen geeignet? Betrachten Sie bei weitem nicht das IDisposable-Chaos in C # und wie Java sich nicht einmal die Mühe gemacht hat, dieses Problem zu lösen, während die Destruktoren von C ++ Ihre Dateien schließen und Ihren Speicher freigeben und Ihre Sockets usw. schließen. Für einige Programme ist GC großartig und nicht für einige andere.

DeadMG
quelle
Es gibt mehr Unterschiede zwischen Prozessoren als bei SIMD - obwohl Ihr C ++ - Compiler die Pipeline wahrscheinlich genauso berücksichtigt wie Ihre JIT.
Peter Taylor
In einer Laufzeitumgebung, in der es möglich ist, den Systemstatus zu untersuchen und jede nicht festgelegte Objektreferenz zu identifizieren , die jemals erreichbar sein könnte, können viele GC-bezogene Kosten auf eine Weise amortisiert werden, die in C ++ nicht möglich ist. In Java oder C # werden mit String foo,bar;der gegebenen Anweisung foo=bar;zwei Anweisungen ausgeführt - ein Registerladevorgang und ein Registerspeicher. Konstante Ausführungszeit unabhängig von der Stringlänge. Kann C ++ nahe kommen?
Supercat
2

Meiner Meinung nach sieht natives C / C ++ im Vergleich zu C # wie Assembler für C / C ++ aus. Eine weitere komplexe Abstraktionsebene (nicht ganz richtig, aber sagen wir mal so) erleichtert die Entwicklung, verringert jedoch die Geschwindigkeit und führt zu einer übermäßigen Speichernutzung. So, wie ich es sehe, wird es nur in verschiedene Kategorien aufgeteilt, wodurch neue Untertypen von Programmierern entstehen.

Übrigens: C # ist unglaublich schnell, Microsoft hat hervorragende Arbeit geleistet.

Petr Abdulin
quelle
2

Es gibt amateurhafte Programmierer, keine amateurhaften Sprachen. Sprachen, die sie alle haben (zumindest die meisten von ihnen), haben ihren Zweck.

Derzeit arbeite ich an einem Motor zur Versicherungsberechnung, der zum Testen des Produktionssystems verwendet wird. Das Produktionssystem wurde in C erstellt, unsere Engine wurde in Java erstellt und seit längerer Zeit übertreffen wir die C-Engine und sind gleichzeitig viel produktiver. Nicht weil Java per se schneller ist als C, es ist nur schnell genug und unsere Algorithmen sind besser, wir haben sie einfacher implementiert, wir könnten unseren Code schneller und besser testen und umgestalten.

Ich habe auch Testcode geschrieben, um die Berechnungsergebnisse mit dem Inhalt der Produktionsdatenbank zu vergleichen: nicht in C, nicht in Java, sondern in Ruby. Auch hier ist es schnell genug und benötigt viel weniger Code, sodass es einfacher zu implementieren, zu testen und zu erweitern ist.

Und ich fühle mich nicht amateurhaft, egal welche Sprache ich benutze, ich fühle mich nur so, wenn ich einen dummen Fehler mache, der nicht hätte passieren dürfen.

Tomasz Stanczak
quelle
1

Letztes Jahr hat die Firma, bei der ich arbeite, einen Kommunikations-CRC-Code mit brachialer Gewalt zurückentwickelt (wir haben ihn schließlich bekommen). 3 Entwickler hatten jeweils eine eigene Version, Borland C, C # .Net 2008, VB6. VB6 war offensichtlich langsam, Borland C war schnell, aber das C # .net peitschte es nur um das Zwölffache der Geschwindigkeit. War nicht das, was wir erwartet hatten.

Craig White
quelle
1
Verwenden sie Schritt für Schritt denselben Algorithmus? Sie könnten die gleiche Ausgabe berechnen, aber die elementaren mathematischen Schritte, die verwendet werden, um zur Ausgabe zu gelangen, könnten unterschiedlich sein, und die Leistung wird durch die Rohzahl der Elementarschritte bestimmt, die wiederum davon bestimmt wird, wie die "Formel" in sie zerlegt wird.
rwong
Ein älterer C-Compiler verwendet möglicherweise nicht die neuesten Prozessoranweisungen (dh SSE2 und höher)
GrandmasterB
1
Alle drei Sprachen werden zu optimiertem nativem Code kompiliert (VB6 / C ++ während der Kompilierung, .NET während der JIT). Sie messen also wahrscheinlich die Unterschiede zwischen Ihren Programmierern und nicht zwischen den Programmiersprachen.
Nikie
@nikie JIT! = Zusammenstellung. Und die Qualität der Compiler ist unterschiedlich. Ich habe gesehen, dass genau derselbe Algorithmus in C ++ (keine API-Aufrufe, nur Array-Referenzen, Schleifen und einfache Arithmetik) viel schneller ausgeführt wird als in Java, trotz aller Diskussionen über JIT.
quant_dev
1
@quant_dev: Meiner Erfahrung nach gibt es keine Silberkugel ;-) Meine Erfahrung mit .NET JIT ist, dass der Unterschied zwischen JIT und MSVC ++ sehr gering ist. Ich bezweifle sehr 12x in beiden Richtungen für den gleichen Code.
Nikie
1

Es hängt von einer Mischung von Dingen ab, aber im Grunde genommen ist nativer Code, wenn alles andere gleich ist, mehr "hardcore" als verwalteter Code.

Ich denke, das ist normalerweise eine schlechte Sache für eine normale Geschäftsanwendung, weil es bedeutet, dass der durchschnittliche Entwickler mehr mentale Energie in nicht-geschäftliche Aspekte seines Codes stecken muss.

John Bickers
quelle
1

Mein Programm könnte am besten als C ++ wie Java beschrieben werden. Meiner Meinung nach können Sie dieselbe Programmierung auf niedriger Ebene in Java erreichen, aber es ist viel schwieriger als die Programmierung auf niedriger Ebene in C ++. In der Regel benötigen Sie diese einfache Programmierung jedoch nur für einen kleinen Teil Ihres Codes, und wenn dies nicht erforderlich ist, ist eine verwaltete Sprache produktiver.

Peter Lawrey
quelle
1

Einheimische Entwickler haben normalerweise den Ruf, mehr Hardcore zu sein, weil sie mehr Hardcore fühlen und so handeln. Native Entwickler sind in einem System geschult, das keine Fehler toleriert, da dies unweigerlich zu schweren Abstürzen oder unbegrenzten Speicherverlusten führt. Insbesondere erlaubt .NET faule Hacks wie Try / Catch um alles herum, was den Entwickler davon abhält, zu glauben , dass er das Kernproblem verstehen muss (" Manchmal löst es einfach eine InvalidOperationException aus. Ich kann es nicht erklären, lasst uns einfach alles erfassen. Dies Code ist kritisch! "). Das ist überhaupt nicht schwarzweiß, aber meine Beobachtungen sind in der nicht verwalteten Welt aufgewachsen und arbeiten jetzt ganztägig in verwaltetem Code.

Darüber hinaus haben verwaltete Entwickler in der Regel Zugang zu weitaus saubereren und besser organisierten BCLs. Dies ermutigt sie oft, herauszufinden, was tatsächlich unter der Decke passiert. Das Gleiche kann man zum Beispiel für STL oder Boost sagen, aber die .NET-Klassenbibliothek ist oft gut genug, um uns manchmal intellektuell faul zu machen.

Das Schreiben eines guten, versandfähigen verwalteten Programms erfordert jedoch viel Arbeit. Dies bedeutet, dass Speicher- und CPU-Profile, Komponententests und Code-Analysen auf ähnliche Weise durchgeführt werden, wie dies nicht verwaltete Entwickler tun. Nicht verwaltete Entwickler tendieren dazu, dies zu verstehen, und verwaltete Entwickler tendieren dazu, mehr von denen einzuschließen, die dies nicht tun.

Wieder nicht schwarz und weiß. Es gibt viele intellektuell faule, nicht verwaltete und hardcore-verwaltete Entwickler. Keiner ist per definitionem mehr Elite als der andere.

Kevin Hsu
quelle
0

Sehen Sie verwalteten Code als amateurhaft an? Sehen Sie native Codierer als Hardcore?

Es gibt eine Lücke zwischen den beiden Welten und ich kann nicht verstehen, warum: verwaltete Systeme sind irgendwo in nativem Code geschrieben (als letztes läuft alles "in Assembly"). Was ich (noch in meinem Leben) sehen möchte, ist ein Anwendungskonstruktionssystem, bei dem alle Unteraufgaben der Anwendung in der richtigen Sprache geschrieben werden.

ern0
quelle
Ein Anwendungskonstruktionssystem, wie Sie es beschreiben, ist nur eine andere (und hoffentlich bessere) Programmiersprache.
David Thornley
Ich kenne .NET nicht, aber AFAIK ist ein System mit gemischten Sprachen, das ein gemeinsames ausführbares Format hat, das von einer VM ausgeführt wird, und eine umfangreiche Bibliothek, die mit jeder .NET-Sprache verwendet werden kann. Ein gleiches System wäre schön in der nativen / kompilierten Welt. Natürlich plattformunabhängig.
ern0
0

Nativer Code wurde einfacher, seit Go veröffentlicht wurde. Ich finde es einfacher zu lesen und zu schreiben als Java und C #. Obwohl die GUI-Programmierung mit Go derzeit nicht sehr nett ist (ich habe einen kurzen Blick auf die Optionen geworfen).
Versuchen Sie, es nicht daran zu messen, dass es im Vergleich zu C # (zum Beispiel) an einer großen Community und einer Vielzahl von Bibliotheken mangelt , da es immer noch als neu angesehen wird.

Moshe Revah
quelle