-1

我和我的一个朋友正在考虑使用即时编译来编写我们自己的编程语言。我们同意我们将要使用的程序集,但我们不太确定的一件事是如何存储变量。我们确实同意的是这些的结构。

变量将被键替换(在编译期间)。每个键都是一个 2 字节整数,范围从 1 到 65535。例如,当您在命名空间中有一个变量时,该键将首先存在一个包含命名空间键的 2 字节整数,然后是一个包含实际变量的键。

例如,如果我有命名空间 foo 并且其中有一个变量 test,我们说命名空间 foo 将被分配键 1,而 1 内的变量 test 将被分配键 1->1。(第一个命名空间中的第一个变量)。在程序集本身中,我们用 NULL 字节终止这些键。(请记住,这是编译后的程序集,而不是编译前的真实代码)

GETV 1 1 0 SET 5 RET

此程序集将从命名空间 foo 中获取变量 test,并将其设置为 5。然后它将返回该变量。

GETV 1 2 1 0 SETV 1 1 0 RET

此程序集可以匹配以下(虚构的)代码:

foo::testClass::test = foo::test;
return foo::test;

提供以下结构。

namespace foo { // 1 First Global Variable
    byte test = 1; // 1 1 - First Variable Inside First Global Variable
    class testClass { // 1 2 - Second Variable Inside First Global Variable
        static byte test = 0; // 1 2 1 - First Variable Inside Second Variable Inside First Global Variable
    }
}

我将如何访问这些变量?我目前的计划是使用键作为字符串作为哈希将它们存储在哈希图中。我不知道如何去做,因为我怎么知道当前键中存储了什么类型的变量,它有多长以及如何用它进行计算。我确实明白,编译器可以处理诸如将无符号整数添加到有符号整数之类的疯狂计算,但这仍然给我们留下了问题,该变量有多长以及如何处理它。(添加 2 个浮点数与添加 2 个整数的处理方式不同,对吧?)

4

1 回答 1

1

这里最好的方法不是为变量保留一些奇怪的标识符,而是使用直接指针。编译程序后,您将不再需要以人为中心的名称。

更重要的是,您需要考虑变量的结构。根据您的语言语法,除了保留变量值的内存之外,您可能还需要存储一些元数据 - 例如变量的类型。仅当您想要支持自动类型转换时才需要此信息。如果您的语言是严格类型化的,您将能够在编译时解决所有类型冲突,然后在运行时就不需要类型信息。

此外,根据语法,您可能需要保留一个索引,将变量的人类可读名称映射到实际地址。仅当您的语言具有类似于以下功能时才需要此索引:

var_by_name(s:string):pointer
于 2013-08-25T06:31:13.633 回答