본문 바로가기

23년 2학기 학교공부/컴파일러개론

(25)
[CP] Dataflow analysis/optimization 2023학년도 2학기 충남대학교 조은선 교수님의 컴파일러개론 수업 정리자료입니다. 📁 Reaching Definition Analysis 예시를 보자. 🌱 📝 문제 풀어보기 Reaching definitions 분석을 하시오. 즉, GEN/KILL을 구하고 IN/OUT을 구하시오
[CP] Analysis and Optimization 2023학년도 2학기 충남대학교 조은선 교수님의 컴파일러개론 수업 정리자료입니다. 📁 Acyclic Code Optimization Acyclic Code란 Loop가 없는 코드를 말하며, 분석 및 최적화가 상대적으로 쉽다. Acyclic code optimization의 종류에는 두 가지가 있다. 1. Inner basic block opt. = Intra opt. = Local opt. 부분적인 관점(단일 block 내)에서, 즉 basic block 내부에서 비효율적인 코드를 구분해내고 좀 더 효율적인 코드로 개선하는 최적화를 말한다. 2. Inter-basic block opt. = Global opt. basic block 간의 관계를 분석하고 이를 고려하는 최적화를 말한다. 🌱 Inner Ba..
[CP] Control Flow Analysis/Optimization 2023학년도 2학기 충남대학교 조은선 교수님의 컴파일러개론 수업 정리자료입니다. 컴파일러 후반부.에서 기계와 직접적으로 관련이 없지만 컴파일러 과정에서 빈번하게 일어나는 단계 중 하나가 최적화. Control flow analysis/optimization과 Dataflow analysis/optimization을 살펴보자. 📁 Optimization 최적화란 주어진 입력 프로그램과 의미적으로 동등하면서 좀 더 효율적인 코드로 바꾸는 작업을 말한다. 이때 효율적이라는 것은 실행시간이 짧고, 기억장소 요구량이 최소화되는 것이다. 최적화에서 핵심은 기본적으로 의미적으로 동등한 코드를 만드는 것. 이를 위해서 분석(analysis)를 이용한다. 분석을 통해 코드가 동등함이 보장된 이후에 계산의 횟수를 줄이거..
[CP] Machine Dependent Processing 2023학년도 2학기 충남대학교 조은선 교수님의 컴파일러개론 수업 정리자료입니다. 이제부터는 물리적인 제약조건도 생각하자. 컴파일러 후반부는 빠른 코드로 바꾸는 최적화 부분과 실제 머신에서 도는 코드로 바꾸는 부분으로 나뉜다. 회색 부분이 실제 머신에서 도는 코드로 바꾸는 부분. Machine-independent Optimization부분은 CPU나 컴퓨터구조와 관련없는 부분. 아래부분은 좀더 물리적 제약조건이 있고 머신 각각에 특화된 최적화를 하기 위해 노력하는 부분. 이번 시간에는 Instruction Selection과 Instruction Scheduling과 Register Allocation부분을 다뤄보자. 📁 Instruction Selection 명령어를 할당하는 것을 insturctio..
[CP] Semantic Analysis : Type Checking 2023학년도 2학기 충남대학교 조은선 교수님의 컴파일러개론 수업 정리자료입니다. 📁 Type Checking 수행 중 변수가 가지는 값에 대한 기술을 타입(Type)이라고 한다. 예를 들어 int x라고 하면, x가 integer값 범위에 들어가는 값을 가지게 된다. 라는 뜻 타입 오류라는건 값을 부적절하게 사용하거나, 값의 범위를 벗어남. 타입 오류가 없다는건 타입 안정성이 있다고 표현할 수 있으며, 타입 안정성을 보장하는 방법은 다음과 같다. 타입을 선언(binding)한다. 선언 방법에는 int x와 같이 명시적인 방법과 x=1과 같이 암묵적인 방법이 있다. 타입을 검사(checking)한다. 타입 규칙을 세우고 이에 대해 검사한다. 타입과 관련된 몇가지 개념들을 보자. 1. Static vs. ..
[CP] Semantic Analysis : Symbol Tables 2023학년도 2학기 충남대학교 조은선 교수님의 컴파일러개론 수업 정리자료입니다. 컴파일러 전반부는 어휘분석, 구문분석, 의미분석, 중간코드 생성으로 나뉜다. 구문분석까지 진행하고, 중간코드를 생성하기 전에 프로그램이 semantics를 분석해두기 위한 의미분석 program semantics에는 두가지 종류가있다. 1. run time에 어떻게 동작하는지에 대한 얘기 2. 프로그램을 돌리지 않고 읽어봤을때 분석. static semantics는 거의 타입분석과 비슷하다고 할 수 있음. 의미분석 단계에서는 static semantics를 대상으로 진행된다. symbol tables, types에 대해 알아보자. 📁 Semantic Analasis semantics analysis는 정석적인 분석 과정이라..
[CP] Stack Management 2023학년도 2학기 충남대학교 이민선 교수님의 컴파일러개론 수업 정리자료입니다. 프로그램의 여러가지 메모리 중 Stack에 대해 살펴보자. 📁 Memory Organization (Stack) Stack과 Heap은 런타임에 크기가 변한다. Stack은 아래쪽으로 증가하고, Heap은 위로 증가한다. 이때 Stack과 heap 위치가 바뀔 수 있다. Code, Static Data : 컴파일러에 의해 크기가 결정된다. 📁 Run-Time Stack Run-Time Stack이란 Call-Stack이라고도 불리며 함수 하나를 호출할때마다 생성되는 Frame 혹은 Activation record이 구성하는 Stack을 말한다. 이때 스택에 쌓이는 한칸을 Activation record라고 부른다. Acti..
[CP] Storage Management 우리가 사용하는 storage는 크게 두가지가 있다. 1. Register 2. Memory register는 접근이 빠르고 프로그래머에는 보이지 않는다. 간접접근이 불가능하다. 그 말은 즉 주소를 딸 수 없다. 메모리는 상대적으로 느리지만 간접접근이 가능하다. 이런 특성을 고려하여 HIR에서 LIR로 변환하는 과정에 변수를 레지스터로 할 것인지 메모리로 할 것인지를 많이 결정한다. 결정하는 방법은 두가지가 있다. 1. Standard approach 글로벌 변수나 static은 메모리에 둔다. 로컬 변수 중 struct나 array 등 주소를 사용하여 메모리 연산이 가능한 경우 메모리에 둔다. int x처럼 scalar들 중 '&' 오퍼레이터로 접근하는 경우는 메모리, 다른 경우는 virtual reg..