[컴퓨터 구조] 컴파일러 vs 인터프리터PROGRAMMING/01. 컴퓨터 구조2024. 3. 23. 14:52
Table of Contents
반응형
★KEYWORD★
컴파일러 / 인터프리터 / 번역프로그램 / 컴파일러: 코드전체를해석 / 인터프리터: 한 줄씩 읽어들임 / 컴파일러 인터프리터 차이
컴파일러(compiler)는 무엇이고 어떻게 작동할까?
컴파일러는 특정 프로그래밍 언어로 쓰여 있는 문서를 다른 프로그래밍 언어로 옮기는 언어 번역 프로그램이고,
코드 전체를 통째로 해석하는 특징을 가지고있다. 작동하는 과정은 다음과 같다.
- 소스 코드 읽기 :소스 코드 파일을 읽어들인다
- 어휘 분석 : 소스 코드를 토큰이라는 작은 요소로 분해한다. 이 단계에서 컴파일러는 주석, 공백, 탭 문자 등을 제거하고, 키워드, 연산자, 식별자, 리터럴 등의 토큰으로 분류한다.
- 구문 분석 : 토큰들을 구조화 하여 추상 구문 트리를 생성한다. 이 과정에서 문법에 따라 토큰들을 조합하여 프로그램의 구조를 나타내는 트리 형태의 데이터 구조를 생성한다.
- 의미 분석 : 추상 구문 트리를 검사하여 프로그램의 의미를 검증한다. 타입 검사 변수의 정의 및 사용 검사, 함 수 호출의 유효성 검사 등이 수행된다. 오류가 발견되면 컴파일러는 에러 메시지를 생성하고 컴파일 과정을 중단한다.
- 중간 코드 생성 : 의미 분석이 완료되면 추상 구문 트리를 중간 표현으로 변환한다. 중간 코드는 소스 코드와 기계어 사이에 있는 중간 단계로 컴파일러에 의해 추가적인 최적화가 수행될 수 있다.
- 최적화 : 중간 코드에 대한 다양한 최적화 기법을 적용하여 프로그램의 실행 효율을 향상 시킨다. 이 과정에서 불필요한 코드 제거, 상수 폴딩, 루프 최적화 등의 작업이 수행된다.
- 기계어 생성 : 최적화된 중간 코드를 기계어 (바이너리 코드)로 변환한다. 이 단계에서 기계어 명령어를 생성하고 메모리 할당, 레지스터 할당 등과 같은 저수준 작업을 수행한다.
- 링킹 : 기계어로 변환된 코드에 필요한 외부 라이브러리, 함수, 모듈 등을 연결한다.
인터프리터(interpreter)는 무엇일까?
인터프리터는 프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램 또는 환경을 말한다.
컴파일러와 목적은 같다. 하지만 원시 코드를 기계어로 번역하는 컴파일러와 대비된다. 작동하는 과정은 다음과 같다.
- 소스 코드 읽기 : 소스 코드를 한 줄씩 읽어들인다.
- 어휘 분석 : 소스 코드를 토큰이라는 작은 요소로 분해한다. 이 단계에서 컴파일러는 주석, 공백, 탭 문자 등을 제거하고, 키워드, 연산자, 식별자, 리터럴 등의 토큰으로 분류한다.
- 구분 분석 : 토큰들을 구조화 하여 추상 구문 트리를 생성한다. 이 과정에서 문법에 따라 토큰들을 조합하여 프로그램의 구조를 나타내는 트리 형태의 데이터 구조를 생성한다.
- 의미 분석 : 추상 구문 트리를 검사하여 프로그램의 의미를 검증한다. 타입 검사 변수의 정의 및 사용 검사, 함 수 호출의 유효성 검사 등이 수행된다. 오류가 발견되면 컴파일러는 에러 메시지를 생성하고 컴파일 과정을 중단한다.
- 실행 : 의미가 분석 되면 추상 구문 트리를 순차적으로 실행한다. 이 과정에서 프로그램의 각 문장이 실행되고 변수 값이 계산되며, 함수가 호출된다. 인터프리터는 소스 코드를 한 줄씩 실행하므로, 실행 시점에서 소스 코드에 대한 변경사항이 즉시 반영된다.
컴파일러와 인터프리터의 차이
컴파일러
코드를 기계어로 번역하는 과정에서 새로운 실행파일을 만든다.
실행 파일 생성으로 인해 Interpreter에 비해 파일 크기 자체가 크고, 수정이 필요한 경우 Re-compile을 해야한다.
직접적으로 소스 코드를 노출 하지 않고 실행파일로 읽히기 때문에 보안적으로 안전하다.
소스코드를 해석하는데는 많은 시간이 걸리지만 실행 시간은 빠르다.
인터프리터
소스 코드를 한 줄씩 읽어들이기 때문에 전체적인 속도는 compiler에 비해 느릴 수 있지만 소스 코드의 수정이 빈번하게 발생하는 경우 유리할 수 있다. 또한, 디버깅 기능을 제공해주기 때문에 오류가 났을 때 좀 더 원인을 파악하기 쉽다.
컴파일러처럼 목적코드를 만들지도 않고, 링킹 과정도 거치지 않기 때문에 메모리 효율이 좋다. 코드 변경시 빌드 과정없이 바로 실행이 가능하다.
출처: 위키백과, 나무위키
반응형
@HYUNJZZANG :: HyunZzang
HyunZzang의 프로그래밍 공간 / 함께 공부해요!!
도움이 되셨다면 "좋아요❤️" 또는 "구독👍🏻" 부탁드립니다 :)