Java, javac, JVM

1 분 소요

Java - compile and run

  • 오늘은 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을 관리하는 사람이 처리해야 할 부분이니까요.

댓글남기기