반응형
SMALL

2023/12/14 7

[컴개/CI] IR Translation: Stack Management

Memory Organization (Stack) Run-Time Stack run-time stack이란 call stack이라고도 불리며, 한 함수를 call 할 때마다 생성되는 프레임이나 activation record이 구성하는 스택을 말한다. Activation record 함수를 수행하기 위한 execution environment으로 스택의 한 칸을 의미한다. Activation record에는 로컬 변수와 인자, 리턴값, 기타 임시 저장소(3-addr code에서 사용)를 의미하고, 재귀문일 때에도 각 call마다 하나씩 스택에 Activation record를 넣는다. run-time stack의 연산은 아래와 같다. - f 가 호출되면 f의 frame을 stack에 push (호출) -..

[컴개/CI] IR Translation: Storage Management

2 Classes of Storage in Process 우리가 사용할 수 있는 저장소는 두 가지가 있다. Registers 빠른 접근 일반 프로그래머에게는 보이지 않음 간접 접근이 불가능하다. 즉, 주소를 얻을 수 없다. Memory 상대적으로 접근이 느리지만, 간접접근 즉 주소를 얻을 수 있다. 위와 같은 특성으로 인해 변수 저장을 register를 이용할 것인지, memory를 이용할 것인지 결정하는데, 이는 HIR을 LIR로 변환하는 단계에서 주로 결정된다. Storage Class Selection 저장소에 저장하는 방법은 두 가지 방법이 존재한다. All memory approach 이 방법은 일단 모든 변수를 memory에 저장한 후 해당 변수 중 가능한 것을 register에 저장하도록 조..

[컴개/CI] IR Translation to 3-addr Code(Statement/Nested Expressions)

Statement Expressions 우리는 앞서 t = [[a + b]]와 같이 임시 변수에 결과값을 넣는 경우 expression, v = a+b와 같이 명령만 실행하는 경우 statement라고 명명했다. 이때 statement는 결과값이 없는데, statement가 결과값을 갖도록 확장할 수 있다. 결과값을 가질 수 있는 경우는 아래와 같다. - Block statements - If-then-else - Assignment statements 위와 같이 statement가 결과값을 갖게 하면 융통성이 생기게 된다. 3-주소 Translation 규칙: Statement Expression 위 예제에서 e값을 받아 t1에 넣고, e가 거짓인 경우 분기한 후 s를 실행한다. 이때 statement..

[컴개/CI] IR Translation to 3-addr Code (Statement)

3-주소 Translation 규칙: Statement Seq. 여러 문장들이 단순하게 연속해서 존재할 때, 각각에 대해 번역한 후 연결해주면 된다. 이때 위 식에서는 결과값을 t에 대입하지 않는데, statement는 결과값이 없으므로 결과값을 받을 t가 필요없다. 이러한 statement의 경우 단순히 연결만 하면 된다. 즉, t = [[e]]와 같이 결과값이 있는 경우를 expression, 결과값이 없고 단순히 연결하는 경우는 statement라고 한다. 3-주소 Translation 규칙: Assignment 위 경우는 단순히 expre의 결과를 할당하는 경우이다. OP처럼 v(변수 이름)와 '='은 HIR과 LIR이 모두 사용하기 때문에 [[ ]]에서 그대로 빠져나갈 수 있다. 다만, e는 H..

[컴개/CI] IR Translation to 3-addr code

HIR to LIR HIR는 상위 언어, 혹은 AST 등으로 생각할 수 있는데, 이러한 HIR을 LIR 즉, 3-addr code와 같은 형태로 바꿀 때 nested 구조(while, if, etc)로 인해 필연적으로 한 줄의 HIR코드는 여러 줄의 LIR 코드로 바뀐다. 여러 줄로 바뀌는 과정에서 임시 변수를 정의하고 임시 변수를 가져다 쓰는 형태로 바뀐다. 이때, 여러 줄로 바뀌는 규칙이 존재한다. Notation [[ e ]] HIR e에 대한 LIR expression. 즉, e는 하이레벨 코드가 하나 이상 섞인 HIR이며, [[]]에 들어가게 되면 LIR expr로 나오게 된다. 주로 sequence of LIR instruction이다. t = [[ e ]] e가 표현식일 때, 결과 값을 t에..

[컴개/CI] 3-address code: 예제 2

각각의 예를 분류하면 아래와 같다. - 3-addr code: GCC GIMPLE, LLVM - Stack machine code: JVM byte code, MSIL - Tree code: GCC RTL 가상 기계 코드 (Bytecode, MSIL) 컴파일러는 전반부와 후반부로 나뉘는데, 전반부가 끝나면 IR이 등장하고, IR은 후반부를 거쳐서 target machine code로 변환된다. 전반부는 주로 High-level 언어만 관련이 있고, 후반부는 주로 머신코드와 관계가 되어있으므로 IR을 잘 정의 해야 한다. 전반부와 후반부로 나눠놓고, 후반부를 interpreter로 만드는 경우가 있다. 후반부를 interpreter로 만들면 후반부 자체가 가짜 기계가 되고, 중간코드는 interpreter..

[컴개/CI] 3-address code: 예제 1

각각의 예를 분류하면 아래와 같다. - 3-addr code: GCC GIMPLE, LLVM - Stack machine code: JVM byte code, MSIL - Tree code: GCC RTL 예1) GCC의 GIMPLE GCC는 c 언어의 컴파일러로 최소 3개의 중간 코드가 존재한다. 중간 코드로는 GENERIC, GIMPLE, RTL이 있다. 이러한 GCC 컴파일러는 c언어 뿐만 아니라, c++, Objective C, Ada까지 입력으로 받을 수 있으며, target 코드의 종류도 여러 가지이다. GCC는 사실 컴파일러라기 보다 Compiler Generation Framework이라고 부르는 것이 더 정확하며, GCC에서 c 컴파일러를 찾기 위해서는 폴더를 타고 들어가야 한다. GEN..

반응형
LIST