Interpreter: Variablen verwalten



  • Hallo,

    es geht darum einen Interpreter zu Programmieren und die Frage ist wie macht man das mit den Variablen am besten.
    Ich habe verschieden ratschläge bekommen bin mir aber nicht sicher was wirklich am besten ist oder ob ich es ganz anders machen sollte.

    Das sind die Ratschläge:

    1.Mach das so wie bei dem Interpreter in Wikipedia http://de.wikipedia.org/wiki/Interpreter.

    2.Mach strukturen für die verschiedenen Typen, in denen du den Namen und den Wert speicherst.Die Strukturen kommen in ein dynamisches array.

    3. + 4. Mach Strukturen die folgendes enthalten: Name, Typ, Zeiger auf speicher. Die Strukuren werden dann in einem dynamischen array gespeichert.

    bei 3. Alle Variablenwerte kommen in einen großen speicherbereich(malloc()) der Zeiger auf speicher verweist dorthin.

    bei 4: Für jede variable wird extra speicher mit malloc() angefordert.

    Was meint ihr dazu.

    MfG Gary



  • Ich würd einen Hashtable mit einer struct Machen, die in etwa so aussieht.

    struct {
       char name[64];
       int  type;
       union {
          struct {
             int length;
             char *str;
          } string;
          struct {
              int value;
          } integer;
          /* etc */
    }
    


  • Hat deine Sprache Typen?
    Wenn ja, kleben die am Wert oder am Namen?



  • Es gibt die Typen integer,float und string.



  • (Nochmal: Typ am Namen oder am Wert?)
    Soll es verschiedene Blöcke mit lokalen Variablen geben, oder reicht ein globaler Namensraum?
    Bei Interesse solltest du auch den Unterschied zwischen lexikalischer und dynamischer Namensbindung nachschlagen.
    Der Unterschied könnte sich auf die Entscheidung auswirken.



  • Der Typ hängt am Namen und es reicht ein Namensraum.



  • Dann mach es ganz einfach so, wie Mazal es vorgeschlagen hat.
    Ein Array hätte halt Grenzen, eine verlinkte Liste hätte die durchschnittliche Zugriffszeit in o(Länge / 2), was recht lang ist, dafür ist beides sehr einfach.

    Verbesserungen kann man immer noch später machen, solange man sich den Weg dorthin nicht verbaut.
    Eine Hash-Tabelle wäre natürlich schneller, oder z. B. auch ein Such-Baum für die Namen.
    Aber prinzipiell macht das wenig Unterschied.



  • Ok, Danke !



  • Ich würde die Symboltabelle auf jeden Fall als verkettete Liste (also wie unter 4.) ausführen. Bei dieser Methode ändern sich die Zeiger auf die Variablenstrukturen nicht, wenn Variablen hinzugefügt werden. Du kannst dann die Zeiger im tokenisierten Programm verwenden, wodurch sich die Ausführungsgeschwindigkeit drastisch erhöht.

    Wenn du die allokation der Symboltabelleneinträge gepooled durchführst, dann geht auch das hinzufügen relativ schnell.


Anmelden zum Antworten