【问题标题】:How does the java compiler assign index's in the local variables table?java编译器如何在局部变量表中分配索引?
【发布时间】:2016-01-21 04:18:08
【问题描述】:

好的,所以我正在编写一个编译器,我正在尝试使用局部变量表中的信息来确定变量的名称/类型。

我有以下代码:

public void noob() {
    try {
        int hello = 0;
        short yo = 1;
        byte y = 2;
        int[] e = new int[9];

        System.out.println(y + ", " + hello + ", " + yo+", "+e);

    } catch (Exception var6) {
        var6.printStackTrace();
    }
}

读取变量表时,我得到以下信息:

LocalVariable{uid=-1, start=0, end=69, nameIndex=30, typeIndex=31, varIndex=0, name='this', typeName='LMain;'}
LocalVariable{uid=-1, start=2, end=60, nameIndex=37, typeIndex=18, varIndex=1, name='hello', typeName='I'}
LocalVariable{uid=-1, start=4, end=60, nameIndex=38, typeIndex=39, varIndex=2, name='yo', typeName='S'}
LocalVariable{uid=-1, start=6, end=60, nameIndex=40, typeIndex=41, varIndex=3, name='y', typeName='B'}
LocalVariable{uid=-1, start=12, end=60, nameIndex=42, typeIndex=43, varIndex=4, name='e', typeName='[I'}
LocalVariable{uid=-1, start=64, end=68, nameIndex=44, typeIndex=45, varIndex=1, name='var6', typeName='Ljava/lang/Exception;'}

(忽略 uid 列)。

我注意到 varIndex 并非对每个变量都是唯一的。为什么hello (int)var6(Exception) 共享同一个varIndex?

【问题讨论】:

    标签: java compiler-construction bytecode


    【解决方案1】:

    编译器足够聪明,可以为范围不重叠的变量重用变量槽。因为它们永远不能同时使用,所以没有必要分开存放。

    由于hellovar6 没有重叠,所以槽可以重复使用。

    【讨论】:

    • 好吧,这是有道理的。他们的任何东西对每个变量都是独一无二的吗?比如nameIndex、typeIndex?
    • @JonathanBeaudoin:可能不会。 TypeIndex 肯定不是唯一的,因为变量可以具有相同的类型。尝试在不同的范围内创建两个具有相同名称的变量并查看 nameIndex。
    • 不,它也重用了它。好的,我想我将不得不找到另一种方法来制作唯一的 id。无论如何,感谢您的帮助!
    • @Jonathan Beaudoin:您要创建的唯一 ID 的目的是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 2018-02-18
    • 2013-03-02
    相关资源
    最近更新 更多