java编译器如何在局部变量表中分配索引?

Jon*_*oin 4 java compiler-construction bytecode

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

我有以下代码:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

阅读变量表时,我得到以下内容:

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;'}
Run Code Online (Sandbox Code Playgroud)

(忽略uid列).

我注意到varIndex对于每个变量都不是unqiue.为什么hello (int)var6(Exception)共享相同的varIndex?

SLa*_*aks 6

编译器足够聪明,可以为范围不重叠的变量重用变量槽.因为它们不能同时使用,所以不需要单独存储它们.

由于hello并且var6没有重叠,因此可以重复使用插槽.