解释/设计AST或使用IR

时间:2013-05-27 11:54:09

标签: compiler-construction interpreter abstract-syntax-tree

我目前正在实施自己的简单玩具编程语言。我希望尽快实现这一点,但我不确定从目前的阶段开始我要去哪里。我打算对我的语言进行解释,因为似乎使解释器更容易?< 更快?而不是制作编译器。

无论如何,我是一个腌菜,我用Bison / Flex创建了我的解析器/词法分析器,但是我没有制作我的AST。原因是因为我打算解释AST,但是我不确定如何设计从多态性中受益的AST(我使用C ++作为我的实现语言)所以我不必使用开关/ if-else语句。有没有人知道我应该如何解决这个问题?或者我不应该解释AST,只是编译成IR并解释IR。

如果是后一种情况,那么在我的源代码中可以免费使用哪些可能的IR和VM(解释IR)而不是发明我自己的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

1 个答案:

答案 0 :(得分:2)

对于第一次尝试,使用多态成员函数解释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,并且他们要求一些额外的样板(例如将所有内容放入类中) 。另外,那么你依赖于那个VM。

我仍然建议你先实现一个AST导向的解释器,虽然我可能会偏爱,因为我就是这样开始的。