字节码解释器如何知道运行时错误发生在哪一行?
How does a bytecode interpreter know what line a runtime error occurred on?
截至目前,我正在研究一种编译为字节码的语言,然后由 VM 运行 编写。我的问题是,当发生运行时错误时,VM 如何知道源代码的哪一行导致了错误,因为在编译过程中所有空格都被删除了。我会想到的一件事是存储一个单独的整数数组,该数组与字节码相关联,其中包含行号,但这听起来内存效率极低,尤其是当有很多指令时。
某些形式的字节码包含有关行号、方法名称等的信息,这些信息用于提供更好的调试信息。例如,在 JVM 中,方法字节码包含一个 table,它将字节码地址范围映射到源代码行号。这是一种比用行号标记每个字节码操作更有效的存储方式,因为每行通常有多个操作。它确实使用了额外的 space,但我不会将其归类为极其低效。
如果没有此信息,解释器确实无法报告有关原始程序的任何信息,因为正如您所指出的那样,所有信息都将被丢弃。
这类似于已编译的 executables 处理调试信息的方式。包含调试符号后,程序将 tables 映射代码地址到函数名称和行号。删除符号后,您只有原始指令和数据,无法引用原始代码。
截至目前,我正在研究一种编译为字节码的语言,然后由 VM 运行 编写。我的问题是,当发生运行时错误时,VM 如何知道源代码的哪一行导致了错误,因为在编译过程中所有空格都被删除了。我会想到的一件事是存储一个单独的整数数组,该数组与字节码相关联,其中包含行号,但这听起来内存效率极低,尤其是当有很多指令时。
某些形式的字节码包含有关行号、方法名称等的信息,这些信息用于提供更好的调试信息。例如,在 JVM 中,方法字节码包含一个 table,它将字节码地址范围映射到源代码行号。这是一种比用行号标记每个字节码操作更有效的存储方式,因为每行通常有多个操作。它确实使用了额外的 space,但我不会将其归类为极其低效。
如果没有此信息,解释器确实无法报告有关原始程序的任何信息,因为正如您所指出的那样,所有信息都将被丢弃。
这类似于已编译的 executables 处理调试信息的方式。包含调试符号后,程序将 tables 映射代码地址到函数名称和行号。删除符号后,您只有原始指令和数据,无法引用原始代码。