Java와 JVM -2

Newbie's Log 2014. 10. 18. 23:42

지난 포스팅에서 Java는 "Write Once, Run Everywhere"라는 하나의 철학(물론,JRE에 기반하기 때문에 꼭 그렇지만은 않다;;;)으로 시작되어 발전된 개념인데 이 철학을 실현하기 위해 Java는 아래와 같은 네 가지의 상호 연관된 기술을 엮어놓았다고 설명을 했다 


- The Java Programming Language

- The Java Class File Format

- The Java Application Interface

- The Java Virtual Machine(JVM)


오늘은 이 4가지 기술 중 The Java Programming Language와 The Java Class File Format 에 대해 자세히 설명하고자 한다. 


Java Programming Language


보통 Java라는 언어를 언급할 때 가장 자주 등장하는 것이 바로 객체지향이라는 단어이다. 그러나 프로그램 언어 측면에서 Java의 가장 큰 특징은 무엇보다 생산성의 극대화와 동적인 면에 있다고 생각한다. 


java에는 Multi-Threading,구조화된 에러 핸들링, Garbage Collection, Dynamic Linking,Dynamic Extension 등의 기술

들이 있지만 이 중에서 방점을 찍고 싶은 기술은 다름아닌  Dynamic Linking이다. Java의 Class파일은 엄밀히 말하면,저번 포스팅에서도 말했듯이 실행 가능한 형태로 변경된 것이 아닌 JVM이 읽을 수 있는 형태로 번역된 것으로 이해할 수 있다. 이것은 JVM위에서 다시 실행 가능한 형태로 변형된다. 실행을 위한 Linking작업은 그때 일어나게 된다. 

Class파일은 실행시 Link를 할 수 있도록 Symbolic Reference만을 가지고 있다. 이 Symbolic Reference는 Runtime시점에서 메모리상에서 실제로 존재하는 물리적인 주소로 대체되는 작업인 Linking이 일어나게 되는 것이다. 이러한 Link작업은 필요할 때 마라 동적으로 이루어지기 때문에 이를 가리켜 Dynamic Linking이라고 한다. 


이 Dynamic Linking이라는 기술 덕분에 Class파일의 크기를 작게 유지할 수 있다. 

이것은  Java의 철학을 구현한다는 의미로 확대 된다. Java는 플랫폼에 독립적이기 때문에 Compile된 파일만 있으면 그대로 수행이 가능하다. 또한 Network을 통해 객체를 전송하고, 배포하는데 있어 파일의 크기는 작을수록 유리하다는 것은 충분히 예상 가능한 것이다. 그렇기 때문에 Compact한 Class파일은 Java의 철학을 실현하는데 있어 필수적인 요소가 되고 있다. 

하지만 무엇보다 프로그램의 언어로서 Java가 지니고 있는 특징은 생산성을 극대화 한다는 데 있다. 

Java가 생산성을 가질 수 있게 된 것은 역시 Runtime Memory를 직접 핸들링 하지 않기 때문이다.Java사용자는 Runtime Memory를 핸들링 해서도 안되고, 또한 할 수 있는 방법도 전혀 없다는 의미이다.(물론 핸들링을 할 수 있지만 왠만하면 사용하지 말라고 한다 ;;)이를 위해 Java는 Garbage Collection과 같은 기술을 채용했고 이는 개발 및 운영에 소요되는 시간과 노력을 많이 단축시켜 주었다. 



Java Class file format


Java는 개발자가 작성한 프로그램을 Compiler를 통해 Class파일로 재생성되는 과정을 거치게 된다. 

이렇게 생성된 Class파일은 다음의 네 가지 특징을 가지게 된다. 


-Compact한 형태 

-Bytecode로의 변경

-Platform 독립적

-Network Byte Order의 사용 


Java의 철학을 가장 두드러지게 대변하는 것이 바로 이 Class File Format이다. Class 파일은 Bytecode를 Binary형태로 담아놓는 것이라 할 수 있다. 

Bytecode는 JVM이 읽을 수 있는 언어를 의미한다.  Bytecode는 Java의 철학을 실현하는 중요한 요소들 중 하나이다. Bytecode가 JVM을 위한 언어라는점, 모든 Code가 Bytecode의 Binary형태로 실체화된 Class라는 것으로 배포된다는 점은 Platform의 제약을 뛰어 넘을 수 있게 되었다는 것을 의미하기 때문이다.  JVM이 Unix에 설치되어 있건,Windows에 설치되어있건 상관없이 Bytecode는 동일하게 수행된다. 이것을 다르게 표현하면 'Platform 독립적이다'라고 하는 것이다. 


또한 Bytecode는 Source Code를 단순히 JVM의 언어로 번역해 놓은 것이기 때문에 Source Code와 비슷한 크기를 가지고 있다. Compiler를 통해 실행파일로 변경되는 과정에서 Library들을 포함하는 C++과 같은 언어에 비한다면 아주 작은 크기라 할수 있다.  Class파일에는 라이브러리를 포함하지 않고, 단지 Symbolic Reference만을 가지고 있는데 Symbolic Reference는 참조하고자 하는 대상의 이름만으로 참조관계를 구성하는 것을 의미한다.  Class파일이 JVM에 올라가게 되면 Symbolic Reference는 그 이름에 맞는 객체의 주소를 찾아서 연결하는 작업을 수행한다. 이러한 과정을 Dynamic Linking이라 하는데 이것덕분에 Class 파일은 Compact한 형태를 유지 할 수 있는 것이다. 


마지막으로 Java Class file format 는 Network Byte Order를 사용한다는 것이다. Network Byte Order는 서로 다른 계열의 CPU끼리 데이터를 전송 받을 때의 문제점을 해결하기 위해 정해진 일종의 약속이다. RISC계열의 CPU를 사용하는 Unix머신에서 Pentium CPU를 장착한 Windows로 데이터를 보내는 것을 가정하자. Byte Order를 고려하지 않고 보낸다면 서로의 데이터는 주소가 반대로 되어 있어 제대로 전송되지 않을 것이다. 그렇기 때문에 Network를 통해 데이터를 전송할 때는 통일된 방식을 따르기로 약속을 했는데 이것이 바로 Network Byte Order 이다. Nerwork Byte Order는 Big Endian을 사용하기로 약속이 되어 있다. 

Class File Format은 Network Byte Order를 사용하기 때문에 Big Endian 방식을 사용하게 된다. 


이렇게 2가지 기술에 대해 설명해 보았다.

다음 포스팅에는 The Java Application Interface, The Java Virtual Machine(JVM)에 대해 설명하도록하겠다. 


참고

Java Perfomance Fundamental(김한도 저) 

Posted by 알 수 없는 사용자
,