解释/设计AST或使用IR



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

无论如何,我很为难,我已经用Bison/Flex创建了我的解析器/词法分析器,但是我没有做我的AST。这样做的原因是,因为我计划解释AST,但是我很不确定我将如何设计AST,从多态性中受益(我使用c++作为我的实现语言),所以我不必使用开关/if-else语句。有人知道我该怎么解决这个问题吗?或者我不应该解释AST,而应该编译成IR并解释IR。

如果是后者,而不是发明我自己的IR,在我的源代码中有哪些可能的IR和vm(解释IR)可以自由使用而不受任何限制?我知道LLVM,但还有其他我应该考虑的吗?

编辑:

我正在创建的编程语言是一种简单的类似c的语言,并且有一些视觉上的基本特征。它是静态类型的,有两个可用的原语:一个数字(浮点数)或一个文本字符串。

内容如下:

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)的实现细节(例如字符串的分配)。其他主要的虚拟机,如JVM和CLR在更高的层次上运行,直接支持字符串,但我敢打赌,它们用于生成IR的工具不如LLVM的c++ API,而且它们要求一些额外的样板文件(例如,将所有内容放入类中)。另外,你还得依赖那个虚拟机。

我仍然建议你首先实现一个面向ast的解释器,尽管我可能是部分的,因为这是我开始的方式。

最新更新