【发布时间】:2013-08-23 18:45:40
【问题描述】:
我和我的一个朋友正在考虑使用即时编译来编写我们自己的编程语言。我们同意我们将要使用的程序集,但我们不太确定的一件事是如何存储变量。我们确实同意的是这些的结构。
变量将被键替换(在编译期间)。每个键都是一个 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 个整数的处理方式不同,对吧?)
【问题讨论】:
-
你到底为什么要这样做?
-
写一门语言很有趣。为什么要使用这种奇怪的变量命名方法? 这个命名约定(某种索引)有趣吗?
-
这些是用其他东西替换变量名的原因。这些不是用您选择的奇怪索引约定替换变量名称的理由,它混淆较少,具有更多无意义的字节,并且比普通的旧 uid(无论是否为数字)更难被虚拟机解释。我的建议是拿起紫龙或红龙编译器的书,阅读并吸收其中的建议。
-
你的方法有很多问题,我什至不知道从哪里开始。 O_o 不要试图重新发明一个方形轮子,只需像其他人一样使用一个圆形轮子并将变量名称映射到它们的内存地址......(或至少映射到一个唯一的全局标识符)不要忘记命名空间, 类等对于我们大脑有限的人类来说只是语法糖,绝对没有必要(实际上这是一件坏事)在代码结构和编译后的实现之间进行 1-1 映射。
-
@Binero 如果您使用
size_t或void*(通常大小相同)作为您的uid,您根本无法达到限制:您总是会用完记忆第一。现在,您当前对每个命名空间 64k 个对象的限制完全是另一回事,它更容易饱和。
标签: c++ memory assembly memory-management vm-implementation