首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin编译器:“n在字节码中

Kotlin编译器:“n在字节码中
EN

Stack Overflow用户
提问于 2020-01-08 17:24:27
回答 1查看 214关注 0票数 3

我正在检查捕获lambdas的kotlinc字节码。并试图理解导致字节码有nop指令的原因。

kotlinc -jvm-target 1.6 .

代码语言:javascript
复制
private inline fun lambdaCapturing(f: () -> Int): Int = f()

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

结果我得到了

代码语言:javascript
复制
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
}

主要功能有多个nop指令。

如果我要用-Xno-optimize编译相同的代码片段,main函数将类似于

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-08 23:15:16

nop在字节码中发出的原因是调试器有可能在函数或if-clause和其他子句的结束大括号(即最后一条语句之后)放置一个断点,并使其能够逐步到达这些位置。这样做需要在字节码中显示一条指令,该指令也被标记为行号。

如果一些nop是冗余的,则会对它们进行优化,例如在最后一个语句指令之后已经有一个有效的指令。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59650925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档