개발하는 뚝딱이

[Java] 자바 컴파일 과정 본문

기타

[Java] 자바 컴파일 과정

개발자뚝딱이 2020. 1. 9. 13:39
  • 자바의 역사
  • 프로그래밍 언어
  • 인터프리터와 컴파일러
  • 자바의 컴파일
  • 자바의 특징

자바의 역사

  자바는 1990년대에 Sun Microsystems에서 개발되었습니다. 당시 썬의 엔지니어 부서 중 하나인  'Green Team'은 이제 곧 소비자 개개인의 물건에 컴퓨터가 있는 시대를 예감했고 이를 위해 새로운 언어를 개발했습니다. 당시 'Green Team'의 깃에서 'greentalk'라고 부르다가, 이름의 필요성을 느끼고 'oak'라 이름 지었습니다. 가전제품에 임베디드 곧 소비자 개개인의 물건에 컴퓨터가 있는 시대를 예감했고 이를 위해 새로운 언어를 개발했습니다. 당시 'Green Team'의 깃에서 'greentalk'라고 부르다가, 이름의 필요성을 느끼고 'oak'라 이름 지었습니다. 냉장고, TV와 같은 가전제품에 칩을 탑재할 용도로 이 언어는 만들어졌으나 이 아이디어 자체가 시대를 너무 앞섰습니다. 당시 하드웨어가 이러한  프로그램을 구동할만큼의 성능이 되지 않아 결국 성공하지는 못했으나, 어느덧 인터넷 시대가 되면서 'oak'는 웹 애플리케이션에 적합한 언어로 되었고 1995년 Java1.0으로 세상에 나오게 되었습니다. (2019년 기준 Java 13 배포)

  꽤 오랜 시간 동안 큰 힘을 발휘했던 썬은 결국 지난 2010년 오라클에 인수되었습니다. 현재 자바를 다운로드하기 위해서는 오라클 페이지에 접속해야 합니다. 그러나 오라클의 유료화 선언이 발표되고 많은 많은 사용자들과 구글에 논란이 있습니다. 결론은 자바는 무료로 사용할 수 있습니다. 

   

 

프로그래밍 언어

  11011010100...과 0과 1로 쓰인 것을 binary code, 바이너리 코드라고 합니다. 컴퓨터가 읽는 언어, Machine Language, 기계어는 binary code 형식이며 윈도우, 맥OS 등 컴퓨터 종류에 따라 형태가 다릅니다. 한국 사람이 한국말을 하고, 영국사람이 영어를 쓰듯이 사용하는 언어가 다르기 때문이죠.

  0과 1로 구성된 나열을 보고 이해하기도 힘들며 사용하기 쉽지 않습니다. 그렇게 탄생하게 된 것이 Assembly Language, 어셈블리어입니다. 어셈블리어는 사용자가 프로그래밍하는 하드웨어의 구조를 잘 이해할 수 있어야 쓰기 쉽습니다. 그래서 Low-level Language, 저급언어라고 부르기도 합니다. 어셈블리어는 기계어와 1:1 매칭이 되는 특징이 있습니다. 

 

add 2, 3, result

 

  위의 예시는 어셈블리어입니다. 어셈블리어가 아무리 기계어에 가까운 저급언어라고 하지만 컴퓨터는 0과 1밖에 읽지 못하므로, 2진수 형태로 컴퓨터가 읽을 수 있도록 바꿔줘야 합니다. 그 역할을 하는 것이 Assembler, 어셈블러라고 하는 것입니다.

 

  1950년대에 High-level Language, 고급언어라는 개념이 등장했습니다. 어셈블리어보다 영어랑 더 닮은 꼴이기에 사용자가 작성하고 읽는데 더 쉽다는 장점이 있습니다. 흔히 프로그래밍 언어라고 말하는 Java, C, Python, Perl 등이 여기에 속합니다. 고급언어로 작성된 문장들을 우리는 source program, 소스코드라고 얘기합니다.

  사람이 읽고 쓰기 쉬워졌는만큼 고급언어는 기계어로부터 더 멀리 왔습니다. 어셈블리어가 기계어로 변환되었던 것 같이 고급언어의 형태를 변환시켜줘야 하는데요, 그 역할을 하는 것이 Interpreter 인터프리터와 Compiler 컴파일러입니다.

 

인터프리터와 컴파일러

  인터프리터는 사용자가 작성한 소스코드를 '한 문장씩 읽고' 바로 기계어로 바꿔줍니다. 그 후에 변환된 코드를 실행합니다. 그러나 컴파일러는 '전체 소스코드를 모두' 기계어 파일로 바꿔주고 그 후에 변환된 코드를 실행합니다. 빌드 시, 인터프리터는 큰 일을 하지 않지만 컴파일러는 기계어 소스 코드를 기계어 파일로 생성하기 때문에 오래 걸리는 것처럼 보일 수 있습니다. 그러나 그 이후 실행에서, 인터프리터는 한 줄씩 읽고 기계어로 변환하여 실행하지만 컴파일러는 만들어둔 실행파일만 읽으면 되므로 실행속도에서 더 빠릅니다. 인퍼트리터 언어의 예로 python, php 등이 있고 컴파일러 언어의 예로 C, C++ 등이 있습니다.

출처 : https://www.guru99.com/difference-compiler-vs-interpreter.html

 

자바의 컴파일

  그렇다면 자바는 무슨 언어일까요? 자바의 경우, 조금 특이합니다. 빌드 시, 자바 파일(*.java)을 자바 컴파일러(javac.exe)를 이용하여 JVM이 이해할 수 있는 중간단계의 언어 바이트 코드(*.class)로 바꿔줍니다. 런타임 시, 바이트코드를 기계어로 바꿔주는데 이 역할을 JVM에서 합니다. Class Loader를 통해 바이트코드를 JVM내로 로드하고, Runtime Data Areas를 거쳐 Execution Engine으로 갑니다. Execution Engine에서 바이트코드로 변환하는 두 가지 방식이 있습니다. 인터프리터와 JIT컴파일러(Just-In-Time) 방식이 있습니다. 인터프리터 방식은 위에서 설명한 인터프리터 방식이며, JIT 컴파일러는 인터프리터 방식을 사용하다가 적정한 때에 바이트코드 전체를 기계어로 바꾸는 방식을 취합니다. 이 때 기계어는 캐싱을 이용하기 때문에 인터프리터의 단점을 극복할 수 있습니다.

 

출처 : https://cocomo.tistory.com/499

 

자바의 특징

  자바는 썬에서 제작 당시, "Write Once, Run Anywhere"이란 문구를 가지고 설명하였습니다. 이 의미는 '한 번 작성하면, JVM이 설치된 어느 기계에서든 동작할 수 있다' 입니다. OS 종류가 다르면 고급언어(High-Level Language)가 컴파일 된 후 생성된 기계어 또한 다릅니다.

  그러나 자바는 컴파일러로 바이트코드를 만들고, 바이트코드를 JVM를 통해 기계어로 번역하기 때문에 JVM만 있으면 어떤 OS에서든 같은 기계어로 번역을 합니다. 따라서 어떤 디바이스에서든 바이트코드와 JVM만 있으면 어디서든 동작이 가능한데, 이러한 특성을 Portability 이식성이라고 합니다. 이러한 이식성 때문에 자바가 큰 사랑을 받는 것이죠.

 

 

 

참고 )

https://cocomo.tistory.com/499

https://d2.naver.com/helloworld/1230

https://en.wikipedia.org/wiki/Write_once,_run_anywhere

http://www.bloter.net/archives/13269

Introduction to Java Programming, Pearson