Frage

Ich bin ein Dolmetscher einer einfachen Programmiersprache entwickeln.

  1. Es gibt baumstrukturierten dynamischen Daten , wobei jedes der Datenknoten ein zugehöriges hat (im Besitz) type-Objekt .
  2. Es gibt verschiedene Arten der Typen - Listtype, StructType usw. - und eine besondere - TypeRef . Der TypeRef hält einen Namen (ein String), die bis zu einem gewissen konkreten Typ verweist.
  3. Es ist eine (fast) Weltkarte (Wörterbuch) - Ich nenne es die Umwelt -. (std::map<string, Type*>), die Typ-Namen in Typ-Objekte übersetzt

Das Problem ist, dass es möglicherweise mehrere Programme geladen werden und jeder von ihnen könnten verschiedene Arten mit den gleichen Namen zugeordnet. Diese einzige Annahme macht es unmöglich, eine globale (statische) Umwelt zu haben, die sonst eine perfekte Lösung wäre.

Daher scheint es, dass ich brauche entweder (# 1) einen Zeiger auf eine Umgebung, in jedem Typ-Objekt oder (# 2) jede Operation in Zusammenhang mit der Umgebung (zB durchzuführen, indem es überall als erstes Argument bereitstellt ).

Die Probleme, die ich sehe:
(# 1) Information Redundanz, da alle angeschlossenen Datenknoten würde die gleiche Umgebung haben. Umgebungen würde nur für streng getrennte Daten unterschiedlich sein.
(# 2) Eine Menge trivialer Vergehen der Umwelt zu Subroutinen, den Code verschleiern.

Es scheint mir, dass dieses Problem ein allgemeines Muster übereinstimmt ich nennen würde fast statische Daten . Irgendwelche Ideen, was wäre die beste Lösung?

War es hilfreich?

Lösung 3

Die Idee der Verwendung von lokalen Thread-Speicher ist interessant, aber ich habe schließlich mit einer anderen Lösung am Ende:

verwende ich die Typen in zwei Phasen: Zunächst sind sie alle erstellt und dann werden sie „kompiliert“. Compilation erfordert eine Umgebung, sondern wird nur einmal durchgeführt. Es besteht alle Typ-Namen in der richtigen Art-Objekte zu übersetzen. Nach der Zusammenstellung ist nicht die Umwelt mehr benötigt werden.

Dennoch denke ich, es ist noch eine Abhilfe als eine allgemeine Lösung.

Andere Tipps

Was trennt die Umgebungen? Wenn es der Ausführungskontext ist (Objekte in einem Kontext Einzigen, die in diesem Zusammenhang nennen), dann könnten Sie pro Umwelt einen Thread verwenden und speichern Sie das „local-Globals“ in einem Thread-lokale Speichern (oder nur eine globale Karte mit den Tasten wobei Thread-IDs).

Dies hat einige Nachteile. Zum einen funktioniert es nicht, wenn es Quer Zusammenhang Anrufe. Und natürlich ist es zwingt Sie in ein Gewindemodell.

Sie möchten vielleicht zwei Typ Speicher haben - ein global für Betone, eine lokale für TypeRefs. Die lokale Speicher soll in Zusammenhang mit einem Programm gesetzt wird zur Zeit analysiert werden.

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