컴파일러 VS. 인터프리터

G-NOTE·2021년 10월 21일
0

Spring

목록 보기
14/14

프로그램은 사람의 언어를 이해할 수 없다. 따라서 사람이 작성한 고급 언어를 기계가 이해할 수 있는 기계어로 해석하고 실행시키는 방법은 크게 compile 방식과 interpret 방식으로 나뉜다.

Compile

  • 컴파일러(compiler)를 통해 프로그래밍 언어를 해석하는 방법

  • 즉, 컴파일러는 소스 코드 전체를 바로 기계어로 변환한다.

  • 런타임 이전에 프로그래밍 언어 전체를 한 번에 번역하고 '실행 파일'을 생성한다.

  • 실행 파일이 있기 때문에 메모리를 사용한다.

  • 따라서 번역 속도는 인터프리터보다 느리지만, 실행 파일이 있으므로 실행 속도는 인터프리터보다 빠르다.

  • 코드 중 한 곳에 에러가 발생하면 전체가 실행되지 않는다.

  • 런타임 이전에 실행 파일이 만들어지기 때문에 OS와 빌드 환경에 종속적이다. 그러므로 호환되는 환경을 구축해야 한다.

  • 컴파일러의 실행 단계

    • 구문 분석 : 소스 코드 파일을 읽어 개별 문법 요소(식별자, 연산자 등) 단위로 자른 후, 이 문법 요소들을 해석하여 AST(추상 구문 트리)를 만든다.
    • 최적화 : 추상 구문 트리를 분석하여 최적화를 수행한다. 도달할 수 없는 코드 식별, 상수 표현식 계산, 루프 해석 등 대부분의 최적화가 이 단계에서 수행된다.
    • 코드 생성 : 최적화된 구문 트리에서 실행 파일을 생성한다.

Interpret

  • 인터프리터(interpreter)를 통해 프로그래밍 언어를 해석하는 방법
  • 즉, 인터프리터는 고급 언어를 중간 코드로 변환하고, 이를 각 행마다 실행하며 기계어로 변환한다.
  • 런타임에 코드를 한 줄씩 읽고 실행하며, '실행 파일'은 만들지 않는다.
  • 실행 파일이 없으므로 메모리를 사용하지 않는다.
  • 따라서 번역 속도는 컴파일러보다 빠르지만, 실행 파일이 없으므로 실행 속도는 컴파일러보다 느리다.
  • 코드 중 한 곳에 에러가 발생하더라도 그 전까지는 실행된다.
  • 런타임에 코드를 실행하기 때문에 실시간으로 코드를 수정하거나 디버깅할 수 있다.

자바 가상 머신(JVM, Java Virtual Machine)

  • 어떠한 운영체제 위에서도 자바 프로그램이 실행될 수 있도록 하는 가상 머신

  • 컴파일 방식 : javac 컴파일러가 자바 코드(.java 파일)를 JVM이 이해할 수 있는 바이트 코드(.class 파일)로 변환한다.

  • 구성 요소

    • 인터프리터 : .clss 파일을 해당 OS 환경에 맞게 변환하여 운영체제에 종속적이지 않은 상태를 만들어준다.
    • 클래스 로더 : 자바 .class 파일을 JVM으로 동적 로드하는 자바 런타임 환경(JRE)의 일부이다.
    • 실행엔진 : 클래스 로더에 존재하는 .class를 실행시켜 JVM내부에서 기계가 실행할 수 있는 형태로 변경한다.
    • 가비지 컬렉터 : C나 C++과 달리 개발자가 직접 메모리 관리를 하지 않아도 더 이상 사용하지 않는 메모리 자동 해제
  • JIT 컴파일 (JIT(Just In Time) Compilation)
    - 프로그램을 실제 실행하는 시점에 기계어로 번역하는 컴파일 기법

    • 실행 시점에서 인터프리트 방식으로 기계어 코드를 생성하면서 그 코드를 캐싱하여, 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한다.
    • 예) JVM, .NET, V8(node.js)
    • 자바 컴파일러의 경우, 자바 프로그램 코드를 바이트 코드로 변환한 다음, 실제 바이트 코드를 실행하는 시점에서 자바 가상 머신이 바이트 코드를 JIT 컴파일을 통해 기계어로 번역한다.

사용 언어

  • 컴파일 언어 : C, C++ 등
  • 인터프리터 언어 : JavaScript, Python 등

Java

  • 컴파일러와 인터프리터가 혼합된 형태
  • Java의 해석 과정
    1. 자바 컴파일러가 .java 파일을 javac 명령어를 통해 .class 파일로 변환한다. (이때 .class 파일의 코드는 기계어가 아닌 JVM이 이해할 수 있는 바이트 코드이다.)
    2. 자바 인터프리터가 .class 파일의 바이트 코드를 특정 환경의 기계가 이해할 수 있는 기계어로 변환한다. (이 때문에 특정 환경에 종속받지 않고 Java 코드를 실행할 수 있다.)
  • 왜 자바는 컴파일러와 인터프리터가 혼합된 형태를 취했을까?
    • 앞서 말한 자바의 실행 엔진은 두 가지 방식이 있다. Interpreter, JIT 두 개로 인해 자바는 컴파일러와 인터프리터가 혼합된 형태의 프로그래밍 언어가 된 것이다.
    • 인터프리터는 OS 환경에 종속되지 않는다는 이점이 있다.
    • 컴파일러로 생성된 자바 바이트 코드는 컴퓨터와 프로그램 사이에 별도의 버퍼 역할을 함으로써 보안 측면에서 안전한 환경을 제공해준다.
    • 기존 인터프리터 언어였던 자바는 성능 이슈를 JIT compiler를 추가함으로써 해결했고 자바는 컴파일러와 인터프리터를 함께 사용하는 방식을 취하게 되었다.

참조

https://ko.wikipedia.org/wiki/%EC%BB%B4%ED%8C%8C%EC%9D%BC%EB%9F%AC
https://ko.wikipedia.org/wiki/%EC%9D%B8%ED%84%B0%ED%94%84%EB%A6%AC%ED%84%B0
https://ko.wikipedia.org/wiki/JIT_%EC%BB%B4%ED%8C%8C%EC%9D%BC
https://steady-snail.tistory.com/1
https://cbw1030.tistory.com/289
https://velog.io/@jaeyunn_15/OS-Compiler-vs-Interpreter
http://www.www-kr.org/ws3/content/B4/java.html#3

profile
FE Developer

0개의 댓글