오늘은 java에서 프로그래밍 소스 코드를 만들고 그 소스 코드를 실제 프로그램으로 만들게 되는, 과정에 대해서 간략하게 정리해봅니다.
프로그램을 작성한다는 것
프로그래머는 그냥 소스 코드를 만듭니다. 이 소스 코드는 그냥 텍스트 파일에 작성되어도 문제가 없죠.
해당 언어에서의 문법에 따라서, 내가 원하는 형태로 프로그램을 만드는 것, IDE 창에 명령어를 마구 치는 것을 ‘프로그래밍’이라고 보통 하죠.
그리고, 각 프로그래밍에 따라서, 고유의 확장자를 가지게 되는데, java의 경우는 .java라는 파일에 소스 코드가 저장됩니다. python의 경우는 .py, 코틀린의 경우는 .kt죠.
컴파일 by javac
프로그래머가 소스 코드를 다 만들었다고 하겠습니다. 즉, aaa.java와 같은 소스 코드 파일을 만든 것이죠.
하지만, 앞서 말한 것 과 같이, 이 코드 파일은 그냥 텍스트일 뿐입니다. 이 아이를 컴퓨터가 이해하고 수행하도록 넘겨줘야겠죠.
여기서, “컴퓨터가 소스코드를 이해할 수 있도록, 컴퓨터가 이해하는 언어로 변환해주는 프로그램”이 바로 컴파일러입니다.
이 과정을 통해, 우리가 만든 aaa.java라는 소스코드는 저레벨의 언어, 컴퓨터에 가까운 언어로 변환되죠.
다만, 세상에는 매우 다양한 종류의 컴퓨터가 있습니다. 맥, 윈도우, 안드로이드, iOS 등이 있죠(물론, CPU도 매우 다양하게 존재하죠).
다시, 우리가 만든 소스 코드를 컴퓨터가 이애할 수 있도록 변환해줘야 하는데, 그 변환방식이 컴퓨터에 따라서 모두 다르다면? 수많은 종류의 컴파일러가 필요합니다.
이를 방지하게 위해서, Java의 경우는 그 사이에, JVM(Java Virtual Machin)을 설치해둡니다. 각 OS에 맞는 가상의 컴퓨터를 만들어서 위치시키고, java 소스 코드는 JVM이 이해할 수 있는 Java Byte Code로 변환됩니다. Javac라고 하는, Java 컴파일러가 하는 역할은 “모든 컴퓨터가 이해할 수 있도록 변환해주는 것이 아니라, JVM이 이해할 수 있도록 소스 코드를 바이트 코드로 변환해주는 것”이죠.
여기서 Java 소스코드가 변환되는 Java ByteCode는 .class라는 확장자를 가집니다.
JVM
순서를 보면 다음과 같죠.
우리는 java 문법에 따라서 .java의 확장자른 가진 소스 코드를 작성합니다.
javac라는 java compiler를 사용해서 .java 소스코드를 JVM이 이해할 수 있는 java bytecode로 변환해줍니다.
JVM을 통해 프로그램을 실행할 수 있죠. 물론, 이때 실행하려는 컴퓨터의 OS에 적합한 JVM이 설치되어 있어야 합니다.
JVM은 .class로 쓰여진 java bytecode를 받아서, 이 아이를 다시 내 컴퓨터의 OS가 해석할 수 있는 더 낮은 레벨의 언어로 변환해줍니다.
그럼 이제 내 OS에서 프로그램을 해석해서 돌려주는 것이죠.
Wrap-up
이렇게 쓰면 “뭐야, 컴파일러가 OS에 의존적인 것과 JVM이 의존적인 게 뭐가 달라?”라는 생각이 들 수 있습니다. 어차피 각 OS별로 서로 다른 JVM을 설치해주어야 하니까요.
이전에 비해서 프로그래밍을 할 때, 생각해야 하는 범위가 줄어들었다는 점에서 의미가 있습니다. Java는 JVM 위에서 돌아가니까, 동일한 컴파일러에 의해 JVM이 해석할 수 있는 바이트코드로 변환해주기만 하면 됩니다. byte code가 더 낮은 레벨의 코드로 어떻게 변환될지는 프로그래머가 고민할 부분이 아니라, JVM을 관리하는 사람이 처리해야 할 부분이니까요.
댓글남기기