C, Java 의 컴파일 과정과 JVM 메모리 구조

2021. 3. 6. 18:36Study

C언어의 Build

소스 -> (컴파일러의  컴파일) -> 목적파일 -> (링커의  링크) -> 실행파일

 

Build 란 ?

  • 소스 파일을 다음 단계를 거쳐 실행파일이 생성되는 과정

 

Compiler 와 Linker

  • 컴파일러
  •     - 고급언어를 저급언어로 변환하여 목적파일에 써 넣는 역할 (=컴파일)
  • 링커
  •    - 목적파일을 실행파일로 바꾸고 OS에 맞도록 형태를 바꾸는 StartUp 이라는 추가 코드를 삽입하는 역할 (=링크)
  • 컴파일러가 생성하는 저급언어는 특정 CPU와 OS에서만 동작하기 때문에 컴파일러는 플랫폼에 종속적이다.

 

목적 파일이라는 중간 과정을 거치는 이유 ?

  • 하나의 소스에 필요한 모든 명령을 다 기술할 수 없다.
  • 그렇기에 여러 개의 소스를 합쳐 하나의 exe 파일을 만들어 내기 위함이다.
  • 소스를 여러 개 작성하고 이것을 모두 연결하면 완전한 exe 파일이 된다.

 


Java언어의 Build

            1. 자바 파일(*.java)을 자바 컴파일러인 javac.exe 가 컴파일을 진행한다.
            2. JVM 이 이해할 수 있는 중간 단계의 언어인 Byte Code(*.class)로 변경 작업을 진행한다.
            3.    - Bytecode(*.class)는 반 기계어 상태로 현재는 컴퓨터가 읽을 수 없다. 따라서 변환 과정이 더 필요하다.
            4. 생성된 Bytecode(*.class) java.exe 로 실행한다.
            5. JVM Class Loader Bytecode(*.class) JVM 내로 가져온다.
            6. Byte Code Verifier에서 Bytecode(*.class)의 오류나 버그를 검증한다.
            7. 실행엔진에 의해 Binary Code(기계어)로 해석된 코드를 메모리 상(Runtime Data Area)에 배치한다. (이때 변환된 Binary Code는 JVM의 클래스 영역에 저장된다.)
            8.  - 이때 변환된 Binary Code는 JVM의 클래스 영역에 저장된다.                                                                 - 실행엔진에는 바이트 코드를 기계어로 변환하는 두 가지 방식이 있다.                                                   - Interpreter와 JIT(Just-In-Time) Compiler이다. 둘의 차이점은 아래에서 설명하겠다.

 

인터프리터(Interpreter) JIT(Just In-Time) Compiler

            • Interpreter는 사용자가 작성한 소스코드를 한 줄 씩 읽고 바로 기계어로 바꿔준다. 그 후에 변환된 코드를 실행한다. 그렇기에 실행이 느린 단점이 있다. 이러한 단점을 보완하기 위해 나온 것이 JIT Compiler이다.
            • JIT Compiler Interpreter 방식으로 실행을 하다가 적절한 시점에 Bytecode(*.class) 전체를 컴파일 한 뒤, 더이상 인터프리팅 하지 않고 해당 코드를 직접 실행한다. JIT Compiler에 의해 해석된 코드는 캐시에 보관한다. 그렇기에 한 번 컴파일 된 후에는 캐싱을 통하여 같은 함수가 여러 번 호출되어도 기계어를 다시 새롭게 생성하지 않고 기존에 만들어 놓은 기계어를 불러온다.
            • 비록 런타임시 시간은 오래 걸리지만 수행 시간은 빠르다. 하지만 한번만 실행하면 되는 코드는 캐시에 저장할 필요가 없으므로 인터프리팅이 유리한 건 사실이다.

 

메모리 구조

 

JVM 이란?

          • 자바 가상 머신 (Java Virtual Machine) 의 줄임말 이며 Java Byte Code를 OS에 맞게 해석 해주는 역할
          • Java compiler는 .java 파일을 .class 라는 Java byte code로 변환 시켜 주고, Byte Code 는 기계어가 아니기 때문에OS에서 바로 실행되지 않는다. 이때 JVM은 OS가 ByteCode를 이해할 수 있도록 해석 해준다.
          • 어떠한 OS Java 가 설치 되어 있다면 JVM에 의해 자바 파일(*.java) 이 기계어로 해석 될 수 있다. 즉, Bytec code 는 JVM 위에서 OS 상관없이 실행 된다. 이러한 장점은 OS에 종속적이지 않고 Java 파일 하나만 만들면 어느 디바이스든 JVM 위에서 실행이 가능하게 된다.
          • JVM은 크게 Class Loader, Runtime Data Areas, Excution Engine 3가지로 구성되어 있다.
          • JVM의 해석을 거치기 때문에 c언어 같은 네이티브 언어에비해 속도가 느렸지만 JIT(Just In Time)컴파일러를 구현해 이점을 극복하였따.
          • 메모리 관리를 자동으로 해준다 (GC)

'Study' 카테고리의 다른 글

객체 지향 설계의 5가지 원칙 (SOLID)  (0) 2021.04.11
유클리드 호제법의 개념과 Java 코드  (0) 2021.03.16