Introduction to Compiler
2023. 9. 28. 04:00ㆍ전공/컴파일러
프로그램 실행 과정
- 컴파일러 : 소스코드를 목적코드로 컴파일
- 링커 : header나 목적 코드들을 연결
- 로더 : 메모리에 적재
컴파일러(Compiler)
- X 언어를 Y언어로 번역해 주는 컴퓨터 프로그램
- 소스 프로그램을 컴파일러가 목적 프로그램으로 번역
- 소스 언어 : 고수준언어(C/C++)
- 목적 언어 : 목적 코드(기계어)
컴파일러가 필요한 이유
- 폰노이만 아키텍처는 기계어가 순차적으로 작성되어 있어야 함
- 기계어 : 실제 기계가 작동하도록 하는 숫자로 된 코드
- 기계어로 코드를 작성하는 것은 시간이 많이 들고 어렵다.
- 어셈블리어 : 명령어와 메모리 위치가 주어진 기호 형식으로 표현됨
- 어셈블러 : 어셈블리어를 기계어로 번역
- 어셈블리어는 기계어보다 더 빨리, 정확히 작성 가능하나 여전히 작성하기 어려움
- 고수준 언어 : 수학적 표현이나 자연어와 비슷하여 프로그램을 작성하기 간편
- 고수준 언어로 작성된 코드는 컴파일러에 의해 실행파일로 번역됨
번역 단계
- 어휘분석(Lexical analysis) : 스캐너를 이용하여 소스코드를 토큰으로 인식
- 구문분석(Syntax analysis) : 토큰들을 입력받아서 파서를 통해 구문분석트리(Syntax tree)를 생성
- 의미분석(Semantic analysis) : 구문분석트리에 속성들을 부착한 트리를 생성
- 중간 코드 생성
- 코드 최적화
- 목적 코드 생성
스캐너(Scanner)
- 어휘분석
- 소스코드를 입력받아 토큰으로 나눔
- 문자열 → 의미 있는 단위(토큰)
- symbol table에 변수(identifiers) 저장
- literal table에 literals 저장
파서(Parser)
- 토큰을 입력받아 syntax tree(parse tree) 생성
- 구문분석
- 토큰들의 구조를 알고자 함
- Grammar를 통해 올바른 문장인지 판단할 수 있음
- Grammar는 프로그래밍 언어가 타당한 구조인지 정의하는 법칙
C의 BNF Grammar
의미 분석기(Semantic analyzer)
- 의미 분석
- 구조적으로는 맞으나 의미적으로 안 맞을 수 있음
- 속성을 사용하여 의미 표현
- Annotated syntax tree
- 트리를 순회하면서 의미적으로 맞는지 판단
소스 코드 최적화
- 실행 결과를 작고, 빠르고, 효율적이게 만들려는 것
- 최적화를 많이 할수록 컴파일 시간 증가
- 최적화 시간 조절 가능
중간단계 코드
- 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 |