컴파일러(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 등이 있다.
🖥️ 인터프리터 처리 과정
🖥️ 컴파일러와 인터프리터의 공통점과 차이점
공통점 : 고급 언어로 작성된 프로그램을 컴퓨터 내부에서 사용 가능한 기계어로 변환하기 위해 사용하는 프로그램이다.
차이점 : 컴파일러
는 프로그램 전체를 번역해서 기계어로 이루어진 프로그램을 생성하여 실행한다면, 인터프리터
는 작성된 코드 한 문장씩 기계어로 변환해서 바로 실행한다. 즉 한 마디로 말하자면, 컴파일러
는 고급 프로그래밍 언어를 기계어(어셈블리어)로 '번역'
을 하며, 인터프리터
는 '동시통역'
을 한다고 볼 수 있다.
🖥️ 컴파일러와 인터프리터의 장·단점
컴파일러
장점 | 단점 |
---|---|
- 전체적으로 한 번 디코딩하면 그 다음부터는 실행만 하므로, 실행시간 측면에서 효율적. - 반복문이나 계속 호출되는 부프로그램처럼 많은 횟수를 반복 처리하는 프로그램의 경우에 큰 도움이 됨. | - 몇 줄의 소스 프로그램이 몇백 줄의 기계어로 번역되어 큰 기억 장소를 필요로 할 수도 있음. |
인터프리터
장점 | 단점 |
---|---|
- 한 줄 단위로 번역과 실행을 하여 매번 같은 기억 장소를 사용하므로 기억장소를 줄일 수 있음. - 별도의 실행파일이 없어서 코드를 수정할 때 용이함. | - 고급언어로 작성된 프로그램을 한 줄 단위로 번역과 실행을 하기 때문에 반복문과 같은 컴파일러보다 실행시간이 많이 소요됨. |
출처 :
* 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님의 [컴파일러 언어와 인터프리터 언어 비교]