Java

[Java] 특징부터 C/C++ vs Java 실행 환경 차이 비교

yujinius 2024. 4. 3. 19:26

Java 특징: WORA (Write Once Run Anywhere)

  • 컴파일 : 고급 언어를 컴퓨터가 해석할 수 있는 기계어로 바꿔주는 과정
  • 컴파일러: 컴파일 해주는 소프트웨어
  • C/C++ 등 자바 이전의 프로그래밍 언어들의 컴파일러는 기계어 코드로 변환할 때 프로그램이 실행될 대상의 컴퓨터의 CPU와 운영체제에 종속적인 코드로 변환한다. 
  • 위의 이유로 같은 코드를 다른 플랫폼(다른 CPU or OS)에서 실행하려면 아래 2가지 중 하나를 해야 함
    1. 다시 컴파일하기
    2. 플랫폼에 맞도록 코드를 수정
  • 같은 리눅스인데 CPU가 다르면 다시 컴파일 or 코드 수정, 같은 CPU인데 리눅스의 것을 윈도우에서 실행하려고 해도 컴파일 or 코드 수정 필요 => 플랫폼 종속성(platform independence)

플랫폼 = 하드웨어 플랫폼 + 운영체제 플랫폼
1. 기계어가 CPU마다 다름
2. 운영체제마다 API가 다름
3. 운영체제마다 실행파일 형식 다름

 

 

 

[Java] 자바의 탄생

자바의 탄생 1991년 선마이크로시스템즈(SUN Microsystems)는 제임스 고슬링(James Gosling)이란 엔지니어를 중심으로 그린 프로젝트(green project)라는 이름으로 가전제품에 사용할 소프트웨어 개발 시작

yujinius45.tistory.com

  • 운영체제 하드웨어 상관 없이 가상 가상 기계(JVM)가 있으면 어디서나 자바로 작성된 프로그램에 1. 동일한 실행 환경을 제공하며 2. 동일한 실행 결과를 기대할 수 있음
  • 자바는 웹 브라우저, 분산 환경의 지원 등으로 네트워크에 연결된 어느 클라이언트에서도 실행 가능
  • 어디서든 한 번 작성하면, 다시 컴파일하거나 수정하지 않고, 어떤 하드웨어에서나 운영체제에서도 실행시킬 수 있음 => 이를 WORA(Write Once Run Anywhere) 라고 함

 

 

자바 가상 기계와 바이트 코드

  • 자바의 플랫폼 독립성을 가능하게 하는 것은 ① 자바 가상 기계(JVM)와 ② 바이트 코드 때문임

 

바이트 코드

  • 바이트 코드는 자바 가상 기계에서만 실행되는 기계어
  • 어떤 CPU와도 관계없는 바이너리 코드(binary code)
  • 자바 컴파일러는 자바 소스 프로그램을 컴파일하여 바이트 코드로 된 클래스 파일 생성
  • 클래스 파일은 컴퓨터의 CPU에 의해 직접 실행 X
  • 자바 가상 기계 JVM이 인터프리터 방식으로 바로 실행 가능
  • 오라클에서 배포하는 JDK(Java Development Kit)에는 자바 클래스 파일을 디어셈블(disassemble)하여 바이트 코드를 볼 수 있는 도구(javap)를 제공

 

자바 가상 기계(JVM)

  • 소프트웨어
  • 서로 다른 플랫폼에서 자바 프로그램이 실행되는 동일한 환경 제공
  • BUT 자바 가상 기계는 플랫폼마다 서로 다르게 작성되어 배포되며 플랫폼 종속적
  • 자바 가상 기계는 자바 개발사인 오라클 뿐만 아니라 IBM, 마이크로소프트 등 다양한 회사에서 제작 공급 중

 

C/C++ vs Java 실행 환경

C/C++ 프로그램의 개발 및 실행

 

  • 링크의 과정을 통해 만들어진 .exe 실행 파일에는 실행에 필요한 모든 코드가 다 들어 있음
  • .exe 파일만 있으면 실행에 아무 문제 없음
  • .exe 파일이 매우 큰 경우 적은 량의 메모리를 가진 컴퓨터는 처음부터 실행조차 할 수 없는 문제점 있음

 

  • 장점: 하나의 실행 파일
    • 실행 최적화
    • 실행 속도 빠르다
    • 유효타임 실시간이 중요할 때는 C가 좋다(자바 적합 X)

 

  • 단점: 실행 파일이 크고 메모리 많이 잡아 먹는다

 

  • ① C 컴파일러 + ② 링커 = 빌드
  • 빌드를 통해 실행 파일을 만든다
  • 실행 파일은 컴퓨터 CPU가 바로 실행한다

 

자바 프로그램의 개발 및 실행

 

 

  • 자바에는 하나의 실행 파일(.exe)로 뭉치는 링크의 과정이 없음
  • 여러 클래스 파일 중 하나를 실행 => 실행 도중 다른 클래스 파일이나 자바 API의 클래스 파일 필요시 => 자바 가상 기계는 그  때 그 클래스 파일을 로딩하고 실행
  • 당장 실행할 클래스 파일만 로딩하여 사용 => 적은 량의 메모리를 가진 컴퓨터에서 얼마든지 큰 자바 응용프로그램을 실행할 수 있음
  • 플랫폼 독립성과 함께 달성하고자 하는 자바 언어의 본질
  • 메모리가 충분한 PC에서는 실행 중에 클래스 로딩으로 인한 시간을 줄이기 위해 사용자 클래스 파일과 필요한 자바 클래스 파일을 미리 로딩해둠

자바 특징

① 플랫폼 독립성

② 하나의 실행 파일(.exe)로 만드는 링크 과정이 없고, 필요할 때 클래스 파일을 로딩하여 실행하기 때문에 적은 메모리로 실행 가능

 

자바와 C/C++의 실행 비교

자바 자바 소스 파일
TEST.java
자바 컴파일러 바이트 코드
TEST.class
자바 프로그램
TEST.class
자바 가상기계 위에서 실행
[JVM - OS - H/W]
C/C++
(C++일 때)
소스 파일
TEST.cpp
C++ 컴파일러/링커 바이너리 실행 파일
TEST.exe
C++ 프로그램
TEST.exe
CPU가 바로 실행
[OS-HW]

 

자바와 C/C++의 비교

자바

  • 자바는 컴파일러가 바로 바이트 코드(.class)를 생성하며, 링크 과정이 없다. 
  • 바이트 코드는 자바 가상 기계(JVM)에서만 실행 가능
  • 자바는 실행시간에, 필요한 클래스들이 자바 가상 기계에 의해 링크되며 클래스 로더가 필요한 클래스를 동적으로 로딩한다.
  • ClassLoader 객체를 이용하여 개발자가 직접 클래스를 로딩할 수도 있다.

C/C++

  • C/C++에서는 컴파일러가 중간 단계인 목적 코드를 새성한 후 링커가 필요한 라이브러리들을 링크하여 최종 실행 가능한 .exe 파일을 만든다.
  • 정적 라이브러리의 경우 실행 파일에 포함시키므로 실행 파일 크기가 커진다.
  • 동적 라이브러리의 경우 실행 시간에 링크가 일어난다. 
  • 목적 코드 및 실행 파일은 플랫폼에 따라 다르므로, 플랫폼이 바뀌면 소스 코드를 수정하거나 컴파일과 링크를(컴파일+링크=빌드)를 새로 해야 한다.