compiler-construction - 使用哈希表在类中存储方法有什么优点?

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

我正在开发一种语言和虚拟机。语言是基于类的、动态类型的并且是静态范围的。

示例类如下所示:

class Foo
{
    var bar
    {
       function get { return bar; }
       function set(value) { bar = value; }
    }

    function f1() {...}
    function f2() {...}
}

在类内部声明的实例变量受到保护,可以通过 setter/getter 函数访问。在类内部声明的函数是公共(public)函数。

在运行时实例变量可以存储在数组中,因此在本例中 bar 将存储在该数组的索引 0 处,编译器将负责在其 getter 函数中生成正确的 LOAD 0 指令。

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

使用哈希表代替常规数组来存储方法有哪些优点?

最佳答案

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

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

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

因此,为了回答您的问题,哈希表的优点是,当人们将大量方法(100 个、1,000 个)放入一个类中时,方法查找时间不会增加。

哈希表的缺点是,对于方法数量较少(猜测不到几十个)的类,它们可能会延长方法查找时间。

关于compiler-construction - 使用哈希表在类中存储方法有什么优点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28030065/

相关文章:

regex - 正则表达式 - 匹配空格

java - 如何使用 Javac 打印语法树

java - Eclipse:启用断言

c++ - 如何将 CINT 嵌入到 Windows 上的 C++ 应用程序中?

java - Java字节码是由JVM顺序执行的吗?

c# - 如何在 Mono 开发(Ubuntu、Linux)中将 Saltarelle C# 设置为 JavaScript 编译器

list - 在 Haskell 中实现一种语言 : homogenous lists

haskell - 设计一种简单的静态类型化语言的类型系统(在Haskell中)

java - 如何查找方法中调用的所有方法(包括 Lamda)?

android - Android 中的垃圾字节注入(inject)