JAVA의 컴파일, 런타임 원리

wjd15sheep·2024년 3월 19일

JAVA

목록 보기
1/2

1. JAVA란?

자바(Java)는 강력하면서도 널리 사용되는 프로그래밍 언어로, 특히 객체 지향 프로그래밍(OOP)의 개념을 기반으로 합니다. 자바를 사용하면 좋은 이점은 자바 애플리케이션은 다양한 운영체제에서 JVM만 있으면 실행 할 수있어 "한 번 쓰고, 어디서나 실행"의 이점을 가지고 있습니다.

  • JVM이란 Java Virtual Machine의 줄임말로 자바를 실행하기 위한 가상 컴퓨터를 말합니다. 다른 말로 OS에 종속받지 않고 CPU가 Java를 인식, 실행할 수 있게하는 가상 컴퓨터입니다.

JAVA 코드를 잘 작성한다는 건 Class 같은 요소들에 대한 목적, 의의, 특성 문법을 잘 다루고 이해한 요소들을 어덯게 조합할 것인지에 대한 SOLID를 제대로 이해하고 적용할수 있다는 것이다.(다음 글에서 다루겠습니다.)

자바의 기본 배경을 간단하게 설명했고 이제 작동 원리를 설명하겠습니다.

2. JAVA의 컴파일 원리

자바 파일 실행 과정 이미지
(ref2. dalpang.e님 블로그)

자바의 동작 과정은 크게 세 단계로 나눌 수 있습니다.

  • 소스 코드 작성
  • 컴파일 과정
  • 런타임 과정

소스 코드 작성은 개발자가 작성하는 과정을 의미 합니다.
컴파일 과정과 런타임 과정에 대해서 알아보도록 하겠습니다.

컴파일 과정 이미지

컴파일은 간단하게 고급 프로그래밍 언어로 작성된 소스 코드를 컴퓨터가 이해할수 있는 기계언어로 변환하는 과정을 말합니다.

자바에서는 자바 소스(.java)파일을 바이트코드로 변환하고 이를 기계어로 변환하는 과정을 거칩니다.

자바 소스(.java)파일을 바이트코드로 변환하는 과정에는 자바 컴파일러(javac)가 관여합니다.
(바이트코드는 .class 파일에 저장이 되며 가상 머신(JVM)이 이해 할 수 있는 중간 언어입니다.)

2.1 자바 컴파일러(Javac)

자바 컴파일러(Javac)는 소스 코드를 분석, 중간 코드 생성, 바이트코드 생성 으로 진행이 됩니다.

  • 소스코드 분석 에서는 렉싱, 파싱을 진행합니다.

    • 렉싱(lexical analysis) : 소스 코드를 읽어서 토큰이라는 기본 요소들로 분해, 이 과정에서 공백, 주석 등을 제거하고 변수명 키워드, 연산자 등을 식별합니다.

    • 파싱(parsing) : 토큰들을 구문 분석하여 그 구조를 이해합니다. 소스 코드가 정확한 문법에 따라 작성되었는지 검사하며, 문법적 오류가 발견되면 컴파일 과정이 중단됩니다. 파싱 과정을 통해 추상 구문 트리가 생성됩니다.

  • 중간 코드 생성

    • 추상 구문트리를 바탕으로 중간 코드를 생성합니다. 이 중간 코드는 바이트코드가 되기 전의 형태입니다.
  • 바이트코드 생성

    • 중간 코드를 기반으로 실제 바이트코드를 생성합니다. 바이트코드는 .class 파일에 저장이되며 JVM이 이해하고 실행할 수 있는 형태입니다.

2.2 인터프리트, JIT

컴파일된 바이트코드(.class 파일)가 자바 가상 머신(JVM)에 의해 실행됩니다. JVM은 바이트코드를 해당 플랫폼의 기계어로 변환하고 실행하는데 이 과정을 '인터프리트' 또는 'JIT 컴파일'이라 합니다.

  • 인터프리트 : 바이트코드를 명령어 단위로 기계어로 변환하며 실행하기 때문에, 전체 프로그램을 미리 컴파일하는 방식에 비해 상대적으로 느릴 수 있습니다.

    인터프리트가 있어 JVM이 있는 플랫폼이라면 어디든지 java 컴파일된 파일을 실행할 수 있습니다. 이는 독립성과 이식성을 나타냅니다.

  • JIT 컴파일 : Just-In-Time 컴파일러, 프로그램 실행 중 자주 사용되는 바이트코드 부분을 실시간으로 기계어로 컴파일하여 실행 속도를 향상시킵니다.

JVM이 프로그램을 실행할 때, 인터프리터 방식과 JIT 컴파일 방식은 서로 보완적으로 작용하여 프로그램의 실행 효율을 최적화합니다.

3 런타임 원리

런타임 과정은 자바 가상 머신(JVM) 위에서 실행되는 과정을 말합니다. 컴파일러에 의해 생성된 바이트코드(.class)가 JVM에 로드되어 실행되는 단계입니다.

3.1 클래스 로더(Class Loader) 작동

  • Loading
    JVM은 프로그램 실행에 필요한 클래스(.class 파일들)를 로드합니다. 이 과정에서 로더는 필요한 바이트코드를 메모리로 가져오고, 이 클래스들의 참조를 생성합니다.

  • Linking
    로드된 클래스들은 검증, 준비, 그리고 해석과정을 거칩니다. 이 단계에서 클래스의 바이트코드가 올바른지 검증하고, 변수에 메모리를 할당하며, 필요한 다른 클래스와의 참조를 연결합니다.

  • Initialization
    클래스 변수들이 초기값으로 설정됩니다. 이는 정적 변수에 할당된 값들이 실제로 적용되는 단계입니다.

3.2 실행(Execution)

JVM 인터프리터 또는 JIT 컴파일러: JVM은 바이트코드를 한 줄씩 해석하여 실행하거나, JIT 컴파일러를 사용하여 바이트코드 전체를 플랫폼의 기계어로 변환하여 실행합니다.

3.3 런타임 데이터 영역

JVM은 실행 중에 여러 데이터 영역을 사용합니다.

  • Heap : 객체와 배열이 할당되는 영역, 가비지 컬렉터에 의해 관리됩니다.
  • 스택 : 각 스레드마다 실행 중인 메서드의 지역 변수, 매개 변수 등을 저장하는 영역
  • 메소드 영역 : 클래스 정보, 상수 정적 변수등을 저장하는 영역
  • 프로그램 카운터 : 현재 실행중인 JVM 명령의 주소를 저장합니다.

자바 런타임 과정은 컴파일된 바이트 코드가 실제로 실행되는 단계로 JVM의 다양한 구성 요소와 메커니즘이 작동하는 복잡한 과정입니다.


참조

profile
성장 위해 노력하는 웹 개발자 주니어

0개의 댓글