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 명령어와 상수 풀에 저장된 항목을 오퍼랜드로 사용하는 바이트코드로 변환되어 코드 구현부에 저장됩니다.
'java' 카테고리의 다른 글
[java] 임시 비밀번호 생성 (Random vs SecureRandom vs RandomStringUtils) (7) | 2020.10.31 |
---|---|
[java] 예외처리 Exception handling (0) | 2020.10.11 |
[java] 자바에서 split("|") 사용하기 - 이스케이프 처리 (0) | 2020.10.11 |
[mybatis] insert/update 쿼리 실행 후 결과값 가져오기 (useGeneratedKeys, keyProperty, selectKey) (0) | 2020.10.09 |
[mybatis] $ 와 # 의 차이 (0) | 2020.10.08 |
댓글