본문 바로가기
My Image
프로그래밍/Java

[Java] JVM WORA (Write Once Run Anywhere)

by Lim-Ky 2017. 8. 17.
반응형

안녕하세요 Limky입니다. 

이번 시간에는 Java의 JVM WORA (Write Once Run Anywhere)에 대해서 알아보도록 하겠습니다.


우선 WORA (Write Once Run Anywhere)라는 개념이 탄생하게 된 배경부터 왜 JVM의 WORA (Write Once Run Anywhere)가 혁신적인 것인지 과거의 이야기부터 차근차근 살펴보면서 이해해봅시다.


1. 기계어 코딩


0과1에 대한 이미지 검색결과


컴퓨터와 처음 의사소통했던 시절.... 그 당시 개발자들은 기계어를 가지고 컴퓨터에게 복잡한 수식이나 시간이 오래 걸리는 연산 등을 시켰습니다. 예를 들어 미사일 궤적 계산 같은 연산을 계산하게 했습니다. 


우리가 이미 알다시피 컴퓨터는 멍청해서 0 과 1 만 알아들을 수 있습니다. 따라서 똑똑한 우리 인간이 0 과 1 을 가지고 나름의 규칙아래 명령을 만듭니다. 

예를 들어 1+3 수식의 연산을 애드삭이라는 계산기에게 명령할 때 2진법을 이용해서 

01010101 00000001 00001001 이런 식으로 작성하였습니다. 스트레스 받지 않나요??? 저렇게 1+3이라는 간단한 연산을 하기위해서 눈이 빠지게 0 과 1을 조합해서 코딩을 해야 했다니...


하지만 어셈블리어라는 녀석이 탄생합니다!!




2. 어셈블리어


어셈블리어는 가독성이 현저히 떨어지는 0 과 1의 지옥에서 좀 더 인간이 이해하기 쉬운 뜻이 내포된 단어들을 조합해 기계어 코딩을 대체합니다.  

위 그림과 같이 어셈블리어라는 녀석이 존재하여 우리가 어셈블리어로 코딩한 소스를 어셈블러가 기계어 코드로 변환해줍니다. 결국 컴퓨터는 0 과 1로 이루어진 기계어를 다시 전달 받습니다. 

기계어로 코딩했던 개발자들은 어셈블리어가 너무나도 감사했을 것입니다. 


하지만 어셈블리어도 완벽하게 해결해주지 못한 것이 있었습니다. 

바로 기계에 따라 어셈블리어가 영향을 받는다는 것이었습니다. 즉 A사에서 만든 컴퓨터, B사에서 만든 컴퓨터에 따라 다른 어셈블리어가 존재하기 때문에 개발자는 모든 컴퓨터에 개발 대응하기 위해 어셈블리어를 따로 공부 해야 하고, 컴퓨터마다 바이트 저장 방식(리틀엔디안, 빅엔디안)이 다르기 때문에 따로 숫자 표기법 또한 습득해야 했습니다.


결국 서로 다른 100개의 컴퓨터가 존재하면 우리는 100개의 다른 어셈블리어로 작성된 소스코드를 작성해야 한다는 것입니다. 


하지만 C언어라는 녀석이 탄생하게 됩니다!



3. C언어의 강력한 이식성


관련 이미지

http://crbtech.in 출처


C언어는 기존에 있던 어셈블리어의 단점을 보완합니다. 

단 하나의 소스코드만 작성하면, 기계에 맞는 컴파일러라는 녀석이 각 기계에 맞는 목적 파일을 만들어 주기 때문입니다. 이를 우리는 WOCA(Write Once, Compile Anywhere)라고 합니다. 

직역하면, 하나 작성하고 컴파일하면 어디든 사용 가능 정도로 이해할 수 있습니다. 

즉 하나의 소스로 모든 컴퓨터에서 실행 할 수 있도록 했습니다. 하지만 C언어도 완벽하지 못했습니다...


컴퓨터를 보면, 운영체제가 하드웨어의 특성을 파악하고, 각 운영체제에 맞는 컴파일러가 제공되는데 운영체제에 따라 또 나름의 다른 점들이 존재했기 때문에 하나의 C언어 코드소스로 컴파일하기 전 각 기종에 맞는 소스를 추가로 수정 해야 하는 수고로움이 발생했습니다. 


예를 들어 C언어를 배웠던 기억을 되짚어 봅시다. 어떤 운영체제에선 int를 2바이트로 정의하고 어떤 운영체제는 int를 4바이트로 정의합니다. 


결국 패기는 좋았으나, WOCA(Write Once, Compile Anywhere)가 아닌 Compile전 운영체제에 맞는 fix source 작업이 추가적으로 필요하게 되는 것입니다. 

결국 Write Once, fix source, Compile Anywhere 와 다를 게 없다는 것입니다.


그래도 많은 장족의 발전을 했습니다. 

(기종에 따라 다른 종류의 어셈블리어를 배워야 했지만, C언어는 C언어만 배워놓고 운영체제에 따라 다른 점만 코드에서 수정하는 정도로 대폭 공수를 줄인 것입니다.)

우리가 흔히 C언어의 특성을 이야기 할 때 "이식성이 좋다." 라는 말을 할 때가 있습니다. 이 말은 다시 말하면 기종마다 소스 코드를 작성해야 하는 어셈블리어보다 하나의 코드소스만 만들어 놓으면 기종에 상관없이 Run할 수 있다는 점을 표현한 말입니다. 이식성이 좋다는 말은 그래서 어셈블리어 보다 상대적으로 좋다는 말이지 Java보다 C언어가 이식성이 좋다는 말이 아니니 오해하시면 안됩니다.


자...이제 C++이 등장하고 Java라는 녀석이 등장합니다.

C++은 C언어에서 객체지향개념이 도입된 것이지, 우리가 오늘 알아볼 WORA (Write Once Run Anywhere)와는 큰 맥락에서 관련이 없다고 판단되어 C++은 Skip하도록 하겠습니다.



4. Java - WORA (Write Once Run Anywhere) 실현


Java Training Course

 

http://crbtech.in 출처


자... 드디어 Java가 탄생하면서 우리가 오늘 알아볼 WORA (Write Once Run Anywhere) 라는 개념이 등장하게 됩니다. WORA를 가능케 하는 것은 바로 Java의 JRE라는 녀석입니다.


C언어에서는 컴파일러를 기종별로 따로 구매하거나 구비해야 했던 불편함에서 

Java는 심지어 무료로 다른 기종의 컴퓨터를 대응할 수 있도록 해당 컴퓨터 운영체제에 맞는 JRE를 Java 공식 사이트에서 제공해줍니다.


하나의 자바소스를 실행하기 위해 우리는 기종에 맞는 JRE를 한번만 컴퓨터에 세팅해주면 됩니다.

JRE안에서는 JVM과 Java API 등 자바 파일을 실행 할 때 도움을 주는 녀석들을 포함하고 있습니다.

여기서 JVM은 말 그래로 자바 가상 기계 즉 가상의 컴퓨터를 물리적 컴퓨터의 메모리 안에 하나 더 구축하는 것을 뜻합니다. 참고로 알아 둘 것은 가상이지만, 컴퓨터를 하나 더 만드는 것과 같기 때문에 많은 물리적인 CPU, 메모리가 요구됩니다. 참고로 알아두시면 됩니다. 


자 아무튼!! 기종(플랫폼)에 상관없이 독립적으로 우리는 하나의 자바소스와 하나의 자바 컴파일러를 통해 코드를 실행 시킬 수 있게 되었습니다. 이를 우리는 WORA (Write Once Run Anywhere)라고 하는 것입니다. 한번만 작성하면 어디에서든 실행할 수 있는 것이지요!


정리하자면 C언어에서는 기종에 따른 목적파일을 생성했지만, 자바는 목적 파일을 하나만 만들고 실제 물리적인 컴퓨터 내에 자바 언어가 기종에 따라 영향 받지 않도록 JVM을 이용하여 가상 컴퓨터 환경을 구축하고 그곳에 목적 파일을 던져 자바 코드를 실행 하는 것입니다. 


물리적 컴퓨터 내에 가상적으로 자바소스가 잘 돌아가게끔 환경을 구축하는 것 자체를 JRE를 구축한다고 보시면 됩니다. JVM을 JRE가 담고 있는 것이지요.


이상 WORA (Write Once Run Anywhere)에 대해서 탄생하게 된 배경부터 WORA가 가능한 이유와 그것이 무엇인지 알아보았습니다. 


다음 시간엔 JVM의 메모리 영역에 대해서 좀 더 심화적으로 알아보겠습니다. 

감사합니다.




-출처

스프링입문을 위한 자바 객체지향의 원리와 이해 - 서적



반응형

댓글