
1. 컴파일이 필요한 이유
- 컴퓨터는 모든 명령을 CPU가 처리하고 CPU는 모든 명령을 0과 1로 이해하고 실행한다
- ‘A’라는 알파벳을 입력할 때 우리는 ‘A’라고 해석하지만 컴퓨터는 00110010과 같은 이진코드로 해석하고 명령을 처리한다
2. 컴파일
1) 개념
- 컴파일
- 고급 언어(인간이 구분하기 쉬운 언어)로 작성된 프로그램을 기계어(컴퓨터가 이해할 수 있는 언어)로 번역하고 기계어 프로그램으로 고치는 과정
- 소스코드를 컴퓨터가 이해할 수 있는 바이너리 코드로 변환하는 작업
- 원시 코드에서 목적 코드로 옮기는 과정

- 컴파일 : 원시코드에서 목적코드(목적파일)로 바꾸는 것
- 링크 : 목적 파일을 실행파일로 바꾸는 것
- 원시코드 : c언어나 자바, 파이썬 같이 사람이 이해할 수 있는 언어 (소스코드)
- 목적코드 : 컴퓨터가 이해할 수 있는 언어
- 실행파일 : 컴퓨터가 이해할 수 있는 언어로 구성
- 자신이 소스 코드를 작성하고 실행 파일을 만드는 것은 컴파일러(Dev c++, visual studio)가 하는 역할
- 컴파일이라는 개념은 원시코드에서 목적 파일로 바꾸는 것
- 대표적인 컴파일 언어 : C, C++, Java, C#
- 정리 : 인간이 구분하기 쉬운 언어인 고급 언어(=원시코드=소스코드)를 컴퓨터가 이해할 수 있는 0과 1로 구성되어 있는 언어인 기계어(=목적코드=바이너리 코드)로 변환하는 작업이 컴파일이고, 컴파일 언어로는 C, C++, Java가 있다.
- 컴파일러
- 고급 언어로 작성된 소스 코드를 저급 언어로 번역하는 프로그램
- 특정 프로그래밍 언어로 쓰여 있는 문서를 다른 프로그래밍 언어로 옮기는 프로그램
2) 컴파일러 원리
- 컴파일러에서 꼭 지켜야 할 두 가지 조건
- 컴파일러는 옮김의 과정에서 프로그램의 뜻을 보존해야 한다. 입력받은 프로그램의 의미를 충실히 따라야 한다.
- 실용적인 면에서, 컴파일러는 입력으로 들어온 프로그램을 어떤 면에서든지 개선해야 한다.예를 들어, 소스 코드를 기계어로 옮긴다면 기계가 이해할 수 없었던 언어를 기계가 이해할 수 있게 개선한 것이 된다. 같은 언어로 옮긴 경우에는 성능이 개선되는 등의 장점이 있어야 한다
3) 컴파일러 실행 단계
- 구문 분석 : 소스 코드 파일을 읽어 추상 구문 트리 생성, 문법에 맞지 않는 소스 코드는 사용자에게 알림
- 최적화 : 추상 구문 트리 분석 및 최적화
- 코드 생성 : 목적 코드 생성
- 링킹 : 기계어 번역의 경우, 여러 라이브러리 목적 코드를 묶어 하나의 실행 파일 생성 ( 일부는 이 과정을 컴파일 과정에서 제외함)
3. 인터프리터
- 고급 언어로 작성된 프로그램을 한 줄 단위로 받아들여 번역하고, 번역과 동시에 프로그램을 한 줄 단위로 즉시 실행시키는 프로그램이다. 스크립트 언어로는 Python과 Javascript가 있다.
- 프로그램이 직접 실행되므로 목적 프로그램은 생성되지 않는다
- 줄 단위로 번역, 실행되기 떄문에 시분할 시스템에 유용하며 원시 프로그램의 변화에 대한 반응이 빠르다
- 번역 속도는 빠르지만 프로그램 실행 시 매번 번역해야 하므로 실행 속도는 느리다
- Python, Javascript, R, Ruby
4. 컴파일 언어 vs 인터프리터 언어(=스크립트 언어)
-
비교

-
컴파일 언어
- C, C++, Java
- 코드를 작성한 후 컴파일을 하면, 컴파일러에 의해 기계어로 변환된 파일이 생성되고 컴퓨터는 그 파일을 실행
- 이미 기계어로 번역된 파일을 컴퓨터가 실행하므로 스크립트 언어에 비해 빠르고 소스코드에 문법적 오류가 있으면 컴파일 에러를 발생시켜 디버깅이 수월
- 문법적 제약이 많아 작성이 비교적 어렵다
- 운영체제마다 사용하는 기계어가 다르기 때문에 운영체제에 따라 작업을 각각 다르게 해줘야 한다
- 방대한 작업을 수행하는 코드 작업 적절
-
스크립트 언어
- Python, Javascript
- 별도의 파일 생성 없이 소스 코드가 작성될 때마다 인터프리터가 해당 코드를 기계어로 번역하고 실행
- 컴퓨터가 코드를 실행하는 과정에서 소스 코드를 기계어로 번역하는 과정이 포함되어 있으므로 컴파일 언어에 비해 프로그램 실행 시간이 느리다
- 문법적 오류가 있든 없든 일단 실행되기 때문에 디버깅이 비교적 어렵다
- 문법적 제약이 비교적 적어 작성이 비교적 쉽다
- 운영체제를 신경 쓸 필요 없이 한 번만 작성하면 됨
- 간단한 작업을 수행하는 코드 작업 적절
-
실행 구조 차이

-
자바는 컴파일 언어이면서 인터프리터 언어