-
컴파일러의 구조(~ 전단부)프로그래밍언어론 2023. 3. 8. 15:31
컴파일러의 구조
컴파일러는 입력 소스 프로그램(고급 언어)을 받아 오브젝트 언어로된 프로그램을 생성한다.
컴파일러는 전단부와 후단부로 나누어 진다.전단부
- 고급 언어로 된 프로그램을 해석하고 구조를 분석
- 결과로 중간코드 또는 AST 형태로 나오게 된다.
입력 스트림이 들어오면 (TextFile)
전단부는 어휘분석기(스캐너) 단계에서 토큰을 생성한 후, 구문 분석기(파서) 단계에서 파스트리를 생성한다.각자의 역할 좀 더 상세히 살펴보자.
스캐너 단계
스캐너는 고급언어 프로그램을 텍스트로 받아 문자 단위로 읽어서
토큰으로 잘라서 한개씩 돌려주는데 이를 토큰 스트림이라고 한다.스캐너는 코드가 아닌 부분(빈칸 또는 코멘트 부분을 건너뛰는 기능)에 대해서 토큰 단위로 쪼개어 토크의 종류와 값을 돌려주는 역할을 한다.
토큰이란 입력스트림에서 의미있는 단위로 쪼갠 문자열이다.
종류는 키워드, 이름, 기호, 리터럴 4가지 이다.
이때 키워드는 언어마다 정해진 문자열 (int, if...)을 말한다.스캐너는 토큰을 구분하는 과정에서 오류를 발생시킨다. 인식할 수 없는 문자가 들어오거나 코멘트 부분이 짝이 맞지 않아 끝나지 않는 경우이다.
파싱단계
파싱이란 스캐너에서 넘어오는 토큰들로부터 프로그램의 구조를 분석하는 단계이다.
프로그램구조는 보통 계층적 트리구조를 가진다.전역변수와 함수 정의부로 구저오디고 함수 정의부는 함수 선언부 헤드와 문장블록으로 나누고 선언부는 타입과 이름, 매개변수 선언부로 나뉜다.
이런 방식으로 계층적인 구조로 분석하는 것이 파싱이다.파싱단계에서는 문법에서 정의한 구조를 만족하지 않는 것에 대한 오류를 검출한다.
즉 연산 앞뒤로 변수나 숫자가 나와야 하고, 문장이 끝나면 세미콜론이 나오고, 괄호의 짝이 맞아야 하는 등의
구조에 관한 오류들이 검출된다.의미분석 단계
의미 분석단계는 프로그램의 의미를 분석하는 단계이다.
먼저 선언부를 통해 모든 이름에 대해 타입과 순서를 계산한다.
범위별로 선언되야 하는 변수들이 모두 등록되고 정보가 저장된다.
코드 생성 단계에서 이 심볼테이블로부터 주소를 계산한다.c = a+ b; 라는 수식을 만나면 기계어 코드에서는 a의 주소에서 값을 레지스터로 load후 b의 주소에서 값을 레지스터로 load후, 두 레지스터 값을 더하고 C의 주소로 store하는 명령문이 만들어져야 한다.
이때 필요한 정보는 심볼테이블에 있는 a, b, c의 주소와 타입이다.
a라는 이름이 어떤 변수이닞 찾고 int나 float인지에 따라서 타입 변환이 필요할 수 있고 어떤 타입으로 바꿀지 결정하는 타입의 계산이 이루어진다.이렇게 이름과 타입에 대한 복잡한 계산을 수행하는 단계이다.
이름과 타입오류가 발견될 수있는데 이름이 선언되지 않았거나, 이름이 두번선언, 잘못된 타입, 매개변수의 갯수나 타입 오류가 여기서 발견된다.동적오류
컴파일러가 프로그램의 의미상의 오류를 찾아서 검사(정적검사) 하면 우리는 이를 고칠 수 있다.
그러나 정적검사할 수 없는 의미상의 오류가 있다.
컴파일러가 판별하지 못하는 오류는 실행시 발생하는데 이를 동적오류라고 한다.- 배열의 범위 오류 : 배열 크기를 넘어서는 인덱스 접근
- 잘못된 주소 문제
- 포인터 주소가 잘못된 경우 : 널이거나 접근불가 영역을 가리킴
- 타입 강제변환에서 발생하는 오류 : 변환 불가한 값
- 잘못된 값을 가진 변수를 이용한 계산
- 초기화되지 않은 변수의 쓰레기 값으로 인한 오류
- 수식 오버플로우, 0으로 나누기
동적 오류처리는 언어마다 다르다. 따라서 환경에 따라 OS나 컴파일러에 의해 다른 결과나 오류 메시지가 나올 수 있다.
자바는 이를 특정 예외의 형태로 프로그램에게 알려준다.예외를 받으면 프로그램을 이를 처리하고, 처리하지 않으면 VM에 의해 종료된다.Intermediate Representation(IR)
Instruction Register 아니다... 주의,,,^
어휘, 구분, 의미 분석단계에서 여러 분석한 결과를 자료구조 or 중간 결과를 IR이라고 한다.
즉 전단부와 후단부 사이에 저장되는 자료구조라고 할 수 있다.
이 중간표현의 형태는 또 컴파일러마다 다르지만 AST형태로 만들어 지는 경우가 많다.AST는 파스트리에서 필요한 노드만 남긴 트리 자료구조이다.
다음 포스팅에서 후단부 과정을 아라보자.
728x90'프로그래밍언어론' 카테고리의 다른 글
바인딩 (0) 2023.03.11 컴파일러 구조(~후단부) (0) 2023.03.11 라이브러리와 링크, 그리고 적시컴파일 (0) 2023.03.06 컴파일러와 인터프리터 (0) 2023.03.06 언어론 (0) 2023.03.06