자바의 프로그램 구조를 공부하던 도중
"자바는 개발자가 작성한 소스 코드를 어느 운영체제에서든 실행시켜줄 수 있는 장점이 있다."는 말에 대해 이해가 가지 않았다.
C언어도 똑같이 운영체제 별로 컴파일 하는 방법에 따라 컴파일만 하면 소스코드를 실행하는 것은 똑같지 않나? 컴파일을 개발자가 직접하는 것도 아니고 clang, gcc 등을 사용해서 명령어만 입력하면 되는데 왜 굳이 JVM을 사용한거지? 라는 의문이 생겼다.
여러 자료를 탐색하던 중 우아한Tech 채널의 10분 테코톡에 있는 영상을 보고 이해한 후 해당 영상의 내용을 정리하였다.
자바 소스코드는 javac 명령어를 통해 자바 바이트코드로 변환, 이 자바 바이트코드는 JVM이 설치된 플랫폼이라면 어느 곳에서나 동작
JVM이 플랫폼과 연결되는 부분을 알아서 작업해줌
"Write Once, Run Anywhere" - Sun Microsystems
-> 개발사에서는 네가 짠 자바 코드를 컴파일해서 배포하면, 어떤 플랫폼이든 다시 컴파일할 필요 없이 실행시킬 수 있다 하지만 실행하려면 그 플랫폼에 맞는 JVM이 설치되어 있어야 한다.라고 말했다.
C/C++도 크로스 컴파일해서 배포하면 되는데, 굳이 JVM을 사용해야하나?
-> 자바는 네트워크가 발전하면서 네트워크에 연결된 다양한 기종의 디바이스에서 프로그램을 실행하고 싶었다. PC, 핸드폰, PMP 등... 다기종 환경에 맞추어 각각 컴파일 할 수 없는 노릇이었다. 즉 자바는 네트워크에 연결된 모든 디바이스에서 작동하는 것이 목적이었다.
-> 디바이스마다 운영체제나 하드웨어가 다르기 때문에, 자연스럽게 플랫폼에 의존하지 않도록 언어를 설계했다.
-> 그 결과로 등장한 것이 Java Bytecode와 JVM이다.
자바 코드가 컴파일되는 과정을 살펴보면 컴파일러 프론트엔드에서 소스코드를 해석하여 추상적으로 변형시킴(이 과정에서 자바 바이트 코드로 변환), 백엔드에서는 이것을 운영체제나 기계에 종속적인 어셈블리어로 변환함.(운영체제에 맞게) C/C++는 컴파일러가 이 과정 전체를 수행하나 JAVA는 프론트엔드는 javac가 하고, 백엔드는 JVM이 하는 방식으로 분리함.
출처: [10분 테코톡] 🎅무민의 JVM Stack & Heap
https://www.youtube.com/watch?v=UzaGOXKVhwU