【问题标题】:What are the advantages of using an hash table to store methods inside a class?使用哈希表在类中存储方法有什么好处?
【发布时间】: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 指令。

其他功能呢?使用数组存储函数肯定会比使用哈希表更快的运行时访问,但我想知道可能是什么缺点。我的意思是如果我想支持在运行时向类添加函数的能力怎么办?覆盖呢?

使用哈希表代替常规数组存储方法有什么优势?

【问题讨论】:

  • 如果它是动态类型的,编译器如何知道哪个索引是给定成员名称的正确索引?例如,如果有第二个类的成员 foobarbaz,那么代码中其他地方的 obj.bar 是否对应于 LOAD 0LOAD 1
  • 不要混淆条款。首先,您必须确定您的解决方案是基于数组/列表(读取:索引)还是基于映射(读取:名称)。只有当您决定基于地图时,您才可能考虑地图是否必须基于 hash。毕竟,映射算法比散列还多,而且对于对象中的典型函数数量,散列不一定是最有效的选择。

标签: compiler-construction interpreter bytecode compiler-optimization vm-implementation


【解决方案1】:

如果语言是动态类型的,那么您需要能够按名称查找方法/成员函数。

您可以使用包含名称和过程链接的数组,可以使用树,可以使用链表,可以使用散列,也可以使用其他数据结构,但您必须同时存储过程的名称和过程的链接,以便您可以按名称查找它。

哈希表对于大量条目往往更有效,但对于少量条目,有时您在每次查找时花费更多时间对名称进行哈希处理,而不是仅扫描数组。

因此,回答您的问题,哈希表的优势在于,当人们将大量方法(100 个、1000 个)放入一个类时,方法查找时间不会增加。

哈希表的缺点是,对于具有少量方法(估计少于几十个)的类,它们可能会使方法查找时间变长。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-06
    • 2014-10-02
    • 2012-01-08
    • 2017-07-31
    • 1970-01-01
    • 2013-07-12
    • 2011-07-30
    • 2014-01-01
    相关资源
    最近更新 更多