gpt4 book ai didi

Kotlin 编译器 : `nop` s in bytecode

转载 作者:行者123 更新时间:2023-12-02 12:37:59 27 4
gpt4 key购买 nike

我正在检查捕获 lambda 的 kotlinc 字节码。并试图理解生成的字节码具有 nop 指令的原因。

kotlinc -jvm-target 1.6 .

private inline fun lambdaCapturing(f: () -> Int): Int = f()

fun main(args: Array<String>) {
lambdaCapturing { 42 }
}

结果我得到了

public final class x.y.z.LambdaCaptKt {
private static final int lambdaCapturing(kotlin.jvm.functions.Function0<java.lang.Integer>);
Code:
0: ldc #8 // int 0
2: istore_1
3: aload_0
4: invokeinterface #14, 1 // InterfaceMethod kotlin/jvm/functions/Function0.invoke:()Ljava/lang/Object;
9: checkcast #16 // class java/lang/Number
12: invokevirtual #20 // Method java/lang/Number.intValue:()I
15: ireturn

public static final void main(java.lang.String[]);
Code:
0: aload_0
1: ldc #29 // String args
3: invokestatic #35 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
6: iconst_0
7: istore_1
8: iconst_0
9: istore_2
10: nop
11: nop
12: nop
13: return
}

在 main 函数中有几个 nop 指令。

如果我用 -Xno-optimize 编译相同的代码片段,main 函数看起来像

public static final void main(java.lang.String[]);
Code:
0: aload_0
1: ldc #29 // String args
3: invokestatic #35 // Method kotlin/jvm/internal/Intrinsics.checkParameterIsNotNull:(Ljava/lang/Object;Ljava/lang/String;)V
6: nop
7: iconst_0
8: istore_1
9: nop
10: iconst_0
11: istore_2
12: bipush 10
14: nop
15: goto 18
18: invokestatic #41 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
21: checkcast #16 // class java/lang/Number
24: invokevirtual #20 // Method java/lang/Number.intValue:()I
27: nop
28: goto 31
31: pop
32: return

还有nop

  1. 在非优化代码中出现nop 的原因是什么? (调试信息/...)
  2. 是否有任何理由在优化代码中使用 nop

最佳答案

nop的原因Kotlin 编译器发出的字节码中的 s 是调试器在右大括号处放置断点的可能性,即在函数或 if 的最后一条语句之后。 - 条款和其他条款,并使其有可能进入这些位置。这样做需要字节码中存在一条指令,该指令也标有行号。

一些 nop如果 s 是多余的,例如当最后一条语句指令之后已经有一个有效指令时,s 就会被优化掉。

关于 Kotlin 编译器 : `nop` s in bytecode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59650925/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com