1

我目前正在实现自己的简单玩具编程语言。我希望尽快实现这一点,但我很不确定从我所处的当前阶段到哪里去。我打算让我的语言被解释,因为看起来让解释器更容易?还是更快?而不是制作编译器。

无论如何,我很忙,我已经用 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
4

1 回答 1

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,而且他们要求一些额外的样板文件(例如,将所有内容放入一个类) . 另外,那么您依赖于该虚拟机。

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

于 2013-05-27T17:21:04.913 回答