Frage

bemerkte ich einige nicht so alt VM Sprachen wie Lua, NekoVM und Trank in C geschrieben.

Es sah aus wie sie viele C ++ Funktionen wurden neu implementieren.

Sie haben einen Vorteil, sie in C anstatt C zu schreiben ++?

War es hilfreich?

Lösung

Ich weiß etwas über Lua.

  • Lua ist in reinen ANSI Standard C geschrieben und kompiliert auf jeder ANSI-Plattform ohne Fehler und keine Warnungen. So Lua läuft auf fast jeder Plattform in der Welt , einschließlich solcher Dinge wie Canon Powershot-Kameras . Es ist viel schwieriger zu bekommen C ++ auf seltsame kleine Embedded-Plattformen ausgeführt werden.

  • Lua ist eine High-Performance-VM, und da C nicht Methodenaufrufe zum Ausdruck bringen kann (was virtuell sein könnte oder auch nicht) und Betreiber Überlastung, es ist viel einfacher, die Leistung von C-Code zur Vorhersage nur durch Blick auf den Code. C ++, vor allem mit der Template-Bibliothek, macht es ein wenig zu einfach, Ressourcen zu verbrennen, ohne es zu wissen. (Eine vollständige Implementierung von Lua, die nicht nur VM aber Bibliotheken paßt in 145K von x86 Objektcode. Die ganze Sprache paßt sogar in einer kleinen 256K Cache, die Sie bei L2 finden auf Intel i7 und L1 auf älteren Chips. Es sei denn, Sie wirklich wissen, was Sie tun, es ist viel schwieriger, C ++ zu schreiben, die dieses klein.)

  • etwas kompilieren

Das sind zwei gute Gründe, eine VM in C zu schreiben.

Andere Tipps

  

Es sah aus wie sie viele C ++ Funktionen wurden neu implementieren.

Sind Sie vorschlag es einfacher ist, Polymorphismus in C ++ zu implementieren, anstatt C? Ich glaube, Sie sind sehr falsch.

Wenn Sie eine VM in C ++ schreiben, würden Sie nicht Polymorphismus in Bezug auf C ++ 's Polymorphismus implementieren. Sie würden Ihre eigene virtuelle Tabelle rollen, die Funktionsnamen Zeiger abbildet, oder so ähnlich.

Menschen bis C verwendet werden, muss ich zugeben, dass ich eher C für meine eigenen Projekte zu schreiben, obwohl ich seit cfront 1.0 C ++ geschrieben.

Wenn Sie die vollständige Kontrolle über die Dinge wollen, ist C ein wenig leichter.

Eine offensichtliche Antwort ist die Interoperabilität. Jedes Mal, Sprache X hat Funktionen in Sprache Y definiert rufen Sie in der Regel sicher, dass entweder X oder Y C (die Sprache C, das ist)

C ++ wird nicht definiert, ein ABI, so C ++ Code Aufruf aus einer anderen Sprache ein bisschen schwierig ist portabel zu machen. Aber C-Code Aufruf ist fast trivial. Das bedeutet, dass zumindest einen Teil Ihrer VM wird wahrscheinlich in C gehen zu müssen geschrieben, und warum dann nicht in Einklang steht und die ganze Sache in C schreiben?

Ein weiterer Vorteil von C ist, dass es einfach ist. Jeder kann es lesen, und es gibt viele Programmierer Sie es schreiben zu helfen. C ++ ist, für gut und schlecht, viel mehr von einer Experten-Sprache. Sie können eine Menge eindrucksvoller Dinge in C ++ tun, und es kann Ihnen eine Menge Arbeit sparen, aber es gibt auch wenige Programmierer, die es wirklich gut sind.

Es ist viel schwieriger „gut“ in C ++ zu sein, und bis man es gut ist, wird sie eine Menge Bugs und Probleme hat. Nun, vor allem, wenn bei großen Projekten mit vielen Leuten zu arbeiten, die Chance, dass eine von ihnen nicht gut genug sein wird, ist viel größer, so Codierung das Projekt in C ist oft weniger riskant. Darüber hinaus gibt es Portabilitätsprobleme - C-Code ist viel einfacher zu Port über Compiler als C ++

.

Lua hat auch viele Funktionen, die sehr einfach in Lisp zu implementieren, also warum es nicht nehmen, dass als Grundlage? Der Punkt ist, dass C ist wenig mehr als verherrlichter Assembler Code mit nur einer dünnen Schicht der Abstraktion. Es ist wie ein etwas poliert unbeschriebenes Blatt, auf das Sie Ihre höhere Ebene Abstraktionen aufbauen können. C ++ ist ein solches Gebäude. Lua ist ein anderes Gebäude, und wenn es C ++ Abstraktionen zu verwenden hat, hätte es seine Absicht, um die bestehenden C ++ Struktur biegen. Ausgehend von dem leeren Schiefer Ihnen stattdessen gibt die Freiheit, es zu bauen, wie Sie wollen.

In vielen Fällen Code in C könnte viel schneller als C ++ sein. Zum Beispiel der meisten Funktionen in der stdio.c Bibliothek sind schneller als Iostream. scanf ist schneller als cin, printf ist schneller als cout etc.

und VMs verlangt hohe Leistung, so C-Code durchaus Sinn macht, obwohl die Programme höchstwahrscheinlich länger dauern würden zu entwickeln.

C ++ ist in C implementiert Ich vermute, jeder wurde nach dem C ++ Ansatz.

Auch wenn modern C ++ Compiler überspringt (oder zu verbergen), um die expliziten C ++ C Übersetzung als diskreten Schritt, die Sprache C ++ hat Besonderheiten, die von der zugrunde liegenden C-Implementierung stammen.

Zwei Beispiele.

  • Pointers zusätzlich zu den Referenzen ist völlig wegen C. Referenzen sind ausreichend, und das ist die Art und Weise Java, Python und Ruby alle arbeiten.

  • Die Klassen sind nicht erstklassige Objekte, die während der Laufzeit existieren, weil die Klasse nur ein Weg, um die Attribute und Methodenfunktionen in dem zugrunde liegenden C-Code zu definieren. Klassenobjekte existieren zur Laufzeit in Java, Python und Ruby und manipuliert werden können.

Nur eine Randnotiz, sollten Sie in CLR aussehen (Rotor-Inkarnation) und Java-Sourcen und Sie werden feststellen, es weit mehr C ++ - wie-C eher als modern oder gut C ++. So hat es eine Parallele gibt, und es ist ein Nebeneffekt für Spielzeug zu abstrahieren und es durchschnittlich Leistungs glücklich für das Publikum in verwalteten Sprachen zu machen.

Es hilft auch Tücke der naiven Nutzung ++ C zu vermeiden. Ausnahmen und all andere Art von Dingen (Bits David bei Boost-Beratung begannen und mehr, während wir Sequenzern und Audio-Sampling bauen, bevor er auch nur einen Job hatte :) sind ein Thema auch ..

Python Integration ist eine andere Sache, und hat eine schmutzige Geschichte in Schub zum Beispiel .. Aber für primitive Datentypen und Schnittstellen / Interop und Maschinen Abstraktion, gut es ist ganz klar, nichts geht C. Keine Compiler gibt entweder, und es immer noch Schopf aus dem Sumpf Sie viele Dinge, bevor sie irgendetwas so einflussreich erhalten, wie es ist / war / sein wird.

Stepanov erkannte diese Leistung, wenn er STL genagelt, und Bjarne genagelt es mit Vorlagen .. Das sind die drei Dinge immer über eine Überlegung wert, da Sie nicht eine anständige Inkarnation von ihnen in der populären verwalteten Sprachen haben, nicht auf diese expressivness und Macht. All das mehr als 20 Jahre später, das über C / C ++ .. Legacy of Güte bemerkenswert ist und alle Bootstrap noch (aber ich bin nicht ‚dunkle Zeitalter‘ C-Code zu verteidigen c1982-2000, nur die Idee, yuo kann alles mißbrauchen ).

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