| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- Spring Data JPA
- Transaction
- simplejpaRepository
- JDBC
- 실무
- transactional
- Spring
- Adapter
- JPA
- hexagonal architecture
- Layered Architecture
- springboot
- Hexagonal
- Today
- Total
Ezcho
컴파일러구조(13)- 코드 제너레이션 본문
코드 생성은 컴파일러의 최종 단계이다.
코드생성기에서 최종 어셈블러 코드로 변환한다
TARGET LANGUAGE
1. load(불러오기), store(저장), 계산, 점프, 조건 명령을 가지고있음
2. n개의 범용 레지스터가 존재함
3. 단순화를 위해 모든 피연산자를 정수라고 가정한다
4. 대부분의 명령은 연산자, 목표, 원시피연산자의 순으로 이루어짐
5. 명령어 앞에 레이블이 올 수 있음
레이블?:
Instructions표현
1. LD: 로드명령 LD dst, addr은 addr의 값을 dst로 읽어들임, dst = addr
2. ST: 스토어명령 ST x, r 은 레지스터 r의 값을 s에 저장함
3. OP: OP dst, str1, str2 는 str, str2를 연산해서 dst에 저장
4. BR L: BR(브랜치) L 은 명령의 결과를 L 로 분기함
5. Bcond r, L 은 레지스터 r의 값에 cond 가 나타내는 확인을 거쳐 L로 분기함
쉽다.
if x< y goto L 을 보자
LD R1, x
LD R2, y
SUB R1, R1, R2
BLTZ R1, M // if R1< 0 jump to M(Branch Low then Zero)
8비트 크기를 가지는 자료의 주솟값 참조
c = a[i]인 경우
LD R1, i
MUL R1, R1, 8
LD R2, a(R1)
ST b, R2
뭐 이건 CSA에서 했으므로, 크게 중요하지는 않다
IR에 등장하는 이름들이 실제 주소로 변환되는 과정이 중요한데..
프로시저는 고유의 논리 영역에서 실행되며 다음의 네가지 영역을 고려(메모리)
1. Code: 정적으로 결정되는 실행 코드
2. Static: 정적으로 결졍되는 전역 상수, 컴파일러가 생성하는 데이터를 포함
--> 컴파일 시간에 결정 가능
3. Heap: 동적으로 관리되는 실행중에 생성/소멸되는 객체를 담는 영역.
4. Stack: 동적으로 관리되는 활성 레코드를 담는영역
--> 컴파일 시간에 크기 결정 불가
