Live-Study

1주차 과제 : 컴파일 하는 방법

WOOKTAE 2021. 2. 22. 23:39

Java Compiler

흔히 우리가 JIT Compiler 라고 부르는 Compiler 는 실행중에 바이트 코드를 여러가지 다양한 테크닉을 사용하여 JVM 해석 엔진 없이 바로 수행되는 기계어 코드를 만들어 낸다. 그럼으로써 바이트 코드가 가지는 장점과 기계어가 가지는 장점을 결합할 수 있다.

 

과정 

 

1. Java Compiler (javac 명령어 실행)에 의해 Java Source ( .java 확장자) 로부터 Byte Code ( .class 확장자 )가 생성된다. 

2. JVM에 있는 Class Loader 에 의해 Byte Code는 JVM내로 로드되고 실행엔진에 의해 기계어로 해석되어 메모리 상 ( Runtime Data Area)에 배치된다. 

3. 실행엔진에는 Interpreter와 JIT ( Just - In - Time )compiler 가 있는데, Interpreter에 의해 Byte Code를 한 줄씩 읽어 실행하다가 적절한 시점에 Byte Code 전체를 컴파일하고 더이상 인터프리팅하지 않고 해당 코드를 직접 실행한다.

 

  • JIT Compiler 에 의해 해석된 코드는 캐시에 보관하기 때문에 한번 컴파일된 후에는 빠르게 수행할 수 있다는 장점이 있다. 하지만 코드 전체를 컴파일하기 때문에 인터프리팅하는 것보다 시간이 오래 걸리므로 한번만 실행해도 되는 코드에 대해서는 인터프리팅하는 것이 유리하다.
  •  Interpreter : 자바 Byte Code를 한줄씩 실행, 전체 성능면에서 불리
  • JIT Compiler : 전체 Byte Code를 컴파일하고 캐시에 보관해 놓고 직접 실행. 한 번만 실행해도 되는 코드에 대해서는 Interpreter가 유리하다.       

장점

  • 생성되는 코드의 안정성
    • Java 가 수행중 만들어 내는 기계어 코드는 안전한 공간(sandBox)안에서 돌아가기 때문에 외부 해킹에 안전
  • 동작하는 메모리 공간의 안전성
    • 모든 자바 객체들은 Heap 이라는 독립적인 공간에서만 수행
    • 다른 Process 와 다른 메모리 공간을 사용하기 때문에 Stack Overflow에 강함
  • 최적화 재사용에 유일한 관련 클래스간 상속구조
    • 메모리 위치상 가깝게 관련된 객체와 메소드들을 위치시킨다.
    • method inlining 같은 성능을 높이기 위한 테크닉들이 자바에서 효율적으로 작동
  • 동적 최적화와 그것에 대한 취소, 재 최적화 가능
    • Static 언어와 다르게 Dynamic class loading 으로 어떤 방식으로든 수행중 변경 가능 compiler 를 통한 최적화가 수시로 이루어 진다.

Compiler 기술들 

  • Hot Spot Detection
    • JVM이 Byte Code를 해석하다가 루프등을 만나 몇번이나 중복적인 해석이 이루어진다 판단되면 Byte 코드를 기계어로 직접 컴파일하는 방식
    • 기존의 모든 기본 코드를 수행전에 컴파일 하는 방식은 수행 자체는 빠르지만 프로그램 크기가 커지고 기기별 이식성이 떨어지기도 한다.
  • Method inlining
    • 클래스 안에서 사용된 다른 클래스에 대해 Method inlining 을 수행함으로서 다른 메모리 공간에 있는 메소드에 대해 호출하는 것을 피할 수 있다.
    • 이걸 취소할 수도 있다.
  • Reflection
    • 객체를 명시적으로 코드에서 new하지 않아도 임의의 객체를 동적으로 생성하고 메소드를 호출할 수 있는 reflection 은 자바 동적 클래스로딩의 핵심

출처 : https://gblee1987.tistory.com/173
출처 : https://gblee1987.tistory.com/173
출처 : https://catch-me-java.tistory.com/9
출처 : https://catch-me-java.tistory.com/9
출처 : https://catch-me-java.tistory.com/9 여긴 꼭 다시 들어가서 보자