

소스코드(hello.c) -> 전처리(preprocess) -> 전처리 후 소스(hello.i) -> Compiler ->
Assembly소스(hello.s) -> Assembler -> 오브젝트파일(hello.o) -> Linker -> 실행파일(hello.out) ->
Loader -> Memory
좀더 자세히 보자
런타임 환경의 과정이 위 그림의 JVM부분과 같다 즉, JVM은 런타임 프로세스



: 토큰 스트림을 통해서 문법에 맞는지 확인하는 과정

: 컴파일시 생성되는 중간 코드 = 바이트 코드

클래스의 modifier 정보를 나타낸다
| name | value | 의미 |
|---|---|---|
| ACC_PUBLIC | 0x0001 | 클래스가 public, 다른 클래스에서 접근이 가능 |
| ACC_FINAL | 0x0010 | 클래스를 상속할 수 없다 |
| ACC_SUPER | 0x0020 | invokespecial 인스트럭션은 수퍼클래스의 메서드를 호출함 |
| ACC_INTERFACE | 0x0200 | interface임을 명시 |
| ACC_ABSTRACT | 0x0400 | abstract임을 명시 |
| ACC_SYNTHETIC | 0x1000 | 소스 코드에서 명시적으로 선언되지 않고 컴파일러에서 생성되었음을 의미 |
| ACC_ANNOTATION | 0x2000 | annotation @interface임을 명시 |
| ACC_ENUM | 0x4000 | enum class 임을 명시 |
| ACC_MODULE | 0x8000 | module임을 명시 |

// 예를 들어서 다음과 같은 코드가 있다면
Object print(String str, int i)
// Type의 표현으로 다음과 같이 표현가능하다
(java/lang/String;I)Ljava/lang/Object;
JVM이 동적으로 코드를 실행시킬 때 모든 데이터를 즉시 생성하는 것이 아니라,
constant pool에 저장 후 Constant pool에 존재하는 데이터를 우선적으로 가져와 메모리를 더욱 효율적으로 사용할 수 있게한다

런타임에 생성되는 Static 상수 저장소
즉, 정적영역에 있는 메모리이기에 GC의 대상 x
# 해시코드로 시작하는 특징
Constant pool에서 제공하는 타입
| type | bit |
|---|---|
| Integer(Boolean,Short,Byte 상수는 Integer 취급 | 32bit |
| Float | 32bit |
| Double, Long | 64bit |
| String | 16bit(실제값이 아닌 주소값이 저장된다) |
public class Test {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
해당 코드를 javap 명령(javac Test.java, javap -c Test)을 통해 bytecode를 보면
// 이렇게 나온다
public class bridge.view.Test {
public bridge.view.Test();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public java.lang.String getName();
Code:
0: aload_0
1: getfield #2 // Field name:Ljava/lang/String;
4: areturn
public void setName(java.lang.String);
Code:
0: aload_0
1: aload_1
2: putfield #2 // Field name:Ljava/lang/String;
5: return
}
aload_0 : local variable 을 stack 에 push 한다, 0은 frame안 instruction 위치invokespecial : instance Method 를 호출하고 결과를 stack 에 push한다.https://velog.io/@jieuni/%EC%8B%9C%EC%8A%A4%ED%85%9C%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8DAssembler
https://www.geeksforgeeks.org/cc-preprocessors/
https://catch-me-java.tistory.com/9
https://github.com/gyoogle/tech-interview-for-developer/blob/master/Language/%5Bjava%5D%20%EC%9E%90%EB%B0%94%20%EC%BB%B4%ED%8C%8C%EC%9D%BC%20%EA%B3%BC%EC%A0%95.md
https://wonit.tistory.com/589
https://wonit.tistory.com/588
https://d2.naver.com/helloworld/1230
https://docs.oracle.com/javase/specs/jvms/se16/html/jvms-4.html
https://www.baeldung.com/jvm-constant-pool
https://jiwondev.tistory.com/114#head5