컴파일러(compiler)와 인터프리터(interpreter)


🖥️ 컴파일러란?

고급 프로그래밍 언어로 작성한 원시 코드 (Source Code)를 컴퓨터 내부에서 사용 가능한 언어인 기계어 (Machine Language)로 ‘번역’하고, 이를 실행가능(Excecutable)하게 만들어주는 프로그램이다. 컴파일러를 사용하는 언어의 종류로는 C, C++, C#, Java 등이 있다.

※ 넓은 의미로, 전체 과정을 빌드(build)라고도 함.


🖥️ 언어 번역기 처리 과정


🖥️ 컴파일 논리적 단계 구분

제목내용
어휘 분석(Lexical Analysis)원시 코드를 기종마다 다른 고유의 문자열(Token)으로 변환. 즉 구성하는 문자들을 단어로 분리하여 어휘 요소로 생성하며 설계가 간단함.
구문 분석(Syntax Analysis)BNF/EBNF 문법 기반으로 Token을 입력하여 추상 구문 형태로 출력. 즉 어휘 요소들을 문장으로 구성하여 문법적으로 검사하고,이를 트리 형태(Parse Tree)로 만들어 분석.
의미 분석(Semantic Analysis)식별자의 선언 여부, 타입 등 문장이 의미적으로 올바른지 검사하고, 변수의 정의와 사용, 함수 호출 등을 분석
중간 코드 생성(Intermediate Code Generation)검증된 소스 코드를 이해하기 쉬운 중간 코드 형태로 변환. macro를 포함한 어셈블리어 형태
코드 최적화(Code Optimization)*지역최적화와 *전역최적화로 나뉘며, 중간 코드를 효율적으로 실행할 수 있도록 최적화함.
💥기계어 코드 생성(Code Generation)매크로 처리기와 어셈블러의 결합 형태로 처리. 최적화된 중간 코드를 기계어로 번역하여 실행 파일 생성
*지역최적화 : 중복 load, store명령의 제거, 불필요한 코드의 삭제, 제어흐름의 최적화, 식(expression)의 대수적 간소화, 연산의 세기경감, 상수전파(constant folding/propagation), 복사전파(copy propagation), 공통부분식(common subexpression) 제거, 결합변형 등이 있음.
*전역최적화: 코드이동(code motion), 귀납변수(induction variable) 최적화, 루프융합(loop fusion/jamming), 루프전개(loop unrolling) 등이 있음.
💥생성된 object code가 바로 실행될 수 없이 loader에 의하여 executable code로 변환되어야 한다.

🖥️ 컴파일러의 종류

  • 전처리기 : 프로그래밍 언어에 유용한 기능들을 추가하여 언어를 확장시켜 주는 역할을 함. 확장 및 추가된 기능들을 순수한 고급언어로 바꿔주는 번역기.
  • 컴파일러 : FORTRAN, COBOL, PASCAL, C 등의 고급언어로 작성된 프로그램을 어셈블리어나 기계어로 번역하는 번역기
  • 어셈블러 : 기계어와 1:1로 대응되는 기호식 표현(Mnemonic)인 어셈블리어로 작성된 프로그램을 그에 대응하는 기계어로 번역해주는 번역기
  • 인터프리터 : 번역과 동시에 실행
  • Cross-Compiler : 컴파일러가 실행되는 컴퓨터가 아닌 다른 컴퓨터의 실행코드를 생성
  • Simulation : 다른 컴퓨터(상황) 등을 가상 Data로 실행하여 결과를 예측

🖥️ 인터프리터(interpreter)란?

고급 프로그래밍 언어로 작성한 원시 코드 (Source Code)를 컴파일 하지 않고, 코드 한 줄 단위로 바로 실행하는 방식으로 동작하는 프로그램. 인터프리터를 사용하는 언어의 종류로는 JavaScript, Python, Ruby 등이 있다.


🖥️ 인터프리터 처리 과정

interpreter


🖥️ 컴파일러와 인터프리터의 공통점과 차이점

공통점 : 고급 언어로 작성된 프로그램을 컴퓨터 내부에서 사용 가능한 기계어로 변환하기 위해 사용하는 프로그램이다.

차이점 : 컴파일러는 프로그램 전체를 번역해서 기계어로 이루어진 프로그램을 생성하여 실행한다면, 인터프리터는 작성된 코드 한 문장씩 기계어로 변환해서 바로 실행한다. 즉 한 마디로 말하자면, 컴파일러는 고급 프로그래밍 언어를 기계어(어셈블리어)로 '번역'을 하며, 인터프리터'동시통역'을 한다고 볼 수 있다.


🖥️ 컴파일러와 인터프리터의 장·단점

  • 컴파일러
장점단점
- 전체적으로 한 번 디코딩하면 그 다음부터는 실행만 하므로, 실행시간 측면에서 효율적.
- 반복문이나 계속 호출되는 부프로그램처럼 많은 횟수를 반복 처리하는 프로그램의 경우에 큰 도움이 됨.
- 몇 줄의 소스 프로그램이 몇백 줄의 기계어로 번역되어 큰 기억 장소를 필요로 할 수도 있음.
  • 인터프리터
장점단점
- 한 줄 단위로 번역과 실행을 하여 매번 같은 기억 장소를 사용하므로 기억장소를 줄일 수 있음.
- 별도의 실행파일이 없어서 코드를 수정할 때 용이함.
- 고급언어로 작성된 프로그램을 한 줄 단위로 번역과 실행을 하기 때문에 반복문과 같은 컴파일러보다 실행시간이 많이 소요됨.

출처 :
* http://www.ktword.co.kr/test/view/view.php?m_temp1=1436
* https://devparker.tistory.com/110
* 컴파일의 필요성(http://elearning.kocw.net/contents4/document/lec/2013/Gachon/Lee%20Sangsun2/3.pdf)
* https://builtin.com/software-engineering-perspectives/compiler-vs-interpreter
* https://velog.io/@congaweb/compiler-interpreter
noodabee님의 [컴파일러 언어와 인터프리터 언어 비교]


© 2024. All rights reserved.

Powered by Hydejack v9.2.1