12월 4일, 14주차 2강
* 개인 공부를 위해 정리한 것입니다. 정확한 내용은 꼭 본인이 공부하는 교재를 참고하시기 바랍니다.
- middle-end optimizer: 중간표현을 입력받아 효율적인 코드로 변환하는 역할.
- 코드 의미를 보존하면서도 불필요한 중간 변수나 연산을 제거해 최적화된 결과 생성
- 코드 최적화 방법
- 공통 부분식 제거
- 표현식 E가 프로그램 내에서 한 번 계산된 이후, 해당 변수 값이 변경되지 않았다면 E는 공통 부분식으로 간주
- 동일한 계산 반복할 필요 없이, 이전 계산 결과 재사용해 프로그램 최적화
- copy propagation
- u=v와 같은 복사문 이후, u가 재정의 되지 않는 한 u 대신 v를 사용하는 최적화 기법
- 중간 변수 없이 값 바로 사용하는 방식, 코드 간결성과 실행효율 높임
- 불필요한 변수 제거해 코드가 더 간결하고 읽기와 디버깅 쉬워짐
- 레지스터에 할당되는 변수의 수를 줄여 하드웨어 자원을 더 효율적으로 활용
- 동일한 값을 가진 변수가 중복 사용되는 것을 방지함
- 다른 최적화 기법과 조합되었을 때 시너지 효과 냄
- 죽은 코드 제거
- live variable: 프로그램의 특정지점에서 변수가 나중에 사용된다면 live 상태라고 함. 반대는 dead상태
- deadcode: 결과값이 사용되지 않는 계산문을 deadcode라고 함. 프로그램 실행에 영향을 미치지 않으므로 제거
- 불필요한 연산을 줄여 실행 속도를 개선하고, 코드 실행에 필요한 메모리와 cpu 자원을 절약, 읽기 쉽고 유지보수하기 쉬운 코드 만듦, 프로그램의 실행 흐름을 단순화하고 다른 최적화 기법과 시너지 효과를 냄
- 상수접기
- 코드 내에서 상수값 계산을 컴파일 시점에 미리 수행해서 상수로 이뤄진 표현식만 평가해 계산결과로 대체
- 런타임에서 불필요한 계산을 줄이고 실행 속도를 높임. 복잡한 표현식을 단순화해 가독성 개선.
- B5,B6에서 등장하는 연산은 이미 t2,t4에서 정의된게 재등장하는 것이라 재사용하면 코드가 간소화됨(copy propagation)
- 정적 분석: 프로그램 실행 전에 코드 데이터 분석해 실행 경로에 따른 정보 흐름을 유추하는 과정
- 최적화 및 오류 검출에 매우 중요
- 동일한 표현식이 모든 실행 경로에서 같은 값을 갖는가? 해당 부분식을 공통변수로 대체해 중복 계산 제거
- 할당문의 결과가 이후 실행 경로에서 사용되지 않는가? deadcode elimination
'전공 > 프로그래밍 언어 및 컴파일러' 카테고리의 다른 글
Lec18. Register Allocation - 15주차 2강 (0) | 2024.12.15 |
---|---|
Lec17.Optimization (2) - 15주차 1강 (1) | 2024.12.14 |
Lec15.lR Translation (2) - 14주차 2강 (0) | 2024.12.10 |
Lec14.IR Translation (1) - 14주차 1강 (0) | 2024.12.10 |
Lec13.Semantic Analysis (4) - 13주차 1강/2강 (0) | 2024.12.09 |