Frage

Ich habe versucht zu verstehen, wie Ruby-Blöcke funktionieren, und um das zu erreichen, habe ich versucht, sie in C zu implementieren.

Eine einfache Möglichkeit, Abschlüsse zu implementieren, besteht darin, a zu übergeben void* zum umschließenden Stapel zum Abschluss/zur Funktion, aber Ruby-Blöcke scheinen auch Returns und Break-Anweisungen aus dem Bereich zu verarbeiten, der den Block verwendet.

loop do
  break i if (i >= 4000)
  i *= 2
end

Ich denke, einer der Schließungsvorschläge für Java funktioniert auch so.

Wie würden Sie also Ruby-Blocks/Java-Closures in C implementieren?

War es hilfreich?

Lösung

Das Konzept der Abschlüsse erfordert das Konzept der Kontexte.Der Kontext von C basiert auf dem Stapel und den Registern der CPU. Um also einen Block/Abschluss zu erstellen, müssen Sie in der Lage sein, den Stapelzeiger auf korrekte (und reentrant) Weise zu manipulieren und Register nach Bedarf zu speichern/wiederherstellen.

Die Art und Weise, wie dies durch Interpreter oder virtuelle Maschinen erreicht wird, besteht darin, eine zu haben context Struktur oder etwas Ähnliches verwenden und den Stapel und die Register nicht direkt verwenden.Diese Struktur verfolgt einen Stapel und optional einige Register, wenn Sie eine registerbasierte VM entwerfen.Zumindest ist dies die einfachste Möglichkeit (wenn auch etwas weniger leistungsfähig als die tatsächliche Zuordnung der Dinge).

Andere Tipps

Ich habe nichts davon tatsächlich umgesetzt, also nehmen Sie es mit Vorsicht.

Ein Abschluss besteht aus zwei Teilen:die Datenumgebung und die Codeumgebung.Wie Sie sagten, können Sie wahrscheinlich ein void* übergeben, um Verweise auf Daten zu verarbeiten.Sie könnten wahrscheinlich setjmp und longjmp verwenden, um die nichtlinearen Kontrollflusssprünge zu implementieren, die der Ruby-Break erfordert.

Wenn Sie Abschlüsse wünschen, sollten Sie wahrscheinlich in einer Sprache programmieren, die diese tatsächlich unterstützt.:-)

AKTUALISIEREN:In Clang passieren interessante Dinge.Sie haben einen Prototyp eines Verschlusses für C entwickelt. http://lists.cs.uiuc.edu/pipermail/cfe-dev/2008-August/002670.html könnte sich als interessante Lektüre erweisen.

Im Rahmen des Kurses „Rails with Passion“ gibt es eine Reihe guter Folien zu Ruby Blocks:

Ruby_Blocks.pdf

Dies umfasst die Darstellung eines Blocks, die Art und Weise, wie ihnen Argumente übergeben und ausgeführt werden, und noch weitergehende Dinge wie Proc-Objekte.Es ist sehr klar erklärt.

Dann könnte es von Interesse sein, sich anzusehen, wie die JRuby-Leute damit bei der Analyse nach Java umgegangen sind.Schauen Sie sich die Quelle an Codehaus.

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