JAVA

자바의 compile 과정

whyWhale 2021. 4. 4. 16:45

사전 지식


 

 

인터프리터와 컴파일러의 차이

인터프리터 컴파일러
한문장씩 읽고 바로 기계어 변환 후 실행 모든 소스코드를 기계어 파일로 변환하고 실행.
python,php.... c,c++,java...
한줄씩 읽어 기계어로 변환 후 실행하는 면에서 빨라보이지만 만들어둔 실행 파일만 읽으면 되므로 실행속도 더 빠르다.

 

컴파일 과정,인터프리터 과정 도식화

 

 

JVM 구조

JVM구조

전체적인 흐름 : .java -> (javaC) ->.class (JVM이 이해할 수 있는 중간 언어)(바이트코드)-> 기계어 변환

요약 : class Loader를 통해 바이트 코드를 JVM내로 로드하고 Runtime data Area로 거쳐 Execution Engine으로 들어가 바이트 코드로 변환. (2가지 방식 JIT,Interpreter) 

 

 

 

 

 

Compile 과정


.java를 javC에 의해 .class 를 생성하고 JVM의 class loader에게 전달하고 Execution Engine 들어가고 기계어로 번역한다.

 

class loader의 세부동작

  • 로드 : 클래스 파일을 가져와 JVM메모리에 로드.
  • 검증 : 자바언어 명세 및 JVM 명세에 잘 구성되었는지 검사.
  • 준비 : 클래스가 필요로 하는 메모리를 할당.(feild,method,interface ....)
  • 분석 : 클래스 상수 풀 내 모든 심볼릭 가상메모리 주소를 실제 메모리 주소로 변경.
  • 초기화 : 클래스 변수들 값 초기화.(static field)

Execution Engine의 세부동작

  • jvm 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져오 실행.
  • 실행 엔진 방식 2가지
    • Just In Time Compiler(JIT)
      • 인터프리터의 단점을 보완하기 위해 도입된 방식.
      • 인터프리터 방식으로 진행하다가 적정한 시점에 바이트코드 전체를 기계어로 변경하는 방식.
      • 전체를 변환하는 과정에서 캐싱을 이용하므로 인터프리터의 단점을 극복.
    • Interpreter : 위 설명과 동일.

 

컴파일의 전체적 흐름 도식화

 


자바 컴파일러로 바이트코드를 만들고, JVM을 거쳐 기계어로 번역하기 때문에  "Write Once, Run Anywhere" 란 문구를 가지게 되었다.

  • JVM이 설치된 기계만 있으면 모든 곳에서 작동한다.
  • OS마다 같은 코드라도 컴파일 후 생성된 기계어가 달라지는 점을 보완하였다.
  • 이러한 특징을 한 단어로 Portability 이식성이라고 한다.