Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java offsetStackFrame在JVM规范中做什么_Java_Jvm - Fatal编程技术网

Java offsetStackFrame在JVM规范中做什么

Java offsetStackFrame在JVM规范中做什么,java,jvm,Java,Jvm,在JVM规范中,offsetStackFrameProlog谓词做什么 虽然我不是Prolog专家,但我可以掌握本规范中Prolog中的所有其他谓词,但我不能理解这一个 以下是第174页JVM规范中该谓词的定义: offsetStackFrame(Environment, Offset, StackFrame) :- allInstructions(Environment, Instructions), member(stackMap(Offset, StackFrame), Instruc

在JVM规范中,
offsetStackFrame
Prolog谓词做什么

虽然我不是Prolog专家,但我可以掌握本规范中Prolog中的所有其他谓词,但我不能理解这一个

以下是第174页JVM规范中该谓词的定义:

offsetStackFrame(Environment, Offset, StackFrame) :-
 allInstructions(Environment, Instructions),
 member(stackMap(Offset, StackFrame), Instructions).
在第178页,说明定义为:

instruction(Offset, AnInstruction)
下面是第180页的
stackMap
的定义:

stackMap(Offset, TypeState)
TypeState
的定义如下:

frame(Locals, OperandStack, Flags)

我不明白
成员(stackMap(Offset,StackFrame),说明)
offsetStackFrame
的定义中做了什么。我认为<代码>指令<代码>为<代码> [指令(偏移,指令)] <代码> >代码> StAcGMP(偏移量,类型状态) AS <代码> [(偏移量,框架,操作数,标志)] < /代码>。那么这个谓词的目的是什么呢?

我稍后会回来改进这个答案。如果我现在没有太多时间,请给我发个通知。我已经在规范中运行了prolog,所以我应该能够提供一个IRL示例

基本上是为了帮助验证过程,类文件在某些键字节码偏移量(通常在控制流合并的分支之后)包含操作数堆栈/局部数的类型状态。这些类型状态称为堆栈映射帧。prolog代码有一个谓词,它组合了已知的堆栈映射帧和指令(称为
mergeStackMapFrames
或其他内容)。然后,它对合并结果进行迭代,以验证所有状态转换是否有效/是否与相关指令匹配

上面的谓词如何适应这一点是,它断言合并的指令/堆栈映射帧中存在特定的堆栈映射帧。
由于prolog的性质,您可以首先使用此断言来构造合并列表。

我得到了它,这很好,但请参考JVM规范中的相关部分,让其他人更清楚地了解它。“尽管我不是prolog专家”……我想,JVM规范的目标受众中没有一个是。