java

[java] 자바 컴파일 : 향상된for이 while로 변경?

moonsiri 2020. 10. 11. 17:13
728x90
반응형

java 파일을 build 후 class 파일을 디컴파일러 해본적이 없어서 몰랐는데

향상된 for문이 빌드 후 while문으로 변경된다고 해서 컴파일에 대해 끄적여보겠습니다.

일단 자바의 컴파일 절차는 이렇습니다.

    자바 소스 코드 파일(.java) -> javac 컴파일러 -> JVM 바이트코드(.class)

 

컴파일의 세부 단계는 어휘 분석, 구문 분석, 의미 분석, 중간 코드 생성, 중간 코드 최적화로 구성됩니다.

향상된 for문이 빌드 후 while문으로 변경되는 것은 중간 코드 최적화 때문입니다.

중간 코드 최적화(Code Optimization)는 중간 코드가 더 효율적인 기계어로 변환되도록 최적화하는 과정이 수행됩니다.

 

1.핍홀(Peephole) 최적화

  • 중복 명령어 제거
  • 도달 불가능한 코드 제거
  • 제어 흐름 최적화
  • 비용 낮은 연산자로 변환 등

2.지역 최적화

  • 지역 공통 부분식 제거
  • 복사 전파
  • 상수 폴딩 등

3.루프 최적화

  • 코드 이동
  • 귀납 변수 최적화
  • 루프 융합/교환/전개 등

4.전역 최적화

  • 전역 공통 부분식 제거
  • 상수 폴딩 등

 


 

 

List<User> list = ...;
for (User vo : list) {
    ...
}

 

위 .java 코드가 컴파일후 아래처럼 코드 최적화 됩니다.

 

List<User> list = ...;
Iterator i$ = list.iterator();
while (i$.hashNext()) {
    User vo = (User) i$.next();
    ...
}

자바 컴파일은 자바 코드를 자바 언어 스펙에 따라 분석/검증하고, JVM 스펙의 class 파일 구조에 맞는 바이트코드를 만들어내는 과정입니다.

자바 소스 코드를 컴파일한 결과로 나오는 class 파일은 크게 보면 클래스 메타 정보, 상수 풀, 코드 구현부(JVM 명령어+오퍼랜드)로 구성됩니다.

소스 코드에서 정적으로 파악할 수 있는 변수, 상수, 메서드 등의 정보가 클래스 파일 단위의 상수 풀(Constant Pool)에 저장되고,

연산, 제어, 메서드 호출 등은 JVM 명령어와 상수 풀에 저장된 항목을 오퍼랜드로 사용하는 바이트코드로 변환되어 코드 구현부에 저장됩니다.

728x90
반응형