Compiler oder Interpreter



  • Wenn ich ein Script (Brainfuck zum Beispiel) intern in einen Baum umwandele (Eine Klassenstruktur) und diesen dann anschließend unendlich oft ausführen kann, ohne neu verarbeitung des Scripts, ist das dann ein Interpreter oder Compiler?
    Abgespeichert werden kann dieses Format jedoch (noch?) nicht.


  • Mod

    Das Umwandeln in den Baum ist eine Art von Compilierung, da Compilierung bedeutet, dass man etwas von einer Sprache in eine andere umwandelt (zum Beispiel spricht man auch bei Java von Compilieren, wenn der Quelltext in den Bytecode überführt wird). Dein Baum wird dann anscheinend interpretiert, so wie du den Vorgang beschreibst.



  • Die meisten außer vielleicht den allerprimitivsten Interpretern bauen erstmal irgendeine Zwischendarstellung auf, die sie dann interpretieren.



  • Ah ok, gut das dachte ich mir.

    Der Brainfuck Interpreter war nur zum Aufwärmen.
    Falls es jemanden interessieren sollte, wie es tatsächlich ungefähr aussieht:

    class Instruction {
        // virtual dtor etc...
    public:
        virtual void execute(char*& ptr) const; 
    };
    
    class IncrementInstruction : public Instruction {
    private:
        unsigned int amount_;
    public:
        IncrementInstruction(unsigned int amount);
        virtual void execute(char*& ptr) const override;
    };
    
    // Decrement, Jumpetc.
    

    Diese Struktur wird zunächst erzeugt und in einer Liste abgespeichert

    und später ist das Ganze dann einfach nur noch ein:

    class BrainfuckProgram {
    private:
        std::vector <std::shared_ptr<Instruction> > instructionsList_;
        decltype(instructionList_)::const_iterator instructionPtr_;
    public:
        // operator etc, more stuff
    };
    
    void BrainfuckProgram::operator()(VirtualMemory& memory)
    {
        auto memptr = memory.getMemoryPointer();
        for (; instructionPtr_ != std::end(instructionList_); ++instructionPtr_)
            instructionPtr_->execute(memptr); // may alter instructionPtr_
    }
    


  • Machst du das zum Üben (Klassendesign etc.), oder willst du dass das Brainfuck-Programm möglichst schnell läuft?
    Fall letzteres würde ich einen anderen Ansatz empfehlen.



  • Ich probiere mehrere Ansätze durch und messe die Geschwindigkeit. Das hier ist momentan #2. Ich erhoffe mir dabei Kenntnisgewinn für das tatsächliche Projekt. Allerdings will ich da später nicht den Überblick verlieren, weshalb ich die Struktur momentan zunächst auf Papier durchplane. Ich verliere leider viel zu oft bei großen Projekten sobald ich refactoring betreibe den Überblick.
    Daran will ich arbeiten.
    EDIT: Ich meine nicht den Brainfuckinterpreter, der ist ja mal schnell geschrieben.


Anmelden zum Antworten