我和我的一个朋友正在考虑使用即时编译来编写我们自己的编程语言。我们同意我们将要使用的大会,但我们不太确定的一件事是如何存储变量。我们所达成的共识是这些结构。
变量将被键替换(在编译期间)。每个键都是一个2字节的整数,范围从1到65535.例如,当你在命名空间中有一个变量时,该键将首先存在一个包含命名空间键的2字节整数,而不是包含该字符串的2字节整数。实际变量的关键。
因此,例如,如果我有命名空间foo并且我有一个变量测试,我们说命名空间foo将被分配键1,而1中的变量测试将被分配键1-> 1。 (第一个命名空间中的第一个变量)在Assembly本身中,我们使用NULL字节终止这些键。 (请记住,这是编译后的程序集而不是编译前的实际代码)
GETV 1 1 0 SET 5 RET
此程序集将从命名空间foo中获取变量测试,并将其设置为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个整数不同,对吗?)
答案 0 :(得分:1)
这里最好的方法是不要为变量保留一些奇怪的标识符,而是使用直接指针。编译程序后,您将不再需要以人为中心的名称。
更重要的是,您需要考虑变量的结构。根据语言的语法,除了保存变量值的内存之外,您可能还需要存储一些元数据 - 例如变量的类型。仅当您要支持自动类型转换时才需要此信息。如果您的语言是严格键入的,您将能够在编译时解决所有类型冲突,然后在运行时不需要类型信息。
此外,根据语法,您可能需要保留一个索引,以将变量的人类可读名称映射到实际地址。仅当您的语言具有类似以下的函数时才需要此索引:
var_by_name(s:string):pointer