JAVA

자바의 compile 과정

whyWhale 2021. 4. 4.

사전 지식


 

 

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

인터프리터 컴파일러
한문장씩 읽고 바로 기계어 변환 후 실행 모든 소스코드를 기계어 파일로 변환하고 실행.
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 이식성이라고 한다.

 

'JAVA' 카테고리의 다른 글

Garbage Collector  (0) 2021.04.25
Reflection  (0) 2021.04.16
제네릭 타입의 컴파일 영향  (1) 2021.04.10
JVM 구조와 버전에 따른 변경  (0) 2021.03.28
Wrapper Class 와Primitive Type and First Class Collection  (0) 2021.03.21

댓글