컴파일러의 단계 (예시, 과정 및 단계 포함)

⚡ 스마트 요약

컴파일러의 단계는 컴파일러가 소스 코드를 기계어로 변환하는 과정을 설명하며, 이 과정은 어휘 분석, 구문 분석, 의미 분석, 중간 코드 생성, 코드 최적화, 코드 생성의 여섯 단계로 이루어지며, 심볼 테이블 관리와 오류 처리가 전 과정에 걸쳐 지원됩니다.

  • 🔤 어휘 분석: 첫 번째 단계에서는 소스 코드를 스캔하고 문자를 토큰으로 그룹화하여 심볼 테이블을 채웁니다.
  • 🌳 구문 분석: 토큰은 문법 규칙에 따라 검사되고 구문 분석 트리로 구성됩니다.
  • 의미론적 분석: 컴파일러는 구문 트리와 심볼 테이블을 사용하여 타입 호환성과 의미를 검증합니다.
  • 🔁 중간의 Code: 번역을 용이하게 하기 위해 3주소 코드와 같은 기계 독립적인 표현 방식이 생성됩니다.
  • 최적화 : 중복되거나 접근할 수 없는 코드를 제거하여 프로그램 속도를 높이고 크기를 줄입니다.
  • 🖥️ Code 세대: 마지막 단계에서는 최적화된 코드를 대상 기계어 코드로 변환하고 레지스터와 메모리를 할당합니다.

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

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

  1. 어휘 분석
  2. 구문 분석
  3. 의미 분석
  4. 중간 코드 생성기
  5. Code 옵티 마이저
  6. Code 발전기
컴파일러의 단계
컴파일러의 단계

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

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단계: 중급 Code 세대

의미 분석 단계가 완료되면 컴파일러는 대상 머신용 중간 코드를 생성합니다. 이 코드는 특정 절대값에 대한 프로그램을 나타냅니다.tract 기계.
중간 코드는 고급 언어와 기계 수준 언어 사이에 있습니다. 이 중간 코드는 대상 기계어 코드로 쉽게 변환할 수 있는 방식으로 생성되어야 합니다.
중간 단계의 함수 Code 세대:

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

예시

예를 들어,

total = count + rate * 5

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

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

위상 5 : Code 최적화

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

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

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

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

될 수 있다

b =c * 10.0
f = e+b

위상 6 : Code 세대

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

예시

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

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

심볼 테이블 관리

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

오류 처리 루틴

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

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

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

자주 묻는 질문

분석 단계(프런트엔드)에서는 어휘, 구문 및 의미 분석을 통해 소스 코드를 분해합니다. 합성 단계(백엔드)에서는 중간 코드 생성, 최적화 및 최종 코드 생성을 통해 목표 프로그램을 구축합니다.

컴파일러는 소스 프로그램 전체를 실행하기 전에 기계어로 변환합니다. 인터프리터는 코드를 한 줄씩 변환하고 실행하는데, 이는 디버깅하기는 쉽지만 일반적으로 실행 속도는 느립니다.

3주소 코드는 각 명령어가 최대 3개의 피연산자를 갖는 중간 표현 방식입니다. 예를 들어 t1 = a + b와 같습니다. 최적화가 간단하고 대상 기계어로 변환하기도 쉽습니다.

인공지능과 머신러닝은 최신 컴파일러가 루프 변환, 인라이닝, 레지스터 할당과 같은 최적화 결정을 더욱 효율적으로 내릴 수 있도록 도와줍니다. 또한 주어진 프로그램과 대상에 대해 어떤 최적화가 성능을 향상시키는지 예측합니다.

네. AI는 각 단계를 예시를 통해 설명할 수 있습니다. trac예시 문장이 토큰에서 기계어로 어떻게 변환되는지 살펴보고, 후속 질문에 답합니다. 이를 통해 학생들은 컴파일러 설계를 더 쉽게 배울 수 있습니다.

이 게시물을 요약하면 다음과 같습니다.