【发布时间】:2015-01-19 17:11:52
【问题描述】:
我正在开发一种语言和一个虚拟机。语言是基于类的、动态类型的并且是静态范围的。
示例类如下所示:
class Foo
{
var bar
{
function get { return bar; }
function set(value) { bar = value; }
}
function f1() {...}
function f2() {...}
}
在类中声明的实例变量是受保护的,可以通过 setter/getter 函数访问。在类中声明的函数是公共的。
在运行时,实例变量可以存储在一个数组中,因此在本示例中 bar 将存储在该数组的索引 0 处,编译器将负责在其 getter 函数中生成正确的 LOAD 0 指令。
其他功能呢?使用数组存储函数肯定会比使用哈希表更快的运行时访问,但我想知道可能是什么缺点。我的意思是如果我想支持在运行时向类添加函数的能力怎么办?覆盖呢?
使用哈希表代替常规数组存储方法有什么优势?
【问题讨论】:
-
如果它是动态类型的,编译器如何知道哪个索引是给定成员名称的正确索引?例如,如果有第二个类的成员
foo、bar、baz,那么代码中其他地方的obj.bar是否对应于LOAD 0或LOAD 1? -
不要混淆条款。首先,您必须确定您的解决方案是基于数组/列表(读取:索引)还是基于映射(读取:名称)。只有当您决定基于地图时,您才可能考虑地图是否必须基于 hash。毕竟,映射算法比散列还多,而且对于对象中的典型函数数量,散列不一定是最有效的选择。
标签: compiler-construction interpreter bytecode compiler-optimization vm-implementation