我正在创建一个使用伪c ++语法创建的解释器。我正在寻找存储由解释器创建的变量的最佳方法。
目前我正在使用存储指向这些变量的指针的动态数组,但肯定有更好的方法吗?也许某种内联汇编代码来控制内存块?
我不太关心可移植性,因为我愿意为每个主要操作系统重写这些代码片段。我只是在寻找一种方法来创建一个内存块,而不会被锁定到一个类型。对于我目前的测试,我在Windows上使用MingW编译器。
任何想法都会受到高度赞赏。
答案 0 :(得分:3)
我说这在很大程度上取决于你的语言在翻译中的表现方式。如果这是一个真正的解释器并且您没有任何预编译步骤,那么您通常会有两种分配 - 堆栈和堆分配。如果您支持在堆栈上分配内容,则应在解释器中将其实现为堆栈。
使用vector<char>
作为堆栈缓冲区。跟踪输入的每个范围,在堆栈上放置标记。遇到堆栈分配变量时,请增大堆栈以容纳新的局部变量。如果需要,请使用展示位置new
初始化对象。
将其添加到某种字典中以将变量名称与内存空间相匹配,以便您的代码知道在给定上下文的位置找到名称的位置。就像符号表一样,只保留在运行时。
一旦遇到范围结束,您将弹出所有本地分配的符号的堆栈,并在必要时调用析构函数。同时从符号表中删除所有条目,因为它们不再在范围内。这样就可以完全避免堆分配完全用于堆上没有使用的对象。
答案 1 :(得分:1)
您不需要内联汇编程序代码来执行此操作。您可以使用vector<char>
作为缓冲区,并使用placement new
在其中构建对象。请注意,使用此技术,您将进入手动分配管理领域,这会带来一系列问题,例如处理碎片。
答案 2 :(得分:1)
我找到的最简单的解决方案是std::map<std::string, Variant>
。字符串存储变量名称,Variant
是boost::variant<all-interpreter-types>
的typedef。这样,代码就像globals["foo"]=1;
一样简单(将解释器变量foo
设置为int, 1
)。
当然,你可以编写自己的代码大致相同,但你必须担心内存。