ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java - 컴파일 과정
    Language/Java 2021. 10. 29. 21:09

    개요

    Java란?

     - 프로그래밍 언어

     - 컴퓨터 프로그램(애플리케이션)을 만드는 데 사용

     - 실행환경(JRE) + 실행 도구(JDK) + 라이브러리(API)로 구성

     - 쉽고 빠르게 애플리케이션 개발 가능

     

    실행환경(JRE) : 클래스 라이브러리 등 특정 Java 프로그램이 실행할 수 있는 환경을 제공

    ※ 실행 도구(JDK) : Java를 사용하기 위해 필요한 모든 기능을 갖춘 자바용 SDK

    ※ 라이브러리(API) : 프로그램을 개발하는데 필요한 기능들을 미리 만들어 놓은 것

    Java의 탄생 배경

     - Java는 썬 마이크로시스템즈의 제임스 고슬링이라는 사람과 다른 연구원들이 개발한 프로그래밍 언어로써, 1991년 그린 프로젝트라는 이름으로 시작해 1995년에 발표가 되었다.

     - 제임스 고슬링은 가전제품 내에 탑재해 동작하는 프로그램을 개발하려고 했는데, 당시에는 유닉스 기반의 배경을 가지고 있었기 때문에 사용하던 프로그래밍 언어인 C/C++의 특성상 여러 하드웨어를 커버하기에는 같은 기능의 소스를 각 하드웨어에 맞게 작성해야 하는 번거로움이 있어서 Java를 개발하게 되었다고 한다.

     

    Java의 특징

     

     - Java의 가장 큰 특징 중 하나는 어느 하드웨어(CPU) 던, 운영체제(OS)이던 상관없이 독립적으로 작동한다는 점이다.

     - 이러한 장점 덕분에 현재는 웹 애플리케이션 개발에 가장 많이 사용되는 언어가 되었다.

     - 위 같은 특징을 위해서는 JVM(Java Virtual Machine)이 필요한데, JVM은 컴파일된 코드(바이트 코드)를 실행시켜주는 가상의 컴퓨터라고 생각하면 된다.


    JVM의 동작원리

    Java 코드의 전체적인 실행 과정

     

    1. 개발자가 자바 소스코드(.java)를 작성한다.

    2. 자바 컴파일러(javac)가 자바 소스코드 파일을 컴파일한다. → 이때 나오는 파일은 자바 바이트 코드(.class) 파일로 아직 컴퓨터가 읽을 수 없는 코드이며, JVM이 이해할 수 있는 코드이다.

    3. 컴파일된 바이트 코드(.class)를 JVM의 Class Loader에게 전달한다.

    4. Class Loader는 동적 로딩을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역, 즉 JVM의 메모리에 올린다.

    5. 실행 엔진은 JVM 메모리에 올라온 바이트 코드(.class)들을 명령어 단위로 하나씩 가져와서 실행한다. → 이때 실행 엔진은 바이트 코드를 두 가지 방식으로 변경한다.

     

    Java 메모리(Runtime Data Area) 구조

     

     - Java 메모리 구조는 크게 5가지 영역으로 구분된다. 공통의 영역으로 Method Area와 Heap Area이 있으며, 스레드 별로 Stack Area, PC Register, Native Method Stack이 있다.

     - Method Area : 클래스 별로 전역 변수, 정적 변수, 메서드 정보들이 저장된다.

     - Heap Area : 런타임 중 생성되는 객체들이 동적으로 할당되는 영역이다.

     - Stack Area : 호출된 메서드의 매개변수, 지역변수, 리턴 정보들이 저장된다.

     - PC Register : 현재 실행 중인 JVM 명령어의 주소를 가리키는 레지스터이다.

     - Native Method Stack : 자바 코드에서 네이티브 코드(기계어)를 호출할 때 사용된다.

     

    클래스 로드 과정

     

     - 자바 바이트 코드(.class) 파일을 JVM의 메모리로 가져오는 과정은 아래와 같은 단계로 나뉘어서 진행된다.

     

    1. 로딩(Loading) : 클래스 파일을 가져와서 JVM의 메모리에 로드한다.

    2. 검증(Verifying) : 읽어 들인 클래스 파일이 자바 언어 명세(Java Language Specification) 및 JVM 명세에 명시된 대로 구성이 되어있는지 검사한다.

    3. 준비(Preparing) : 클래스가 필요로 하는 메모리를 할당한다.

    4. 분석(Resolving) : 레퍼런스를 실제 메모리 주소로 변경한다.

    5. 초기화(Initializing) : 클래스 변수들을 적절한 값으로 초기화한다.

     

    실행 엔진

     - 실행 엔진은 Class Loader를 통해 Runtime Data Area에 배치된 바이트 코드를 명령어 단위로 읽어서 실행한다.

     - 이 수행 과정에서 실행 엔진은 바이트 코드를 기계가 실행할 수 있는 형태로 다음 두 가지 방식으로 변경한다.

     

    1. 인터프리터 : 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행한다. 하나하나의 해석은 빠르지만 전체적인 실행 속도는 느리다는 단점을 가진다. JVM 안에서 바이트 코드는 기본적으로 인터프리터 방식으로 동작한다.

    2. JIT 컴파일러(Just In Time Compiler) : 인터프리터의 단점을 보완하기 위해 도입된 방식으로 바이트 코드 전체를 컴파일하여 네이티브 코드로 변경하고 이후에는 해당 메서드를 더 이상 인터프리팅 하지 않고 네이티브 코드로 직접 실행하는 방식이다. 하나씩 인터프리팅하여 실행하는 것이 아니라 바이트 코드 전체가 컴파일된 네이티브 코드를 실행하는 것이기 때문에 전체적인 실행 속도는 인터프리팅 방식보다 빠르다.


    출처

    https://steady-snail.tistory.com/67

     

    728x90

    'Language > Java' 카테고리의 다른 글

    Java - Primitive Type & Reference Type  (0) 2022.02.19
    Java - 인터페이스  (0) 2021.12.08
    Java - 객체지향언어  (0) 2021.12.07
    Java - 가비지 컬렉션(Garbage Collection)  (0) 2021.11.15
    Java - 자바 가상 머신(Java Virtual Machine)  (0) 2021.11.09

    댓글

Designed by Tistory.