我和我的一个朋友正在考虑使用即时编译来编写我们自己的编程语言。我们同意我们将要使用的程序集,但我们不太确定的一件事是如何存储变量。我们确实同意的是这些的结构。
变量将被键替换(在编译期间)。每个键都是一个 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 个整数的处理方式不同,对吧?)