Chat 상우

[java] WORA 자바의 간략한 역사와 플랫폼 독립성 본문

Language/java

[java] WORA 자바의 간략한 역사와 플랫폼 독립성

chat-rilla 2023. 10. 26. 18:23

it 강사 chat 상우입니다.

오늘은 jvm 메모리 구조와 실행 개념의 대하여 정리하겠습니다. 

오류나 잘못된 정보가 있을 경우 댓글 남겨주시면 수정하겠습니다.

 

 

JAVA 역사

1995년 썬마이크로 시스템의 제임스 고슬링과 다른 연구원에 의해 개발된 객체지향 언어인 자바는 초창기 가전제품을 제어하기 위해 만들어진 언어였으나 다양한 업데이트를 통해 애플리케이션에서 널리 사용되는 언어가 되어 2010년 오라클에 인수가 되어 Oracle JDK / Open JDK로 구분되고 있다. 최근 이클립스 재단에서 만든 테무린 JDK도 존재한다.

요즘 웹 어플리케이션을 보면 어느 정도 규모가 형성되는 시점에서 자바를 기반으로 서버를 만드는 것을 쉽지 않게 발견할 수 있다. 이렇게 가전제품을 위해 만들어진 자바가 현대의 서버에서 사용될 수 있는 배경으로 다양한 이유가 존재하지만

그중 대표적인 "플랫폼 독립성"을 기반으로 오늘의 JVM의 개념을 알려드리고자 한다.

자바의 창시자 제임스 고슬링사진
제임스 고스링사진

플랫폼 독립성이란 

자바는 WORA (Write Once, Run Anywhere) 이라는 개념이 존재하며 이는 한 번 작성한 코드를 다양한 운영 체제에서 실행할 수 있어야 한다는 패러다임이 존재하며 이러한 기능이 가능한 이유는 자바의 가상머신(JVM) 덕분이다.

 

위의 내용을 생각해 보면 다른 언어는 C와 언어는 OS가 다르면 실행이 불가능한가에 대하여 고민을 하게 될 것인데 일반적인 언어는 컴파일러에 의존을 하게 되어 보통 플랫폼에 독립적인 코드로 작성이 되는데 이는 컴파일을 운영체제에 맞게 해주는 경우 실행이 가능하다 그러나 우리가 사용하는 라이브러리에서 타 os를 지원하는 않는 경우가 있으며 컴파일 환경이 달라 오류가 발생되는 경우가 많아 이러한 것을 플랫폼 의존적이다라고 표현할 수 있다. 

 

컴퓨터의 연산과정

JVM을 이해하기 전 우리는 먼저 컴퓨터가 연산을 처리하는 과정을 이해해보고자 한다.

  1. 명령어 가져오기
    • cpu는 프로그램 카운터 레지스터에 저장된 주소를 사용하여 명령어를 메모리에서 가져오게 되고 PC는 다음 명령어의 주소로 업데이트가 된다..
  2. 명령어 해독
    • cpu는 가져온 명령어를 해독하여 명령어의 종류와 실행할 작업을 판별하며 이런 과정을 명령어의 오퍼랜드를 식별하고 필요한 레지스터 및 메모리 위치를 결정하는 것을 포함하게 된다..
  3. 데이터 획득
    • 명령어에 따라 필요한 데이터(오퍼랜드)를 가져오게 되며 데이터는 레지스터, 메모리 또는 다른 소스에서 로드가 된다.
  4. 명령어 실행
    • cpu는 명령어를 실행하며 이 단계에서는 산술 논리 연산, 데이터 이동, 제어 흐름 변경 또는 다른 작업을 수행하며 필요한 데이터와 레지스터를 사용하게 된다.
  5. 결과 저장
    • 명령어 실행의 결과가 필요한 경우, 결과를 메모리나 레지스터에 저장하며 이렇게 하면 나중에 다른 명령어에서 사용할 수 있게 된다.
  6. 프로그램 카운터 업데이트 
    • 프로그램 카운터는 다음 실행할 명령어주의 주소를 나타내고 실행이 끝나면 다음 명령어의 주소로 업데이트된다.

위 내용은 컴퓨터의 아키텍처와 cpu의 설계된 내용에 따라서 다를 수가 있다는 점을 참고해야 한다.

이러한 개념을 우리가 jvm을 공부하기 전에 알아보는 이유는 위 과정에서 컴퓨터가 어느 시점에 우리가 흔히 알고 있는 컴퓨터는 0과 1만 알 수 있는지를 알아보기 위함이다.

컴퓨터의 데이터 전달구조

위 표현은 대략적인 설명을 위해서 생략한 그림으로 표현하였다.

일반적으로 다음과 같은 방식으로 H/W간의 데이터 통신을 위해 System bus를 통해 데이터를 주고받게 된다.

I/O에서 사용자의 입력(키보드, 마우스)와 출력(프린터, 스피커)와 같은 곳에 요청을 받고 처리하는 과정을 거치는데 이러한 데이터를 옮기는 것은 System bus가 각 요소에 연결되어 처리한다. 

위 그림에서 우리가 알아야 하는 내용은 cpu, memory, hdd의 관계이다.

cpu와 memory와 hdd의 관계

일반적으로  cpu는 HDD에 직접 접근할 수 없기 때문에 HDD에 있는 데이터를 Memory 공간에 올려두면 cpu가 해당 명령을 수행하게 된다. 이렇게 HDD에 잇는 명령을 메모리로 가져오는 과정을 명령어 가져오기라고 하며 이때 우리가 아는 것처럼 0/1로 컴퓨터가 이해할 수 있도록 2진수로 인코딩 되게 된다.

 

JVM의 역할

위와 같은 내용에서 JVM이 어떠한 역할을 하게 되는지 이제부터 알아볼 것이다.

흔히 우리가 알고 있는 S/W는 OS마다 컴파일되는 내용이 다르거나 환경이 맞지 않아 문제가 발생이 되는 등 여러 가지 이유가 있으며 이러한 에러를 해결하기 위해서 JAVA 사람이 작성한 코드 10진법 데이터를  처음에 JVM이 이해하기 쉽도록 만들어주며 이러한 과정을 컴파일이라고 하며 컴파일이 완료된 이후 JVM에서 OS에 명령을 내릴 때 인터프리터 방식으로 명령을 전달하게 되며 이러한 특징으로 자바를 하이브리드 언어라고 부른다.

이러한 방식으로 우리는 각 os에 맞는 버전에 JVM을 설치하게 되면 "Write Once, Run Anywhere" 이 가능한 자바의 플랫폼 독립성을 유지할 수 있게 된다.