| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Multiplay
- Replication
- gameplay effect
- rpc
- animation
- CTF
- Unreal Engine
- C++
- 보안
- widget
- gameplay ability system
- stride
- gas
- 언리얼엔진
- Aegis
- unity
- UI
- MAC
- attribute
- gameplay tag
- local prediction
- listen server
- 게임개발
- 게임 개발
- os
- 언리얼 엔진
- 유니티
- photon fusion2
- ability task
- linear regression
- Today
- Total
Replicated
중간 코드 생성 본문
1. 구문 지시적 번역에 의해 구문 분석 과정에서 중간 코드를 생성하는 방법
2. 파스 트리 또는 구문 트리와 같은 중간 표현을 생성한 후 이로부터 중간 코드를 생성하는 방법
구문 지시적 번역 방법의 경우
- 소스 프로그램에 구문 에러가 발생하면 에러 발생 전까지 수행한 중간 코드 생성이 무의미해져 시간 낭비 초래
- 셍성 규칙의 감축 순서에 따라 중간 코드를 생성하여 구현이 복잡
- 구문 에러가 없는 경우 오히려 빠르게 중간 코드를 생성할 수 있다는 것이 장점
소스 프로그램에 대해 중간 표현을 생성한 후 중간 코드를 생성하는 방법
- 중간 코드 생성에 필요한 의미 정보만을 파스 트리 또는 구문 트리에 저장하고 있어 소스 생성기의 구현이 매우 용이
- 컴파일러의 크기가 커지고 컴파일 시간이 길어짐
논리식
- 논리식은 논리값을 계산하거나 if 또는 while 문에서 조건식을 계산하는데 사용
- and, or, not과 같은 논리 연산자와 부울 변수이거나 관계식으로 표현되는 피연산자로 구성
- 만약 언어의 정의에 의해 논리식의 한 부분을 검사하지 않아도 된다면 컴파일러는 논리적 계산에서 하나의 표현식만을 계산하게 함으로써 최적화할 수 있음
or와 and가 왼쪽 결합이고 우선순위는 or가 가장 낮고 and, not 순으로 높을 때
A or B and not C 에 대한 3-주소 코드
T1 = not C
T2 = B and T1
T3 = A or T2
관계식 A < B는 조건문 if A < B then 1 else 0 와 일치하므로 3-주소 코드로 변환 시
1. if A < B GOTO 4
2. T = 0
3. GOTO 5
4. T = 1
5.
A < B or C
1. if A < B GOTO 4
2. T1 = 0
3. GOTO 5
4. T1 = 1
5. T2 = T1 or C
주석 파스 트리와 quadruple 코드 만들기
A < B or C < D and F < G
에 대한 주석 파스트리, 백패칭을 이용한 quadruple 코드로 만들기
* 백패칭은 논리 연산으로 인한 점프할 주소를 나중에 채우는 기법
* M.quad = {102}는 논리 연산 시점에 쿼드러플 번호가 102라는 것
-> 나중에 백패칭 시 이 번호를 이용해 E1이 false일 때 E2로 점프하도록 채워넣음
처음 문장 번호를 100번으로 가정 시 논리식의 구문 분석은
1. A < B로부터 E -> id1 relop id2의 의미 분석에 의해 E.t = makelist(next quad)를 수행
- nextquad = {100}이므로 E.t = {100}
- E.f = makelist(nextquad + 2) 이므로 E.f = {101}
| 100 if A < B GOTO _ 101 GOTO _ |
또한, M.quad = {102}
2. 두번째 구문 분석은 C < D, M.quad = {102}이므로
- E.t = {102}, E.f = {103}, M.quad = {104}
| 102 if C < D GOTO _ 103 GOTO _ |
3. 세번째 구문 분석은 F < G, M.quad = {104}이니 E.t = {104}, E.f = {105}
| 104 if F < G GOTO _ 105 GOTO _ |
나열 시
| 100 if A < B GOTO _ 101 GOTO _ 102 if C < D GOTO _ 103 GOTO _ 104 if F < G GOTO _ 105 GOTO _ |
4. 다음 순서는 C < D and F < G인데, E -> E1 and M E2 의미 분석 규칙에 의해
backpatch(E1.t, M.quad)
E.t = E2.t
E.f = merge(E1.f, E2.f)
- backpatch(E1.t, M.quad) 실행
- E1.t의 목적지를 M.quad로 하라는 뜻
- 102 if C < D GOTO 104
- E.t = {104}, E.f = {103, 105}
| 100 if A < B GOTO _ 101 GOTO _ 102 if C < D GOTO 104 103 GOTO _ 104 if F < G GOTO _ 105 GOTO _ |
5. 다음 순서는 A < B or M E (or이라 중간 스킵되서 이렇게 표기됨)
- E -> E1 or M E2 의미 분석 규칙에 의하면
- backpatch(E1.t, M.quad), E1.f = {101}, M.quad = {102}
- 101 GOTO 102
- E.f = {103, 105}, E.t = {101, 104} 이니 E2f = {103, 105}
| 100 if A < B GOTO _ 101 GOTO 102 102 if C < D GOTO 104 103 GOTO _ 104 if F < G GOTO _ 105 GOTO _ |
결국 이렇게 됨
'학부 > 오토마타와 컴파일러' 카테고리의 다른 글
| 코드 최적화 : 최적화 기법 (0) | 2025.12.06 |
|---|---|
| 코드 최적화 : 기본 블록 및 흐름 그래프 (0) | 2025.12.06 |
| 구문 지시적 번역 (0) | 2025.12.06 |
| 중간 언어 (0) | 2025.12.05 |
| 의미 분석(semantic analysis)과 형 검사 (0) | 2025.12.04 |