Frage

Warum kann nicht ein compiler geschrieben werden, dass verwaltet was sein muss managed in C++ - code (z.B.um es zu machen "CLR-kompatiblen")?

Vielleicht mit einem gewissen Kompromiss, wie das Verbot void Zeiger in manchen Situationen usw.Aber alle diese zusätzlichen keywords etc.Was ist das problem, das gelöst werden muss, indem Sie diese Ergänzungen?

Ich habe meine Gedanken über einige Aspekte und das, was vielleicht schwer zu lösen, aber eine gute Erklärung würde sehr geschätzt werden!

War es hilfreich?

Lösung

Ich würde nicht einverstanden mit den Antworten bisher.

Das größte problem ist zu verstehen, dass ein C++ - compiler erzeugt code, die ist geeignet für eine sehr dumme Umgebung.Auch eine moderne CPU nicht wissen, über virtuelle Funktionen, die Hölle, sogar Funktionen sind eine Strecke.Eine CPU wirklich nicht Sorge, dass die exception-handling-code, um zu entspannen stack ist außerhalb der Funktion, zum Beispiel.CPU-deal im Unterricht Sequenzen, mit Sprüngen und gibt.Funktionen sicherlich keinen Namen haben, soweit die CPU angeht.

Also, alles, was benötigt, um Unterstützung für das Konzept einer Funktion gesetzt wird es von der compiler.E. g.vtables sind nur arrays von der richtigen Größe, mit den richtigen Werten aus der CPUs Sicht. __func__ endet als eine Sequenz von bytes, die in der string-Tabelle, die Letzte ist 00.

Nun, es gibt nichts, sagt der target-Umgebung hat sich dumm.Sie könnte definitiv Ziel für die JVM.Wieder hat der compiler zu füllen, was nicht nativ angeboten.Keine raw-Speicher?Dann reservieren Sie ein großes byte-array und verwenden Sie stattdessen.Keine rohen Zeiger?Nur integer-Indizes in diesem großen byte-array.

Das Hauptproblem ist, dass das C++ - Programm sieht ganz unkenntlich von der hosting-Umgebung.Die JVM ist nicht dumm, er weiß über Funktionen, aber es erwartet die Schüler.Es nicht erwarten, Sie zu haben < und > in Ihrem Namen.Sie können dies umgehen, aber was Sie am Ende mit ist im Grunde name mangling.Und im Gegensatz name mangling heute, diese Art von Namen mangeln ist nicht dafür gedacht, C-linkers aber für intelligente Umgebungen.Also, seine Reflexion Motor kann davon überzeugt werden, dass es eine Klasse c__plus__plus mit member-Funktion __namespace_std__for_each__arguments_int_pointer_int_pointer_function_address, und das ist noch ein schönes Beispiel.Ich will nicht wissen, was passiert, wenn Sie eine std::map von strings to reverse-Iteratoren.

Anders herum ist wirklich viel leichter, im Allgemeinen.So ziemlich alle Abstraktionen in anderen Sprachen werden wegmassiert in C++.Garbage collection?Das ist schon erlaubt in C++ heute, so könnte man unterstützen, die auch für void*.

Eine Sache, die ich gar nicht eingegangen, dennoch ist die Leistung.Emulation der raw-Speicher in ein großes byte-array?Das ist nicht schnell, vor allem, wenn Sie verdoppelt sich in Sie.Sie können spielen, eine ganze Menge tricks, um es schneller zu machen, aber zu welchem Preis?Du bist wahrscheinlich nicht gehen, um einem marktfähigen Produkt.In der Tat könnte man sich mit einer Sprache, die verbindet die schlimmsten Teile von C++ (viele ungewöhnliche Umsetzung-abhängiges Verhalten) mit der schlimmsten Teile einer VM (langsam).

Andere Tipps

Bestehende richtiger Code, das heißt Code geschrieben nach dem C ++ Standard, muss sein Verhalten nicht versehentlich geändert werden.

Nun C ++ / CLI ist vor allem gemeint, ein Klebstoff zwischen verwalteten und nicht verwalteten Code. Als solche müssen Sie die Möglichkeit haben, mangaged ein nicht verwaltete Konzepte zu mischen. Sie müssen in der Lage, verwaltet und unmanged Objekte in dem gleichen Code zuweisen, so gibt es keine Möglichkeit, um getrennte Schlüsselwörter.

Warum können Sie nicht kompilieren native C ++ Code der CLR Targeting?

Ja, Sie ahnen es richtig, gäbe es zu viele Kompromisse sein, dass es nutzlos machen würde. Ich möchte nur drei Beispiele nennen ...

1) Vorlagen. C ++ unterstützt sie, wird die CLR nicht (Generika sind unterschiedlich). So dass Sie nicht die STL verwenden könnten, steigern usw. in Ihrem Code.

.

2) Mehrfachvererbung: unterstützt in C ++, nicht in CLI. Sie konnten nicht einmal den Standard Iostream Klasse und Derivate verwenden (wie string, fstream), die beide erben von istream und ostream.

Fast keiner des Code da draußen würde kompilieren, könnten Sie nicht einmal die Standard-Bibliothek implementieren.

.

3) Garbage collection: Die meisten C ++ Anwendungen verwalten ihre Speicher manuell (mit Smart-Pointer etc.), hat die CLR automatische Speicherverwaltung. So ist der C ++ Stil „neu“ und „Löschen“ wäre unvereinbar mit „gcnew“, C ++ Code nutzlos für diesen neuen Compiler machen existiert.

Wenn Sie alle aus, die wichtigen Merkmale Wurzel müssen, auch die Standard-Bibliothek, und nicht vorhandene Code würde kompilieren ... was ist dann der Punkt?

Vor allem der Unterscheidung zwischen „einfachen C ++“ und „Managed C ++“ beabsichtigt war, weil einer der MC ++ Zwecke eine Brücke zwischen dem bestehenden C ++ Code und CLR zur Verfügung zu stellen war.

Als nächstes gibt es einfach zu viele C ++ Funktionen, die in CLR-Modell passen. Mehrfachvererbung, Vorlagen, Zeiger arithmetics ... Ohne eine klare Linie zeichnet die Programmierer zum Scheitern verurteilt wären kryptische Fehler zu Gesicht, sowohl bei der Kompilierung und Laufzeit.

Ich denke, das liegt daran, dass das Hinzufügen von verwaltetem Code in C ++ kennzeichnet gemacht würde C ++ langsamer und der Compiler komplex. So sehr, dass C ++ verlieren würde, was es für in erster Linie entwickelt wird. Eines der schönen Dinge von C ++ ist, dass es eine schöne Sprache ist, mit zu arbeiten, es ist Low-Level genug und noch etwas tragbar. Und wahrscheinlich ist das, was der C ++ Standard Committee plant, machte es auch so bleiben. Auf jeden Fall glaube ich nicht C ++ immer voll „verwaltet“ werden kann, weil das Programm in C geschrieben bedeuten würde ++ eine VM benötigt auszuführen. Wenn das der Fall ist, warum nicht einfach verwenden C ++ / CLI?

Qt-Framework fast das tut. D. h es hat intelligente Zeiger, die automatisch auf null gesetzt, wenn das Objekt, das sie verweisen zerstört wird. Und nach wie vor ist es ein native C ++, analysiert, nachdem sie von moc (Metaobjekt-Compiler).

Ja, ich nehme an C ++ verwaltet werden könnte. Aber dann müßte .NET neu geschrieben werden für C ++ und nicht mit einer Tendenz zu BASIC. Mit mit vielen Sprachen alle unter dem gleichen Dach. Bestimmte Funktionen haben zu gehen. Es war eine Wahl zwischen VB.NET oder C ++. NET und VB.NET gewählt. Lustig, was ich höre, ist, dass C # populärer als VB.NET ist (obwohl ich weder verwenden!).

Die .NET CLR erfordert, dass kein Hinweis auf ein verwaltetes Objekt, das jemals an jeden Ort der existieren kann die Laufzeit nicht weiß, über, außer während des Objekt fixiert ist; gute Leistung setzt voraus, dass Objekte so wenig wie möglich merken werden. Da die CLR .NET kann nicht alle der Datenstrukturen verstehen, die in C ++ verwendbar sind, ist es zwingend notwendig, dass keine Verweise auf verwaltete Objekte immer in solchen Strukturen beibehalten werden. Es wäre möglich, „normale“ C ++ Code interagieren mit .NET-Code zu haben, ohne Änderungen an der Sprache C ++, aber die einzige Möglichkeit, den C ++ Code, jede Art von „Referenz“ auf alle .NET-Objekte halten könnte, wäre eine etwas zu haben, Code auf der Seite .NET zuweisen jeweils einen Handgriff von einer Art-Objekt, und halten eine statische Tabelle der Objekte mit den Handgriffen verbunden sind. C ++ Code, um die Objekte manipulieren wollte würde dann den .NET-Wrapper fragen müssen, um eine Operation auf das durch einen Griff identifiziertes Objekt auszuführen. Hinzufügen der neuen Syntax macht es möglich, dass der Compiler die Arten von Objekten das .NET Framework zu identifizieren, müssen wissen, über und durchzusetzen, die notwendigen Einschränkungen auf sie.

Das erste, was zu prüfen ist, Alles, was c++ „schnell“ verschwinden macht. ein vollständiges Speicherbereinigungssystem in C ++ ist nahezu unmöglich. weil c++ Sie Zeiger fast überall im Code haben. Laufzeittypinformationen werden teuer, wenn nicht direkt in die integrierten Langauge System selbst ein. Sie können die Vorteile der wahren native Performance nehmen. Vorlage wird verschwinden. echte Zeiger wird verschwinden. direkter Zugriff auf dem Speicher ist weg.

Liste der Dinge, die durchgesetzt werden müßten

1. no direct pointers(pointers will get replace with complex refernces)
2. templates (generics pay for preformance)
3. simple c-style arrays (will get wrapped with array structures)
4. programmer no longer has control of whether data is on the stack or
the heap.
5. garbage collection will be enforced(this will cause the most changes to the syntax)
6. runtime type data will get added extensively to the code.
(larger code size)
7.  inlining will become more difficult for the compiler
(no more inline key word)
8. no more inline assembly.
9. the new langauge by now will become incompatible c code.(unless you go through hoops) 

Ich bin mit 5hammer! Wenn ich Java und andere verwalteten Sprachen hinterließ, die nicht umsonst ist: das ist die volle Kontrolle über den Computer zu haben, zu verwalten Arbeitsspeicher Speicher selbst, habe Kontrolle darüber, wie der Computer meinen Code ausgeführt wird, integrieren mit C-Bibliotheken (wie Lua). Wenn ich diese Flexibilität verlieren, dann würde ich nur C ++ verlassen und zurück zu C fallen, und wenn C zu verwaltet wird, dann würde ich auf Assembler gehen.

Managed Sprachen sind die schlimmsten, die jemals für alle Spieleplattformen / komplexe Programme, wie sie Sie in einigen kine von Sandbox ohne direkten Zugriff auf die Hardware sind begrenzt, und sind viel langsamer als kompilierte Sprachen.

Der Hauptzweck des C ++ war immer Performence gewesen. Es ist eines der besten Sprache für große Spiele. Und ohne diese Sprache performences viele Spiele nicht existieren würde!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top