2016-07-10 21 views
0

Während der Entwicklungsphase meines Compilers stieß ich auf ein ziemlich komplexes Problem: Wie man schwach typisierte Variablen in meiner Sprache speichert.Methoden zur Speicherung schwach typisierter Variablen

Da ich Variablen deklarieren lassen, ohne ihren Typ explizit anzugeben, und Funktionen erlauben, einen der beiden Typen zurückzugeben (zB Funktion kann ein skalares OR-Array zurückgeben), stehe ich vor der Schwierigkeit, in welcher Form diese Variablen gespeichert werden.

Hier sind die Möglichkeiten, die ich concidered habe, aber alle von ihnen haben einen signifikanten Kopf:

  • Regard alle Variablen wie Listen von Doppel (List<double>) und haben das erste Element festlegen, ob es sich um ein Skalar ist oder Array (0 oder 1 zum Beispiel).
  • Betrachte alle Variablen als object Instanzen.
  • Betrachten Sie alle Variablen als TVar (benutzerdefinierte Klasse), die entweder double oder List<double> sein kann.

im Auge zu behalten:

  • Die nur zwei Arten von Variablen, die ich haben die Absicht, Doppelzimmer und Doppel-Arrays, da alle anderen von einer solchen abgeleitet werden (zB char ist ein Fall von ein doppelt, string ist ein Array von Zeichen, usw.)
  • I ILAsm verwenden, die ein übergeordnetes Geschmack Baugruppe (NET Zwischensprache ist im Grunde)
+0

Der List-of-doubles-Ansatz erlaubt keine Listen von Listen darzustellen. – sepp2k

+0

@ sepp2k Eine Liste von Listen kann man sich als eine mehrdimensionale Liste vorstellen, die ich mit Werten des ersten Index größer als 2 (z. B. 3 -> 3-dimensionales Array/Liste), e.t. –

+0

Floats sind nicht für alle Ganzzahlen genau. JavaScript hat dieses Problem. Alle Zahlen dort sind Schwimmer. – usr

Antwort

1

Das hängt natürlich sehr von Ihrer Sprache ab. Wenn Sie beim Kompilieren keine Variablentypen korrigieren, müssen Sie alle Werte mit Typinformationen umbrechen. (Dies wird manchmal als "Boxen" der Variable bezeichnet, obwohl es nicht die einzige Sache ist, die "Boxen" bedeuten kann.)

Auf der anderen Seite können Sie in der Lage sein, den Variablentyp zum Zeitpunkt der Kompilierung abzuleiten. Beispiel: awk (das trotz seiner vollständigen fehlenden Deklarationssyntax manchmal mit einem Compiler für eine Art von virtueller Maschine implementiert wird) erlaubt sowohl Skalar- als auch Arrayvariablen, aber es ist durchaus möglich, den Typ jeder awk-Variablen herauszufinden:

  1. von der Seite als Funktionsargumente übergeben wird, kann ein Array Variable nicht ohne Index verwendet werden, da keine awk Array Zuordnung ermöglichen. Also muss jede Variable, die mit tiefgestellten Indizes verwendet wird, ein Array sein, und jede Variable, die ohne tiefgestellte Indizes außer dem Aufruf einer Funktion verwendet wird, muss ein Skalar sein.

  2. Funktionen haben auch keine Prototypen, aber alle nützlichen Parameter müssen entweder im Funktionskörper verwendet oder an eine andere Funktion übergeben werden. So ist es möglich, einen Prototyp für jede Funktion zu erstellen, indem jede Variable als skalar/Array/unbekannt identifiziert wird.

  3. Ein mindestens wiederkehrender Fixpunkt-Scan über Funktionsaufrufe liefert dann präzise Informationen über jede nützliche Variable. Wenn eine Variable sowohl als Skalar als auch als Array verwendet wird, kann ein Fehler ausgelöst werden. Wenn eine Variable überhaupt nicht verwendet wird (abgesehen davon, dass sie möglicherweise an Funktionen übergeben wird, die nicht den entsprechenden Parameter verwenden), könnte die Variable einfach eliminiert werden, oder sie könnte als ein (nicht verwendeter) Skalar kompiliert werden.

das nicht genug ist voll awk Variablen geben, da es drei skalare Typen, so Boxen immer noch in den meisten Fällen erforderlich ist. In einigen Fällen ist es wahrscheinlich auch möglich, Skalartypen abzuleiten, obwohl dies wegen automatischer Zwangsoperationen schwieriger sein wird. Ihre Sprache hat jedoch nur einen einzelnen Skalartyp, daher könnte eine ähnliche Strategie wie oben beschrieben funktionieren.