-3

Ich schreibe gerade einen Interpreter für eine Sprache, die ich in C erstelle. Derzeit kann er den Quellcode in Token lexen und diese Token dann in einen AST parsen. Nachdem ich etwas gelesen habe, bin ich zu dem Schluss gekommen, dass die Verwendung von Bytecode schneller ist, als nur durch den AST zu gehen, aufgrund der Menge an Rekursion, die benötigt wird, um den Baum zu durchlaufen.Werte in Bytecode speichern

Also ein AST, wie gehe ich über die Umwandlung in Bytecode? Genauer gesagt, wo werden Funktionen, Variablen und Konstanten tatsächlich gespeichert? Sind sie im Bytecode selbst gespeichert, oder gibt es einen separaten Speicherbereich, in dem diese gespeichert werden?

vereinfachte Darstellung, wie mein AST implementiert:

typedef enum { 
    AST_NODE_INT, 
    AST_NODE_FLOAT, 
    AST_NODE_ADD, 
    // many, many more of these 
}; 

typedef struct _ast_node { 
    ast_node_type type; 

    union { 
     int as_int; 
     float as_float; 

     struct as_add { 
      struct _ast_node *left; 
      struct _ast_node *right; 
     }; 

     //more structs, representing the different types in the enum 
    }; 
}; 

derzeit Mein Programm einige Quellcode wie

1 + 2 

und erzeugen ein AST nimmt (dies ist nicht C, nur eine Darstellung)

{ 
    type: AST_NODE_ADD, 
    as_add: { 
     left: { 
      type: AST_NODE_INT, 
      as_int: 1 
     }, 
     right: { 
      type: AST_NODE_INT, 
      as_int: 2 
     } 
    } 
} 
+2

Die Schönheit der Implementierung Ihrer eigenen Sprache ist: Sie können entscheiden! –

+2

Bytecode bedeutet normalerweise * Anweisungen * für einen virtuellen Prozessor, der Ihren Code ausführen kann. Hast du * diesen * virtuellen Prozessor? Wenn nicht, dann müssen Sie das zuerst entwerfen. Bytecode ist ein Konzept, keine vollwertige Spezifikation, an die Sie sich halten können. –

Antwort

1

Funktionen Variablen und Konstanten (zumindest ihre Namen und was auch immer Nachschlag informieren (um diesen Wert zu einem Wert zu machen) wird normalerweise in einer Symboltabelle gespeichert.

Im Falle eines Funktionsaufrufs würden Sie jedoch viele Argumente auf einen Auswertungsstapel schieben und dann eine Aufrufanweisung haben, die den Bytecode der Funktion aufruft.

Ich empfehle immer Compiler: Prinzipien, Techniken und Werkzeuge (2nd Edition): Alfred V Aho (auch bekannt als ‚der Drache Buch‘), auch wenn es benannt ist „Compiler“ das Material direkt anwendbar ist.