Introduction to Compiler

2023. 9. 28. 04:00전공/컴파일러

프로그램 실행 과정

  1. 컴파일러 : 소스코드를 목적코드로 컴파일
  2. 링커 : header나 목적 코드들을 연결
  3. 로더 : 메모리에 적재

컴파일러(Compiler)

  • X 언어를 Y언어로 번역해 주는 컴퓨터 프로그램
  • 소스 프로그램을 컴파일러가 목적 프로그램으로 번역
    • 소스 언어 : 고수준언어(C/C++)
    • 목적 언어 : 목적 코드(기계어)

컴파일러가 필요한 이유

  • 폰노이만 아키텍처는 기계어가 순차적으로 작성되어 있어야 함
  • 기계어 : 실제 기계가 작동하도록 하는 숫자로 된 코드
    • 기계어로 코드를 작성하는 것은 시간이 많이 들고 어렵다.
  • 어셈블리어 : 명령어와 메모리 위치가 주어진 기호 형식으로 표현됨
    • 어셈블러 : 어셈블리어를 기계어로 번역
  • 어셈블리어는 기계어보다 더 빨리, 정확히 작성 가능하나 여전히 작성하기 어려움
  • 고수준 언어 : 수학적 표현이나 자연어와 비슷하여 프로그램을 작성하기 간편
  • 고수준 언어로 작성된 코드는 컴파일러에 의해 실행파일로 번역됨

번역 단계

  1. 어휘분석(Lexical analysis) : 스캐너를 이용하여 소스코드를 토큰으로 인식
  2. 구문분석(Syntax analysis) : 토큰들을 입력받아서 파서를 통해 구문분석트리(Syntax tree)를 생성
  3. 의미분석(Semantic analysis) : 구문분석트리에 속성들을 부착한 트리를 생성
  4. 중간 코드 생성
  5. 코드 최적화
  6. 목적 코드 생성

스캐너(Scanner)

  • 어휘분석
  • 소스코드를 입력받아 토큰으로 나눔
  • 문자열 → 의미 있는 단위(토큰)
  • symbol table에 변수(identifiers) 저장
  • literal table에 literals 저장

파서(Parser)

  • 토큰을 입력받아 syntax tree(parse tree) 생성
  • 구문분석
  • 토큰들의 구조를 알고자 함
    • Grammar를 통해 올바른 문장인지 판단할 수 있음
    • Grammar는 프로그래밍 언어가 타당한 구조인지 정의하는 법칙

C의 BNF Grammar

의미 분석기(Semantic analyzer)

  • 의미 분석
    • 구조적으로는 맞으나 의미적으로 안 맞을 수 있음
  • 속성을 사용하여 의미 표현
    • Annotated syntax tree
  • 트리를 순회하면서 의미적으로 맞는지 판단

소스 코드 최적화

  • 실행 결과를 작고, 빠르고, 효율적이게 만들려는 것
  • 최적화를 많이 할수록 컴파일 시간 증가
  • 최적화 시간 조절 가능
    4 + 2를 6으로 미리 계산

중간단계 코드

  • 3 주소 코드 : 피연산자가 3개 있는 것

코드 생성기 & 목적 코드 최적화

  • 중간코드를 가지고 대상 머신에 따라 목적코드 생성
    • Integer가 몇 바이트인지
    • 부도소수점 데이터는 메모리를 얼마나 차지하는지
  • 목적코드 최적화
    • 할 수도 있고 안 할 수도 있음

'전공 > 컴파일러' 카테고리의 다른 글

Lex  (0) 2023.09.28
Lexical analysis  (0) 2023.09.28
Finite Automata  (0) 2023.09.28
Regular expression  (0) 2023.09.28
Formal Language, Grammar and Automata  (0) 2023.09.28