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 ?
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.
Coole .Net Bibliotheken.
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.
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.
quelle
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,
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.
quelle
String foo,bar;
der gegebenen Anweisungfoo=bar;
zwei Anweisungen ausgeführt - ein Registerladevorgang und ein Registerspeicher. Konstante Ausführungszeit unabhängig von der Stringlänge. Kann C ++ nahe kommen?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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle