본문 바로가기

공부한 내용/기타

Compiler vs. Interpreter vs. Transpiler

이 포스팅에는 2021년 12월 17일,  John Smith가 작성한 Compiler Vs. Interpreter: What's the Difference?가 포함되어 있습니다. 

What is Compiler?

컴파일러는 고급 프로그래밍 언어로 작성된 코드를 기계어 코드로 변환하는 컴퓨터 프로그램입니다. 사람이 읽을 수 있는 코드를 컴퓨터 프로세서가 이해할 수 있는 언어(1 또는 0)로 변환하는 프로그램입니다. 컴퓨터는 해당 작업을 수행하기 위해 번역된 기계어 코드를 처리합니다.

 

컴파일러는 작성된 프로그래밍 언어의 구문 규칙을 준수해야 합니다. 그러나 컴파일러는 프로그램일 뿐 해당 프로그램에서 발견된 오류를 수정할 수 없습니다. 따라서 실수를 하면 프로그램 구문을 변경해야 합니다. 그렇지 않으면 컴파일되지 않습니다.

What is Interpreter?

인터프리터는 각 고급 프로그램 명령문을 기계어 코드로 변환하는 컴퓨터 프로그램입니다. 인터프리터는 소스 코드, 미리 컴파일된 코드 및 스크립트가 포함됩니다. 컴파일러와 인터프리터 모두 고급 프로그래밍 언어를 기계어로 변환하는 동일한 작업을 수행합니다. 그러나 컴파일러는 프로그램이 실행되기 전에 코드를 기계어 코드로 변환합니다(exe 생성). 인터프리터는 프로그램이 실행될 때 코드를 기계어 코드로 변환합니다.

KEY DIFFERENCE

  • 컴파일러는 프로그램이 실행되기 전에 고급 프로그래밍 언어로 작성된 코드를 기계어로 한 번에 변환하는 반면, 인터프리터는 프로그램이 실행되는 동안 고급 프로그램 명령문을 한 줄 씩 기계어로 변환합니다.
  • 인터프리터로 변환된 코드는 느리게 실행되는 반면 컴파일된 코드는 더 빠르게 실행됩니다.
  • Compiler는 컴파일 후 모든 오류를 표시하지만 Interpreter는 각 행의 오류를 하나씩 표시합니다.
  • Compiler는 번역 연결 로딩 모델을 기반으로 하는 반면 Interpreter는 Interpretation Method를 기반으로 합니다.
  • 컴파일러는 전체 프로그램을 사용하는 반면 인터프리터는 한 줄의 코드를 사용합니다.

Compiler Vs. Transpiler

  • Compiler : 한 언어로 작성된 소스 코드를 가져와서 다른 언어로 된 하나의(또는 많은) 출력 파일을 생성하는 프로그램을 설명하는 포괄적인 용어입니다. 실제로 우리는 C 코드를 입력으로 받아 바이너리 실행 파일(기계어 코드)을 출력으로 생성하는 gcc와 같은 컴파일러를 설명하기 위해 이 용어를 주로 사용합니다.
  • Transpiler : transpiler는 source-to-source 컴파일러라고도 합니다. 따라서 본질적으로 이들은 소스 코드 파일을 가져와 다른 언어(c/c++ -> javascript) 또는 동일한 언어의 다른 버전(es6 -> es5)으로 변환하는 컴파일러의 하위 집합입니다. 트랜스파일러의 출력은 일반적으로 사람이 이해할 수 있습니다. 이 출력은 컴퓨터에서 실행할 수 있으려면 여전히 컴파일러나 인터프리터를 거쳐야 합니다.
    • Some examples of transpilers:
      1. Emscripten: Transpiles C/C++ to JavaScript
      2. Babel: Transpiles ES6+ code to ES5 (ES6 and ES5 are different versions or generations of the JavaScript language)

"유사한 추상화 수준"이라는 말 때문에, 누군가는 어셈블리 언어도 소스 파일이므로 gcc도 트랜스파일러라고 주장할 수 있습니다. 그러나 이 주장은 유사한 추상화 수준이 무효화되는 것입니다.

 

언어를 lower, middle 및 higher level로 분류하는 개념은 기계/아키텍처의 실제 작업에서 제공하는 추상화 수준을 기반으로 합니다.

 

어셈블리와 같은 저수준 언어는 프로세서 아키텍처에 매우 가깝습니다. 즉, 프로세서마다 다른 명령이 있습나다. 반면에, C/C++/Java/JavaScript는 이 모든 것을 추상화하여 더 많은 추상화를 제공합니다.

 

추상화 레벨은 다음의 예시를 통해 이해할 수 있습니다.

(1) CPU-level (actual logic gates on the CPU)
(2)machine code
(3)assembly code
(4)[C/C++, JVM/bytecode]
(5)[JavaScript, Python]

 

컴파일러는 높은 수준의 언어를 저수준 언어로(ex. (4)->(2)), 트랜스파일러는 같은 수준의 다른 언어로 변환합니다.

 

출처 : https://stackoverflow.com/questions/44931479/compiling-vs-transpiling

간단하게 컴파일러와 인터프리터, 트랜스파일러에 대해 정리했지만, 인터프리터와 바이트코드 컴파일이 어떻게 다른 것인지, 인터프리터에 의해 변환된 바이트코드가 실행되는 가상머신이 정확히 무엇인지 등에 대해서 더 깊은 탐구가 필요하다.