개요
컴파일러의 개요에 대해 알아본다. 이 글은 내공 있는 프로그래머로 길러주는 컴파일러의 이해의 내용을 기반으로 함을 미리 밝힌다. 책 내용이 괜찮으니 관심있으신 분들은 사보는것을 추천한다.(필자는 이해관계자는 아님을 밝힌다.)
목차
컴파일러 강의 다른 포스팅은 아래의 링크를 참고하자.
- 컴파일러 강의 #1, 개요
- 컴파일러 강의 #2, 형식언어와 유한 오토마타
- 컴파일러 강의 #3, 컴파일러의 어휘분석
- 컴파일러 강의 #4, 문맥자유 문법과 푸시다운 오토마타
- 컴파일러 강의 #5, 컴파일러의 구문 분석
- 컴파일러 강의 #6, 의미 분석과 형 검사
- 컴파일러 강의 #7, 중간 언어와 중간 코드 생성
- 컴파일러 강의 #8, 코드 최적화
학습목표
- 컴파일러가 왜 필요한지 언어와 연관지어 이해
- 컴파일러를 포함한 여러 번역기들 이해, 언어 처리 시스템 이해
컴파일러의 필요성
- 언어란?
- 의사전달을 하기 위한 도구
- 언어의 종류
- 자연언어 : 인간의 언어
- 형식언어 : 프로그래밍 언어
- 프로그래밍 언어
- 어떤 문제를 풀기 위해 일련의 과정을 기술하는 언어
- 프로그래밍 언어의 분류
- 저급언어
- 고급 언어
저급언어
- 기계어
- 0/1로 구성된 언어
- 매우 어렵고 복잡하다는 단점
- 어셈블리어
- 기계어의 단점을 보완하기 위해 나옴
- 0/1 대신 ADD, SUBT 등의 명령 기호로 기술
- 어셈블러의 필요성
- 어셈블러를 컴퓨터가 이해하는 기계어로 번역
번역기의 필요성
외국인의 언어를 통역할 수 있는 통역사가 필요한데 이게 컴파일러임
고급언어
- 어셈블리어도 저급언어의 수준을 벗어나지 못해 인간 중심의 고급언어가 탄생함
- 고급언어도 저급언어 처럼 기계어로 변환하는 번역기가 필요함
컴파일러가 필요한 이유(정리)
- 인간의 문제를 해결하기 위해 컴퓨터를 사용함
- 컴퓨터와 의사소통을 하기 위해 언어가 필요함
- 인간이 기계어를 사용하여 문제를 표현하기란 어렵기 때문에 사람 중심 언어인 고급 언어를 사용
- 인간이 사용하는 고급 언어는 컴퓨터가 이해하지 못함
- 따라서 인간이 사용하는 고급 언어를 기계어로 변환해주는 번역기인 컴파일러가 필요함
번역기의 종류
- 번역기란?
- 입력 : 한 프로그래밍 언어로 작성된 프로그램
- 출력 : 다른 프로그래밍 언어로 된 프로그램
- 번역기의 종류와 기능
어셈블러
- 어셈블리어로 작성된 소스를 기계어로 번역하는 번역기
- 어셈블리 코드
- 사람이 좀더 이해하기 쉽게 기호화 한 것
- 예제
컴파일러
- 고급언어로 작성된 소스의 번역기
프리프로세서(preprocessor, 전처리기)
- C의 #include에 같은것에 해당함
- 원시언어와 목적언어가 모두 고급언어
C 프리프로세서
- 파일 포함 기능(#include)
- 매크로 처리 기능
- #define #definemax 45 => max 가 나타날 때마다 45 로 바꾸어 줌
- 조건부 컴파일 기능
- OS에 따라 조건을 다르게 하여 컴파일 할 때 사용
인터프리터
- 번역과 동시에 실행
- Python과 같은 대화형 언어로 구현할 때 사용
- 번역과 실행을 같이 수행하기 때문에 특히 반복문일 때 실행시간이 많이 늘어남
크로스 컴파일러
- 소스를 내 PC의 기계어가 아닌 다른 컴퓨터의 기계어로 번역
- 컴퓨터에서 컴파일 해서 임베디드 시스템으로 다운로드해서 실행
바이트코드 컴파일러
- 소스를 바이트 코드라 불리는 중간코드로 컴파일 한뒤 바이트 코드는 JVM에서 인터프리트 되어 실행
- 혼합형 컴파일러(컴파일러 + 인터프리터)
언어처리
- 문제에 대해 알고리즘을 작성해서 소스로부터 목적 프로그램을 생성
- 이때 컴파일러 이외의 다른 번역기가 필요할 수도 있음
요약
- 컴파일러의필요성
- 인간은 문제를 풀기 위해 컴퓨터를 사용하며 컴퓨터와 의사소통을 하는 데 언어가 필요
- 컴퓨터는 기계어를 사용하지만 인간은 사람중심 언어인 고급 언어를시용
- 따라서 컴퓨터와 인간이 사용하는 언어를 기계어로 번역해주는 컴파일러가 필요
- 프로그래밍언어
- 절차 언어는 명령의 순차적 실행. 메모리를 표시히키 위한 변수 사용, 값을 저장하기 위한 치환문 사용 등의 특징을 지님
- 프로그래밍 언어의 종류
- 수치 계산용 언어: 포트란, 알골, 베이직
- 사무 처리용 언어: 코볼
- 인공지능 언어: 리스프, 프롤로그, 스노볼
- 시스템 프로그래밍 언어 : C
- 기타 언어 : APL, 파스칼, 에이다, 자바, 인터넷 프로그래밍 언에;펄. PHP. ASP, JSP, HTML, DHTML, 자바스크립트, 지싸애플릿)
- 매개변수 전달 방법 : 참조 호출은 실매개변수의 주소를 대응되는 형식 매개변수로 넘겨주는 것이고, 값 호출은 실매개변수와는 별도로 형식 매개변수에 대한 메모리를 별도로 할당하는 방법 또한 이름호출은 형식 매개변수의 이름이 사용될 때마다그에 대응하는실매개변수자체가시용된 것처럼 매번 다시 계산하여 시행하는 방법
- 블록구조 : 프로그램을 여러 단계의 블록으로 나누어 작성할수 있도록해주는 언어 구조
- 재귀법 : 수학적 귀납법이라고도 하며, 자신을 정의할 때 자기 자신을 재참조하는방법
- 객체지향프로그래밍 : 객체라는작은단위로 모든 처리를 기술하는프로그래밍 방법
- 번역기의 종류
- 번역기는하나의 프로그래밍 언어로작성된 프로그램을 그와 동등한 의미를 가진 다른 프로그래밍 언어로 된 프로그램으로 변환하는 프로그램
- 번역기의 종류
- 어셈블러: 어셈블리어로 작성된소스 프로그램을 그에 대응하는 기계어로 번역된목적 프로그램으로 변환해주는 번역기
- 컴파일러: 고급 언어로 작성된 소스 프로그램을 그에 대응하는 어셈블리어나 기계어로 번역된 목적프로그램으로 변환 해주는 번역기
- 프리프로세서: 소스 프로그램과목적 프로그램이 모두 고급 언어인 번역기
- 인터프리터: 고급 언어를 입력으로 받아 번역과 동시에 실행한후 그 결과를 출력하는 번역기
- 언어처리 시스템은 일반적인 문제를 해결하는 데 번역기를 시용하여 소스 프로그램부터 실행 결과까지 도출하는 과정을 말함