예제가 포함된 컴파일러 단계: 컴파일 프로세스 및 단계

컴파일러 디자인의 단계는 무엇입니까?

컴파일러 다양한 단계로 작동하며 각 단계는 소스 프로그램을 한 표현에서 다른 표현으로 변환합니다. 각 단계는 이전 단계에서 입력을 받아 컴파일러의 다음 단계에 출력을 공급합니다.
컴파일러에는 6단계가 있습니다. 이 각 단계는 고급 언어를 기계어 코드로 변환하는 데 도움이 됩니다. 컴파일러의 단계는 다음과 같습니다.

  1. 어휘 분석
  2. 구문 분석
  3. 의미 분석
  4. 중간 코드 생성기
  5. 코드 최적화 프로그램
  6. 코드 생성기
컴파일러의 단계
컴파일러의 단계

이 모든 단계는 소스 코드를 토큰으로 나누고, 구문 분석 트리를 생성하고, 소스 코드를 여러 단계로 최적화하여 변환합니다.

1단계: 어휘 분석

어휘 분석은 컴파일러가 소스 코드를 스캔하는 첫 번째 단계입니다. 이 프로세스는 왼쪽에서 오른쪽으로, 문자별로 수행될 수 있으며 이러한 문자를 토큰으로 그룹화할 수 있습니다.
여기서 소스 프로그램의 문자 스트림은 토큰을 식별하여 의미 있는 순서로 그룹화됩니다. 해당 티켓을 기호 테이블에 입력하고 해당 토큰을 다음 단계로 전달합니다.
이 단계의 주요 기능은 다음과 같습니다.

  • 소스 코드의 어휘 단위 식별
  • 어휘 단위를 상수, 예약어와 같은 클래스로 분류하고 이를 다른 테이블에 입력합니다. 소스 프로그램의 주석은 무시됩니다.
  • 언어의 일부가 아닌 토큰 식별

예시:
x = y + 10

토큰

X 식별자
= 할당 연산자
Y 식별자
+ 덧셈 연산자
10 번호

2단계: 구문 분석

구문 분석은 코드의 구조를 발견하는 것입니다. 텍스트가 예상 형식을 따르는지 여부를 결정합니다. 이 단계의 주요 목표는 프로그래머가 작성한 소스 코드가 올바른지 확인하는 것입니다.
구문 분석은 토큰을 사용하여 구문 분석 트리를 구성함으로써 특정 프로그래밍 언어를 기반으로 하는 규칙을 기반으로 합니다. 또한 소스 언어의 구조와 언어의 문법 또는 구문을 결정합니다.
다음은 이 단계에서 수행되는 작업 목록입니다.

  • 어휘 분석기에서 토큰 얻기
  • 표현식이 구문적으로 올바른지 확인합니다.
  • 모든 구문 오류 보고
  • 파스 트리라고 알려진 계층 구조를 구성합니다.

예시

모든 식별자/번호는 표현식입니다.
x가 식별자이고 y+10이 표현식이면 x= y+10은 명령문입니다.
다음 예제의 파스 트리를 고려하십시오.

(a+b)*c

구문 분석의 예

구문 분석 트리에서

  • 내부 노드: 연산자 필드와 자식에 대한 두 개의 파일이 있는 레코드
  • 리프: 2개 이상의 필드가 있는 레코드입니다. 토큰 및 토큰에 대한 기타 정보용
  • 프로그램의 구성 요소가 의미 있게 서로 맞는지 확인
  • 유형 정보를 수집하고 유형 호환성을 확인합니다.
  • 검사 피연산자는 소스 언어에서 허용됩니다.

3단계: 의미 분석

의미론적 분석은 코드의 의미론적 일관성을 확인합니다. 이는 기호 테이블과 함께 이전 단계의 구문 트리를 사용하여 주어진 소스 코드가 의미상 일관성이 있는지 확인합니다. 또한 코드가 적절한 의미를 전달하는지 여부도 확인합니다.
의미 분석기는 형식 불일치, 호환되지 않는 피연산자, 부적절한 인수로 호출된 함수, 선언되지 않은 변수 등을 확인합니다.
의미 분석 단계의 기능은 다음과 같습니다.

  • 수집된 유형 정보를 저장하고 기호 테이블이나 구문 트리에 저장하는 데 도움이 됩니다.
  • 유형 검사를 수행할 수 있습니다.
  • 원하는 작업을 만족시키는 정확한 유형 수정 규칙이 없는 유형 불일치의 경우 의미 오류가 표시됩니다.
  • 유형 정보 수집 및 유형 호환성 확인
  • 소스 언어가 피연산자를 허용하는지 확인합니다.

예시

float x = 20.2;
float y = x*30;

위 코드에서 의미 분석기는 곱하기 전에 정수 30을 부동 소수점 30.0으로 유형 변환합니다.

4단계: 중간 코드 생성

의미론적 분석 단계가 컴파일러를 통해 완료되면 대상 시스템에 대한 중간 코드를 생성합니다. 이는 일부 추상 기계에 대한 프로그램을 나타냅니다.
중간 코드는 고급 언어와 기계 수준 언어 사이에 있습니다. 이 중간 코드는 대상 기계어 코드로 쉽게 변환할 수 있는 방식으로 생성되어야 합니다.
중간 코드 생성 기능:

  • 소스 프로그램의 의미론적 표현으로부터 생성되어야 합니다.
  • 번역 과정에서 계산된 값을 보유합니다.
  • 중간 코드를 대상 언어로 번역하는 데 도움이 됩니다.
  • 소스 언어의 우선 순위를 유지할 수 있습니다.
  • 명령어의 피연산자의 정확한 수를 유지합니다.

예시

예를 들어,

total = count + rate * 5

주소 코드 방법을 사용하는 중간 코드는 다음과 같습니다.

 
t1 := int_to_float(5) 
t2 := rate * t1 
t3 := count + t2
total := t3

5단계: 코드 최적화

다음 단계는 코드 최적화 또는 중간 코드입니다. 이 단계에서는 불필요한 코드 라인을 제거하고 명령문 순서를 정렬하여 리소스 낭비 없이 프로그램 실행 속도를 높입니다. 이 단계의 주요 목표는 중간 코드를 개선하여 더 빠르게 실행되고 더 적은 공간을 차지하는 코드를 생성하는 것입니다.
이 단계의 주요 기능은 다음과 같습니다.

  • 실행 속도와 컴파일 속도 사이의 균형을 맞추는 데 도움이 됩니다.
  • 대상 프로그램의 실행 시간을 향상시킵니다.
  • 여전히 중간 표현으로 간소화된 코드를 생성합니다.
  • 접근할 수 없는 코드 제거 및 사용되지 않는 변수 제거
  • 루프에서 변경되지 않은 명령문 제거

예:
다음 코드를 고려해보세요

a = intofloat(10)
b = c * a
d = e + b
f = d

될 수 있다

b =c * 10.0
f = e+b

6단계: 코드 생성

코드 생성은 컴파일러의 마지막이자 마지막 단계입니다. 코드 최적화 단계에서 입력을 받고 결과적으로 페이지 코드 또는 개체 코드를 생성합니다. 이 단계의 목표는 스토리지를 할당하고 재배치 가능한 기계어 코드를 생성하는 것입니다.
또한 변수에 대한 메모리 위치를 할당합니다. 중간 코드의 명령어는 기계어 명령어로 변환됩니다. 이 단계에서는 최적화 또는 중간 코드를 대상 언어로 변환합니다.
대상 언어는 기계어입니다. 따라서 이 단계에서는 모든 메모리 위치와 레지스터도 선택되고 할당됩니다. 이 단계에서 생성된 코드는 입력을 받고 예상되는 출력을 생성하기 위해 실행됩니다.

예시

a = b + 60.0
아마도 레지스터로 변환될 것입니다.

MOVF a, R1
MULF #60.0, R2
ADDF R1, R2

심볼 테이블 관리

기호 테이블에는 식별자 속성에 대한 필드와 함께 각 식별자에 대한 레코드가 포함되어 있습니다. 이 구성 요소를 사용하면 컴파일러가 식별자 레코드를 더 쉽게 검색하고 신속하게 검색할 수 있습니다. 기호 테이블은 범위 관리에도 도움이 됩니다. 기호 테이블과 오류 처리기는 모든 단계와 상호 작용하며 이에 따라 기호 테이블이 업데이트됩니다.

오류 처리 루틴

컴파일러 설계 프로세스에서 아래 주어진 모든 단계에서 오류가 발생할 수 있습니다.

  • 어휘 분석기: 철자가 잘못된 토큰
  • 구문 분석기: 괄호 누락
  • 중간 코드 생성기: 연산자에 대한 피연산자가 일치하지 않습니다.
  • Code Optimizer: 명령문에 도달할 수 없는 경우
  • 암호 Generator: 메모리가 가득 차거나 적절한 레지스터가 할당되지 않은 경우
  • 기호 테이블: 여러 선언된 식별자 오류

가장 일반적인 오류는 검색 시 잘못된 문자 시퀀스, 유형의 잘못된 토큰 시퀀스, 범위 오류 및 의미 분석 시 구문 분석입니다.
위 단계 중 하나에서 오류가 발생할 수 있습니다. 오류를 찾은 후 단계에서는 컴파일 프로세스를 계속하기 위해 오류를 처리해야 합니다. 이러한 오류는 컴파일 프로세스를 수행하기 위해 오류를 처리하는 오류 처리기에 보고되어야 합니다. 일반적으로 오류는 메시지 형식으로 보고됩니다.

요약

  • 컴파일러는 여러 단계로 작동하며 각 단계는 소스 프로그램을 한 표현에서 다른 표현으로 변환합니다.
  • XNUMX단계 컴파일러 설계 1) 어휘 분석 2) 구문 분석 3) 의미 분석 4) 중간 코드 생성기 5) 코드 최적화기 6) 코드 Generator
  • 어휘 분석은 컴파일러가 소스 코드를 스캔하는 첫 번째 단계입니다.
  • 구문 분석은 텍스트의 구조를 발견하는 것입니다.
  • 의미론적 분석은 코드의 의미론적 일관성을 확인합니다.
  • 의미론적 분석 단계가 컴파일러를 통과하면 대상 시스템에 대한 중간 코드를 생성합니다.
  • 코드 최적화 단계에서는 불필요한 코드 라인을 제거하고 명령문 순서를 정렬합니다.
  • 코드 생성 단계는 코드 최적화 단계에서 입력을 받아 결과적으로 페이지 코드 또는 개체 코드를 생성합니다.
  • 기호 테이블에는 식별자의 속성에 대한 필드와 함께 각 식별자에 대한 레코드가 포함되어 있습니다.
  • 오류 처리 루틴은 여러 단계에서 오류를 처리하고 보고합니다.