[Java]Java의 크로스 플랫폼 이해하기

LeeYulhee·2023년 9월 19일
0

👉 크로스 플랫폼(cross-platform)이란?


  • 특정 언어로 작성한 코드를 여러 플랫폼에서 실행할 수 있다는 의미
  • 즉, 여러 디바이스와 운영체제에서 실행 가능한 소프트웨어



👉 기존의 컴파일 방식


  • C 언어
    • 소스 코드 → 전처리(전처리기) → 컴파일(컴파일러 : 어셈블리 코드나 중간 코드로 변환) → 어셈블(어셈블러 : 어셈블리 코드를 기계어로 변환) → 링킹(링커가 여러 파일 등을 하나의 실행 파일로 합침) → 실행 가능한 파일(.exe, .out)
  • 특징
    • 컴파일을 하면 실행 파일이 나옴
    • 실행 파일은 기계어이며 운영체제가 직접 실행하는 파일
    • 각 운영체제/디바이스마다 실행 파일을 따로 만들어야 함
      • 컴파일러가 소스 코드를 각 운영체제/디바이스에 맞는 기계어로 바꿔 줌
      • 소스코드는 안 바꿔도 됨
      • ⇒ 소스 코드는 크로스 플랫폼이지만 실행 파일은 크로스 플랫폼이 아님



👉 자바의 컴파일


  • 소스 코드 → 컴파일(.class 파일인 바이트코드로 변환) → 바이트코드 로드(프로그램 실행 시, JVM이 .class 파일을 로드) → JIT 컴파일 및 인터프리트(바이트코드를 실제 기계어로 변환) → 실행(변환된 기계어가 CPU에서 실행, 프로그램 동작)
  • 코드를 컴파일한 결과는 실행 파일이 아니라 바이트 코드
    • 바이트 코드(byte code)란?
      • 바이트 코드는 운영체제가 이해하는 기계어가 아니라 중간 언어로, 실제 기계어로의 변환은 실행 시점에 이루어진다
      • JVM이 이해하는 명령어로 JVM이 실행 중에 최종 플랫폼에 맞는 명령어로 바꿔서 실행해줌
      • JVM에 맞게 최적화됐지만 당연히 기계어보다는 느림



👉 자바 가상 머신(Java Virtual Machine, JVM)


  • 운영체제에 설치하는 별도의 프로그램으로 각 운영체제/디바이스마다 다른 버전을 설치
    • JVM은 플랫폼마다 다르기 때문에 플랫폼 종속적이라고 할 수 있음
      • Java 언어는 JVM 덕분에 운영체제(플랫폼)에 종속적이지 않음
  • Java의 바이트 코드를 실행함
  • 따라서 운영체제나 디바이스의 영향을 받지 않음
  • 다만 JVM이 설치 안 되어 있다면 Java 프로그램을 실행할 수 없음
    • 따라서 Java의 플랫폼은 JVM이라고 할 수 있고, JVM이 없는 환경에서 실행할 수 없다 보니 이런 관점에서 크로스 플랫폼이라고 하기엔 어폐가 있음
  • JVM이 바이트 코드를 실제 디바이스에서 실행하는 방식은 다양함
    • 과거 JVM은 인터프리터 방식으로 동작
    • 최신 JVM은 JIT(Just-In-Time) 컴파일을 추가
      • JIT(Just-In-Time) 컴파일은 프로그램 실행 시점에서 일어나는 컴파일 방식
      • 초기에는 인터프리터 방식으로 코드를 실행하다가, 자주 사용되는 부분의 코드를 기계어로 변환하여 나중에 빠르게 실행할 수 있도록 하는 기법
      • 이렇게 변환된 기계어는 캐시에 저장되어, 같은 코드가 다시 실행될 때 더 빠르게 수행
    • 여러 가지 컴파일 방식이 공존하는 형태
profile
공부 중인 신입 백엔드 개발자입니다

0개의 댓글