Java

[Java] 컴파일러 vs 인터프리터 vs JIT compiler

딸기케잌🍓 2021. 5. 31. 00:15

자바를 공부하다보면 JIT compiler 에 대해 들어보셨을거에요.

그냥 컴파일은 뭐고 인터프리터는 뭘까요?

이것들이 무엇인지! 그리고 JIT 와는 어떻게 다른지 알아보겠습니다.

 

 

 

개발자가 작성하는 코드는 고레벨 언어라고 합니다. 컴퓨터는 이해하지 못하고 사람은 쉽게 이해할 수 있는 언어이죠.

이를 컴퓨터가 이해하기 위해서는 저레벨 언어인 기계어로 변환이 되어야 합니다.

이를 위한 방법에는 대표적으로 두 가지가 있는데 하나는 컴파일 방식, 다른 하나는 인터프리터 방식입니다.

 

 

컴파일 방식

먼저 컴파일이란 특정 프로그래밍 언어로 된 원래 소스 파일(원시코드)을 다른 프로그래밍 언어(목적코드)로 옮기는 언어 번역 프로그램입니다. 원시코드에서 목적코드로 옮기는 과정을 컴파일 한다고 말합니다.

 

작성된 소스코드를 어플리케이션을 실행시키기 전에 한번에 기계어 형태로 변환하는 방식입니다.

빌드타임에 모든 기계어 변환이 끝나기 때문에 빌드가 느리고 생성된 기계어는 정적입니다.

하지만 런타임에 특별한 과정이 없어 속도가 빠릅니다.

운영체제에 맞는 컴파일러를 선택해야 하므로 운영체제에 종속적입니다.

대표언어로는 C, C++이 있습니다.

 

인터프리터 방식

인터프리터란 프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램이나 환경을 뜻합니다.

인터프리터는 다음 중 적어도 한 가지 기능을 가진 프로그램입니다.

  • 소스 코드를 직접 실행한다.
  • 소스 코드를 효율적인 다른 중간 코드로 변환하고, 변환한 것을 바로 실행한다.
  • 인터프리터 시스템의 일부인 컴파일러가 만든 미리 컴파일된 저장 코드의 실행을 호출한다.

이 방식은 Compilation과 다르게 별도의 실행파일이 생성되지 않습니다.

빌드타임에는 특별한 과정이 없고 런타임에 한 행씩 분석하여 알맞은 기계어를 생성합니다.

실행속도가 느리다는 단점이 있습니다.

기계어 명령어들이 만들어지는 컴파일 단계를 거칠 필요가 없습니다. 컴파일 과정은 만약 원시 프로그램의 크기가 크다면, 상당한 시간이 걸릴 수 있지만 인터프리터는 고급 프로그램을 즉시 실행시킬 수 있습니다. 

 

컴파일러와 인터프리터 방식의 차이점

  코드 실행 방법 실행시 필요한것 운영체제에 독립성 런타임 선택기준
컴파일러 컴파일시 바로 코드를 실행하지 않고 기계어로 이루어진 실행파일이 생성된다. 한번 컴파일되었다면 컴파일된 프로그램만 필요할뿐 컴파일러나 원본 소스는 필요없다. 다른 운영체제에서 실행하도록 하기 위해서는 그 운영체제에 최적화 하여 재컴파일 할 필요가 있다. 운영체제가 바로 커맨드를 읽고 실행시키므로 빠르다. 성능
인터프리터 코드는 번역작업을 거쳐 컴퓨터로 전달돼 곧바로 실행된다. 프로그램을 실행할 때 필요하므로 프로그램 실행을 위해서는 인터프리터 설치가 되어있어야 한다. 다른 운영체제상의 컴퓨터에서도 실행할수 있다.  코드를 실행하는 동안 코드의 각 행이 해석되므로 느리다. 이식성

 

JIT(Just In Time) 컴파일 방식

정적 컴파일처럼 프로그램을 실행하기 전에 처음 한 번 컴파일하는 대신, 프로그램을 실행하는 시점에서 필요한 부분을 즉석으로 컴파일하는 방식을 말합니다.

컴파일 방식과 인터프리터 방식을 혼합한 방식으로 생각할 수 있는데, 실행 시점에 인터프리트 방식으로 기계어 코드를 생성하고 그 코드를 캐싱(메소드 영역에 있는 코드 캐시(Code Cache) 공간 활용)하여 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지합니다.

자주 쓰이는 코드를 캐싱한 뒤 이후에는 캐싱된 코드를 가져다 쓰기 때문에 인터프리터의 느린 실행 속도를 개선할 수 있습니다.

JIT 컴파일은 프로그램이 시작된 후에만 실행됩니다. 따라서 동적 런타임 정보에 액세스 할 수있습니다.

 

개발자가 작성한 원본 소스인 .java 파일은 java compiler에 의해 바이트 코드로 이루어진 .class 파일로 컴파일 됩니다.

.class 파일을 실행하면 이러한 바이트 코드를 한 줄씩 읽는 java 인터프리터가 호출되고 기계어로 변환하여 실행합니다.

이런 기계어 변환은 코드가 실행되는 과정에 실시간으로 일어나며(그래서 Just-In-Time), 전체 코드의 필요한 부분만 변환합니다. 기계어로 변환된 코드는 캐시에 저장되기 때문에 재사용시 컴파일을 다시 할 필요가 없습니다.

 

자바의 컴파일 방식은 바로 실행가능한 기계어로 변환되는 것이 아니고 중간단계 코드로의 변환과정이 있기 때문에 정적 컴파일 방식보다는 느리다는 단점이 있지만 중간 코드 덕에 플랫폼에 종속되지 않는 장점이 있습니다.

 

 

 

 


마치며,,

공부를 해보니 여러 포스팅에서 JIT compiler와 java interpreter의 뜻을 혼용하여 설명하고 있는 것 같습니다.

인터프리터가 바이트코드를 해석하여 기계어로 변환하고 이를 실행한다라고 하는데

조금 더 전체적인 큰 그림에서는 이러한 과정을 JIT compiler의 동적 컴파일 과정이다라고 말하는 것 같습니다.

Java compiler가 원본 소스를 컴파일하면 바이트코드가 되는데 사실 바이트 코드는 기계어는 아닙니다. 하지만 JVM(M은 Machine이쥬) 상에서 해석가능한 기계어로 컴파일한다고 저는 이해했습니다.

 

 

 

참고사이트

https://opensourceforgeeks.blogspot.com/2013/03/difference-between-compiler-interpreter.html

 

Difference between Compiler, Interpreter and Assembler

Difference between Compiler, Interpreter , Assembler and JIT or Just in time compiler.

opensourceforgeeks.blogspot.com

https://stackoverflow.com/questions/95635/what-does-a-just-in-time-jit-compiler-do/20495711#20495711

 

What does a just-in-time (JIT) compiler do?

What does a JIT compiler specifically do as opposed to a non-JIT compiler? Can someone give a succinct and easy to understand description?

stackoverflow.com

https://introcs.cs.princeton.edu/java/82compiler/

 

Compilers, Interpreters, and Emulators

8.2 Compilers, Interpreters, and Emulators This section under major construction. Compilers and interpreters. A compiler is a program that reads in as input a program (in some high-level programming language) and outputs machine language code (for some mac

introcs.cs.princeton.edu

https://nohhh.tistory.com/entry/%EC%9D%B4%EB%A1%A0-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC-%EC%9D%B8%ED%84%B0%ED%94%84%EB%A6%AC%ED%84%B0-JIT

 

[이론] 컴파일러, 인터프리터, JIT

1. 컴파일러, 인터프리터란? 프로그래머가 작성한 소스코드는 기계가 이해할 수 있는 기계어로 변경해야합니다. 처음 작성된 프로그램은 원시 프로그램(Source program), 변환된 프로그램을 목적 프

nohhh.tistory.com

https://ko.wikipedia.org/wiki/%EC%9D%B8%ED%84%B0%ED%94%84%EB%A6%AC%ED%84%B0

 

인터프리터 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 인터프리터(interpreter, 문화어: 해석기)는 프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램 또는 환경을 말한다. 원시 코드를 기계어로 번역하는

ko.wikipedia.org

https://ko.wikipedia.org/wiki/JIT_%EC%BB%B4%ED%8C%8C%EC%9D%BC

 

JIT 컴파일 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. JIT 컴파일(just-in-time compilation) 또는 동적 번역(dynamic translation)은 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법이다. 전통적인 입장에서 컴

ko.wikipedia.org

https://ko.wikipedia.org/wiki/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC

 

컴파일러 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 컴파일은 여기로 연결됩니다. 일본의 기업에 대해서는 컴파일 (기업) 문서를 참조하십시오. 일반적인 다중 언어, 다중 대상 컴파일러의 동작 모습. 컴파일러(com

ko.wikipedia.org

 

'Java' 카테고리의 다른 글

[java 8] 함수형 인터페이스와 람다 표현식 소개  (0) 2021.09.06
java length  (0) 2021.08.20
[Java] JVM 구조와 원리  (0) 2021.05.23
[Java] Static 변수, static 메소드  (0) 2021.05.23
[Java] String, StringBuffer, StringBuilder  (0) 2021.04.22