Compiler construction 解释/设计AST或使用IR

Compiler construction 解释/设计AST或使用IR,compiler-construction,interpreter,abstract-syntax-tree,Compiler Construction,Interpreter,Abstract Syntax Tree,我目前正在实现我自己的简单玩具编程语言。我希望这能尽快实施,但我很不确定从我目前所处的阶段到哪里去。我计划让我的语言被翻译,因为做一个翻译似乎更容易?还是更快?而不是制作一个编译器 无论如何,我很为难,我已经用Bison/Flex创建了我的解析器/词法分析器,但是我还没有创建我的AST。之所以这样,是因为我计划对AST进行解释,但是我不太确定我将如何设计从多态性中获益的AST(我用C++作为我的实现语言),所以我不必使用开关/IF语句。有人知道我应该如何处理这个问题吗?或者我不应该解释AST,而

我目前正在实现我自己的简单玩具编程语言。我希望这能尽快实施,但我很不确定从我目前所处的阶段到哪里去。我计划让我的语言被翻译,因为做一个翻译似乎更容易?还是更快?而不是制作一个编译器

无论如何,我很为难,我已经用Bison/Flex创建了我的解析器/词法分析器,但是我还没有创建我的AST。之所以这样,是因为我计划对AST进行解释,但是我不太确定我将如何设计从多态性中获益的AST(我用C++作为我的实现语言),所以我不必使用开关/IF语句。有人知道我应该如何处理这个问题吗?或者我不应该解释AST,而只是编译成IR并解释IR

如果是后一种情况,而不是发明我自己的IR,有什么可能的IRs和VM(解释IR)可以在我的源代码中自由使用而不受任何限制?我知道LLVM,但是还有其他我应该考虑的吗? 编辑:

我正在创建的编程语言是一种简单的C语言,其中包含一些visual basic特性。它是静态类型的,有两个可用的原语:数字(浮点)或文本字符串

下面是它的外观:

begin // start of the program

   num x = 3;                // make a number
   str text = "Hello World"; // make a string

   print text + x; // prints out "Hello World3"

end // end of the program

对于第一次尝试,使用多态成员函数解释AST是可以的。当然,由于几个原因,它会非常慢,您必须切换到完全不同的方法来显著提高性能,但是一个工作正常但速度慢的程序要比一个坏了但可能很快的程序好。这看起来有点像这样,忽略了表示几种类型的问题:

struct Node { virtual int eval(); };
struct Const : Node {
    int n;
    virtual int eval() { return n; }
};
struct Add : Node {
    Node *lhs, *rhs;
    virtual int eval() { return lhs->eval() + rhs->eval(); }
};
创建自己的IR需要更多的工作:现在必须指定两种语言,并且仍然实现一种。使用现有的IR没有这些问题,而且可能更简单,但您仍然必须编译到该IR。如果IR不适合您的语言,那么这一步相当困难,您必须处理IR可能具有的所有复杂性和特性。如果不懂你的语言,就不可能推荐任何东西

编辑:您的语言看起来很简单,可以直接编译到LLVM,不过您可能需要一段时间才能充分理解LLVM IR以完成翻译。您还必须确定C++解释程序可以委托给标准库的一些实现细节(例如字符串分配)(例如:代码> STD::String )。其他主要的VM,如JVM和CLR,在更高的级别上运行,直接支持字符串,但是我敢打赌它们的工具用于生成IR不如LLVM的C++ API,并且他们授权一些额外的样板(例如把所有东西放入一个类)。另外,你还依赖于虚拟机


我仍然建议您首先实现一个AST定向的解释器,尽管我可能有点偏袒,因为我就是这样开始的。

我只是在我的主要帖子中添加了一个基本的片段/解释,说明我的编程语言是什么样子的。