Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save YangSiJun528/3c4210f0709e19ac72070c62a6b7333c to your computer and use it in GitHub Desktop.

Select an option

Save YangSiJun528/3c4210f0709e19ac72070c62a6b7333c to your computer and use it in GitHub Desktop.
2025-05-21-programming-language-spec-vs-impl-java-and-bytecode.md

Corretto JDK 21, Gradle을 사용함.

바이트코드는 Jetbrain에서 제공하는 Intellij IDE의 show bytecode 기능을 사용하여 출력됨.

Java

package dev.sijunyang;

public class Main {
    public static void main(String[] args) {
        array();
    }

    public static void array() {
        int[] intArr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};

        int intA = intArr[0];
        int intB = intArr[9];

        System.out.println("intA = " + intA);
        System.out.println("intB = " + intB);
    }
}

Bytecode

ICONST_0은 0-5까지의 정수를 푸시하는 전용 명령어이고, BIPUSH는 -128~127 범위의 정수를 푸시하는 명령어다.

// class version 65.0 (65)
// access flags 0x21
public class dev/sijunyang/Main {

  // compiled from: Main.java
  // access flags 0x19
  public final static INNERCLASS java/lang/invoke/MethodHandles$Lookup java/lang/invoke/MethodHandles Lookup

  // access flags 0x1
  public <init>()V
   L0
    LINENUMBER 3 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    RETURN
   L1
    LOCALVARIABLE this Ldev/sijunyang/Main; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x9
  public static main([Ljava/lang/String;)V
   L0
    LINENUMBER 5 L0
    INVOKESTATIC dev/sijunyang/Main.array ()V
   L1
    LINENUMBER 6 L1
    RETURN
   L2
    LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
    MAXSTACK = 0
    MAXLOCALS = 1

  // access flags 0x9
  public static array()V
   L0
    LINENUMBER 9 L0
    BIPUSH 10
    NEWARRAY T_INT
    DUP
    ICONST_0
    ICONST_1
    IASTORE
    DUP
    ICONST_1
    ICONST_2
    IASTORE
    DUP
    ICONST_2
    ICONST_3
    IASTORE
    DUP
    ICONST_3
    ICONST_4
    IASTORE
    DUP
    ICONST_4
    ICONST_5
    IASTORE
    DUP
    ICONST_5
    BIPUSH 6
    IASTORE
    DUP
    BIPUSH 6
    BIPUSH 7
    IASTORE
    DUP
    BIPUSH 7
    BIPUSH 8
    IASTORE
    DUP
    BIPUSH 8
    BIPUSH 9
    IASTORE
    DUP
    BIPUSH 9
    ICONST_0
    IASTORE
    ASTORE 0
   L1
    LINENUMBER 11 L1
    ALOAD 0
    ICONST_0
    IALOAD
    ISTORE 1
   L2
    LINENUMBER 12 L2
    ALOAD 0
    BIPUSH 9
    IALOAD
    ISTORE 2
   L3
    LINENUMBER 14 L3
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ILOAD 1
    INVOKEDYNAMIC makeConcatWithConstants(I)Ljava/lang/String; [
      // handle kind 0x6 : INVOKESTATIC
      java/lang/invoke/StringConcatFactory.makeConcatWithConstants(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
      // arguments:
      "intA = \u0001"
    ]
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
   L4
    LINENUMBER 15 L4
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    ILOAD 2
    INVOKEDYNAMIC makeConcatWithConstants(I)Ljava/lang/String; [
      // handle kind 0x6 : INVOKESTATIC
      java/lang/invoke/StringConcatFactory.makeConcatWithConstants(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;
      // arguments:
      "intB = \u0001"
    ]
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
   L5
    LINENUMBER 16 L5
    RETURN
   L6
    LOCALVARIABLE intArr [I L1 L6 0
    LOCALVARIABLE intA I L2 L6 1
    LOCALVARIABLE intB I L3 L6 2
    MAXSTACK = 4
    MAXLOCALS = 3
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment