이 영역을 누르면 첫 페이지로 이동
천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

페이지 맨 위로 올라가기

천천히 꾸준히 조용히

천천히 꾸준히 조용히.. i3months 블로그

[Compiler Design] Intermediate Representation

  • 2025.11.24 17:31
  • Computer Science/Compiler Design
반응형

 

 

 

중간언어(IR)는 컴파일러 내부적으로 사용하는 경우가 많고, 대부분 트리 형태나 Intruction List(기계어 코드) 형태를 가진다.

 

 

 

 

자바 코드는 AST로 변환된 후, 중간 언어를 거친 다음에 Low Level 코드로 변환된다.

중간 언어는 여러 종류가 있을 수 있다 - High Level, Low Level

 

AST와 가까이 있다면 소스코드 정보를 최대한 활용해서 최적화에 사용하고, Low Level과 가까이 있다면 실제로 Low Level 언어로 변환하는 작업을 수행한다.

 

High Level과 Low Level은 상대적인 개념이다. 당연히 3개 이상의 중간언어도 나올 수 있음.

 

High Level IR은 AST의 변형이라고 생각하면 됨. 

변수, 표현식, 문장, 함수 등 모든게 유지되니 변수 사용 분석, Loop Transform, 함수 Inlining 등 여러 작업을 수행할 수 있다.

 

 

 

 

 

좌측은 AST 우측은 TCOL (High Level IR) 그냥 바로 어떤 느낌인지 감이 온다.

 

컴파일러가 최적화 할 때는 3-Address Code 형식을 사용한다.

AST는 계산 순서가 트리 모양이라 컴퓨터가 순차적으로 처리하기에는 복잡함

그래서 3-Address Code를 사용함. x = y + z 처럼 한 줄로 나열되어 있어 다루기 편하다.

 

x = y OP z 형태의 N-tuple로 표현하고, 복잡한 식은 컴파일러가 생성한 임시 변수를 사용해서 쪼개진다. 

아래와 같이..

 

a = (b + c) * (-e)

1. t1 = b + c
2. t2 = -e
3. a = t1 * t2

 

 

실제 컴파일러의 GCC가 어떻게 IR 을 활용하는지 보자. GCC는 여러 단계의 IR을 사용한다. 

 

C,C++ -> GENERIC -> GIMPLE -> RTL -> 어셈블리 

 

C,C++ - 그냥 소스코드임

GENERIC - 트리 형태의 High Level IR 

GIMPLE - 3 Address Code 형태. 여기서 최적화 최대한 깎아준다. 임시변수가 생기면서 쪼개짐.

RTL (Register Transfer Language) - 기계어와 유사한 Low Level IR 

 

현대 컴파일러는 LLVM IR을 사용함. 모듈화가 확실하게 되어있어 깔끔하다.

Frontend : 소스코드 -> LLVM IR 

Common Optimizer : LLVM IR -> 최적화된 LLVM IR 

Backend : LLVM IR -> 기계어 

 

지역변수 앞에 %를 붙이고 개수 제한이 없는 가상의 레지스터를 사용한다.

전역변수 앞에는 @를 붙이고.. 타입도 i32처럼 확실하게 선언해준다.

 

if (a == 0) {
    a++;
}

----

%0 = load i32* %a, align 4                  ; a 읽음
  %cmp = icmp eq i32 %0, 0                  ; 0 같은지 확인하고 cmp 에다가 저장
  br i1 %cmp, label %if.then, label %if.end ; if then 분기 태움

if.then:
  %1 = load i32* %a, align 4
  %inc = add i32 %1, 1            
  store i32 %inc, i32* %a, align 4
  br label %if.end

if.end:
  ...

 

 

load add store 명령어가 3 Address Code 방식을 따른다.

Clang이 LLVM 기반인데, 다른 컴파일러랑 비교할 때 컴파일 속도가 확실히 빠름.

 

 

Java나 C#은 한 번 작성하고 Linux Window 등 어떤 환경에서든 실행할 수 있어야 된다는 철학으로 개발됨.

이 철학을 지키기 위해 VIrtual Machine을 사용한다.

 

Frontend : Source -> IR(ByteCode)

IR : Virtual Machine이 이해하는 기계어로, 주로 스택 머신 형태로 구성된다.

Backend : IR -> Target Machine에 맞는 기계어

 

Java ByteCode는 스택 머신 구조로 구성됨.

 

Local Variables : 함수 내부의 지역변수 (배열 형태)

Operand Stack : 연산을 위해 값을 잠시 쌓아두는 곳.

Constant Pool : 상수 / 메서드 / 필드 참조 정보를 저장하는 곳.

 

스택 머신 IR 설계 시 데이터 타입도 고려해야 한다..

자바는 Integer Add는 있지만 Short Add 명령어는 없음. -> JVM이 int로 변환해서 계산한다.

 

 

 

반응형
저작자표시 (새창열림)

'Computer Science > Compiler Design' 카테고리의 다른 글

[Compiler Design] Semantic Analysis  (0) 2025.11.25
[Compiler Design] Run-Time Storage Management  (0) 2025.11.24
[Compiler Design] SDD / AST  (0) 2025.11.17
[Compiler Design] LR(0) / SLR / LR(1) / LALR  (0) 2025.11.03
[Compiler Design] Bottom-Up Parsing  (0) 2025.10.18

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [Compiler Design] Semantic Analysis

    [Compiler Design] Semantic Analysis

    2025.11.25
  • [Compiler Design] Run-Time Storage Management

    [Compiler Design] Run-Time Storage Management

    2025.11.24
  • [Compiler Design] SDD / AST

    [Compiler Design] SDD / AST

    2025.11.17
  • [Compiler Design] LR(0) / SLR / LR(1) / LALR

    [Compiler Design] LR(0) / SLR / LR(1) / LALR

    2025.11.03
다른 글 더 둘러보기

정보

천천히 꾸준히 조용히 블로그의 첫 페이지로 이동

천천히 꾸준히 조용히

  • 천천히 꾸준히 조용히의 첫 페이지로 이동

검색

방문자

  • 전체 방문자
  • 오늘
  • 어제

카테고리

  • 분류 전체보기 (664)
    • Algorithm (205)
      • Data Structure (5)
      • Theory && Tip (33)
      • Baekjoon (166)
      • ALGOSPOT (1)
    • Spring (123)
      • Spring (28)
      • Spring Web MVC (20)
      • Spring Database (14)
      • Spring Boot (6)
      • Spring 3.1 (11)
      • Spring Batch (6)
      • Spring Security (16)
      • JPA (12)
      • Spring Data JPA (5)
      • QueryDSL (4)
      • eGovFramework (1)
    • Programming Language (74)
      • C (25)
      • C++ (12)
      • Java (19)
      • JavaScript (15)
      • Python (1)
      • PHP (2)
    • Computer Science (142)
      • Machine Learning (38)
      • Operating System (18)
      • Computer Network (28)
      • System Programming (22)
      • Universial Programming Lang.. (8)
      • Computer Architecture (4)
      • Compiler Design (11)
      • Computer Security (13)
    • Database (21)
      • Database (7)
      • MySQL (3)
      • Oracle (3)
      • Redis (5)
      • Elasticsearch (3)
    • DevOps (20)
      • Docker && Kubernetes (8)
      • Jenkins (4)
      • Amazon Web Service (8)
    • Mobile (28)
      • Android (21)
      • Flutter (7)
    • 💡 솔루션 (16)
    • 💬 기록 (10)
    • 📚 공부 (0)
    • 📝 낙서장 (25)

최근 글

나의 외부 링크

메뉴

  • 홈
반응형

정보

i3months의 천천히 꾸준히 조용히

천천히 꾸준히 조용히

i3months

블로그 구독하기

  • 구독하기
  • RSS 피드

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. Copyright © i3months.

티스토리툴바