Frage

Ich bin meine eigene Skriptsprache in C # zu schreiben, mit einigen Features Ich mag, und ich wählte MSIL als Ausgabe des Bytecode zu verwenden (Reflection.Emit sehr nützlich ist, und ich nicht eine andere Bytecode haben ausdenken). Es funktioniert, gibt ausführbare Datei, die ausgeführt werden können (auch mit Reflektor dekompilierten :)) und ist recht schnell.

Aber - ich mehrere ‚Prozesse‘ in einem Prozess + ein Thread, und steuern ihre zugewiesenen CPU-Zeit manuell (auch implementieren wesentlich robuster IPC, die von .NET Framework angeboten wird) ausgeführt werden soll Gibt es eine Möglichkeit, um vollständig zu deaktivieren JIT und erstellen Sie eigene VM, Schritt Befehl-after-Anweisung .NET Framework (und Steuerspeichernutzung, etc.), ohne Notwendigkeit, etwas auf eigene Faust zu schreiben, oder dies zu erreichen, muss ich schreiben ganze MSIL interpretieren?

EDIT 1): Ich weiß, dass die Interpretation IL nicht das schnellste, was im Universum ist:)

EDIT 2): Um klären - ich mag, dass mein VM eine Art ‚Betriebssystem‘ sein - es wird eine CPU-Zeit erhält und teilt es zwischen Prozessen steuert Speicherzuweisung für sie, und so weiter. Dabei spielt es keine schnell sein müssen, noch wirksam, aber nur ein Proof of Concept für einige meiner Experimente. Ich brauche nicht sie zu verarbeiten jede Anweisung auf der Ebene umzusetzen - wenn dies von .NET getan werden sollte, ich werde nicht Geist, ich möchte nur sagen:. Eine Anweisung, und warten, bis ich zum nächsten zu Schritt gesagt

EDIT 3):. Ich erkennen, dass ICorDebug vielleicht meine Bedürfnisse erfüllen kann, jetzt bei der Implementierung von Monos Laufzeit sucht

War es hilfreich?

Lösung

könnten Sie Mono - Ich glaube, dass eine Option ermöglicht die IL statt JITting sie zu interpretieren . Die Tatsache, dass es Open-Source-Mittel (genehmigungs), die Sie sollten sie ändern können nach Ihren Bedürfnissen, auch.

Mono haben nicht alle .NET-Funktionalität zwar - aber es können zu tun alles, was Sie benötigen

.

Andere Tipps

Beachten Sie, dass MSIL entworfen wurde durch einen JIT-Compiler analysiert werden. Es ist nicht sehr geeignet für einen Dolmetscher. Ein gutes Beispiel ist vielleicht der ADD-Befehl. Es wird verwendet, um eine Vielzahl von Werttyp Werte hinzuzufügen: byte, short, int32, int64, ushort, uint32, uint64. Ihr Compiler weiß, welche Art von Add erforderlich ist, aber Sie werden diese Art Informationen verlieren, wenn die MSIL zu erzeugen.

Jetzt müssen Sie es zurück zur Laufzeit finden und das erfordert auf dem Auswertungsstapel die Typen der Werte zu überprüfen. Sehr langsam.

Eine leicht interpretiert IL hat gewidmet ADD Anweisungen wie ADD8, ADD16, etc.

Microsofts Implementierung der Common Language Runtime hat nur ein Ausführungssystem, das JIT. Mono, auf der anderen Seite kommt sowohl mit, ein JIT und ein Dolmetscher.

ich aber nicht vollständig verstehen, was genau Sie wollen sich selbst tun und was Sie möchten Microsofts Implementierung verlassen:

  

Gibt es eine Möglichkeit, um vollständig JIT zu deaktivieren und eigene VM erstellen?

und

  

... ohne Notwendigkeit, etwas auf eigene Faust zu schreiben, oder dies zu erreichen, muss ich ganze MSIL interpretieren schreiben?

ist eine Art widersprechen.

Wenn Sie denken, können Sie ein besseres Ausführungssystem als microsofts JIT schreiben, werden Sie es von Grunde auf neu zu schreiben. Beachten Sie jedoch, dass beide microsofts und Monos JIT sind hoch Compiler optimiert. (Programmiersprache Schießen)

Die Möglichkeit, CPU-Zeit für die Betriebssystemprozesse zu planen, ist genau das nicht möglich, von Benutzermodus. Das ist die Betriebssysteme Aufgabe.

Einige Implementierung von grünen Fäden könnte eine Idee sein, aber das ist auf jeden Fall ein Thema für nicht verwalteten Code. Wenn das, was Sie wollen, haben einen Blick auf die CLR-Hosting-API.

Ich würde vorschlagen, Sie versuchen, Ihre Sprache in CIL zu implementieren. Immerhin, es wird zu Rohx86 zusammengestellt nach unten. Wenn Sie nicht über Prüfbarkeit kümmern, können Sie Zeiger verwenden, wo nötig.

Eine Sache, könnte man erwägen tun wird Code in einem Zustand-Maschine-Stil zu erzeugen. Lassen Sie mich erklären, was ich damit meine.

Beim Generator Methoden in C # mit yield return schreiben, wird das Verfahren in einen inneren IEnumerator Klasse kompiliert, die eine Zustandsmaschine implementiert. Der Code des Verfahrens ist in logische Blöcke zusammengestellt, die mit einer Ausbeute Rückkehr oder yield break-Anweisung beendet werden, und jeder Block entspricht einem nummerierten Zustand. Da jede yield return muss einen Wert bereitzustellen, wobei jeder Block endet, indem ein Wert in einem lokalen Bereich zu speichern. Die Enumeratorobjekt, um seinen nächsten Wert zu erzeugen, ruft eine Methode, die auf der aktuellen Zustandsnummer in der Reihenfolge einer giant switch-Anweisung besteht darin, den laufenden Block zu laufen, dann ist der Zustand vorrückt und gibt den Wert des lokalen Feldes.

Ihre Skriptsprache seine Methoden in einem ähnlichen Stil erzeugen könnte, in dem ein Verfahren zu einem Objekt Zustandsmaschine entspricht, und die VM ordnet Zeit durch die Zustandsmaschine zugeteilt während der Zeit voran. Ein paar kniffligen Teile dieser Methode. Dinge wie Methodenaufrufe Implementierung und try / finally Blöcke sind härter als straight-up MSIL Erzeugung

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