컴파일(Compile) / 런타임(Runtime) / 컴파일의 흐름

컴파일(Compile)과 런타임(Runtime)


 

1) 컴파일(Compile)이란?

  • 개발자가 프로그램을 위해 작성한 소스코드를 다른 프로그램이나 기계(H/W)가 처리하기 용이한 형태로 바꾸는 과정을 말한다.

컴파일 에러

  • 컴파일 에러는 프로그램이 컴파일링되는 과정에서 발생하는 에러로 일반적으로 컴파일 에러 발생시 컴파일러는 문제를 일으킨 소스코드라인을 지적해준다.
    • Syntax Error
    • Type 체크 에러
    • 파일 참조 오류

2) 런타임(Runtime)이란?

  • 컴파일 과정을 마친 컴퓨터 프로그램이 실행되고 있는 환경 또는 동작되는 동안의 시간을 말한다.

런타임 에러

  • 소스코드가 이미 실행가능한 프로그램으로 성공적으로 컴파일이 되었더라도 여전히 프로그램의 실행중에 버그를 일으킬 수 있다. 이렇게 프로그램의 실행중에 발생하는 형태의 오류를 런타임 에러라고 한다.
  • 런타임 에러의 종류
    • 0 나누기 오류
    • Null 참조 오류
    • 메모리 부족 오류

3) 컴파일의 흐름 및 JAVA 가상 머신의 구성

  1. 개발자가 자바 소스 코드(.java)를 작성
  2. 자바 컴파일러(javac)가 자바 소스 코드파일 컴파일 수행
    • 자바 바이트코드(.class) 파일 생성
    • OS는 non-Readable, JVM은 Readable
    • 바이트 코드의 명령어는 1바이트 크기의 opcode와 추가 피연산자로 구성
  3. 컴파일된 바이트 코드를 JVM의 클래스 로더에 전달
  4. 클래스 로더가 클래스 파일을 JVM 내부로 로딩, 파일을 분석하여 런테임 데이터 영역에 배치
    • 동적 로딩을 수행하므로 런타임 시점이 되어야 모든 코드가 JVM과 링크됨
    • 클래스 로더 세부 동작
      • 로드 : 바이트 코드 파일을 가져와서 JVM 메모리에 적재
      • 검증 : 자바 언어 및 JVM 명세에 명시된 대로 구성되어 있는지 검사
      • 준비 : 클래스가 필요로 하는 메모리 할당 (필드, 메소드, 인터페이스 등)
      • 분석 : 클래스의 Constatnt Pool 내에 저장된 모든 Symbolic Reference를 Direct Reference로 변경
      • 초기화 : 클래스 변수를 적절한 값으로 초기화(static)
  5. 실행 엔진(Execution Engine)은 JVM 메모리에 적재된 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행함, 실행 방식은 두 가지로 나뉨
    • 인터프리터 : 바이트 코드 명령어를 하나씩 읽고 해석하고 실행, 명령어 실행 단위 시간은 빠르나 전체적인 실행 속도는 느림
    • JIT(Just-In-Time) 컴파일러 : 인터프리터의 단점을 보완하기 위해 도입되었으며 바이트 코드 전체를 컴파일하여 기계어로 변경한 후 해당 메소드를 더 이상 인터프리팅하지 않고 바이너리 코드로 직접 실행, 전체 실행 속도는 빠르나 초기 변환 비용이 발생

가비지 컬렉터(Grabage Collector)

  • 참조되지 않는 객체들을 탐색 후 삭제
  • 삭제된 객체의 메모리 반환
  • 힙 메모리 공간 확보(다른 공간의 경우도 확보할 경우 있긴 함)

댓글

Designed by JB FACTORY