컴파일러 CH.5 Code generation

Alpha, Orderly·2023년 6월 9일
0

컴파일러

목록 보기
5/5

Jasmine assembly code

  • 자바 바이트코드로 1:1 대응되는 자바를 위한 어셈블리 코드

    • 자바의 OOP적인 측면을 담고 있다.
  • MiniC는 자바가 아닌 C언어의 하위호환이다.

    • MiniC를 자바스럽게 꾸미고, Jasmine으로 바꾸는 과정을 거쳐야 된다.
    • 바이트코드로 변환되어 JVM에서 최종적으로 실행된다.

설명

  • String 써야해서 MiniC.lang.System import
  • gcd 프로그램 만들거라 gcd 클래스
  • 전역변수 : 클래스 정적 필드로 추가
  • 생성자 필요
  • 함수는 객체 메소드로 구현
  • 메인 함수는 일반 자바 메인함수처럼
    • int에서 void 리턴으로 변경
    • 현재 함수가 main인지 아닌지에 대해 프레임에 플래그 추가
  • 함수 호출 위해선 객체를 생성하는것이 필요하다.
  • 모든 내장함수는 정적 메소드 취급한다.

step-by-step

  • 전역변수는 정적 필드로 추가한다.
  • bytecode를 보면 i/j 정적 필드에 값을 대입하는 부분이 있다.
    • 생성자
    • putstatic gcd.i I

  • gcd 함수
  • 객체 메소드이기 때문에 객체 자신의 레퍼런스 ( Lgcd ) 를 포함한다.

code

  • 0,1 : 0인지 아닌지 확인, true가 되면 Label 0 ( 리턴 ) 으로 감
    • 0이 아니면 while body 실행
  • 6 : if의 비교식

  • main 함수
  • [Ljava/lang/String; >> String argv[]
  • invokespecial - 생성자 불러옴
  • astore_1 - invokespecial로 생성된 gcd의 레퍼런스를 저장
    • 0번 슬롯은 argv가 들어간다.
  • aload, getstatic >> 객체 함수 호출을 위한 argument 준비
  • invokevirtual gcd/gcd(II)I >> gcd 함수 호출
  • invokestatic lang/System/putInt(I)V >> 내장함수 putInt 호출

Code generation Visitor


Code template

  • [[x]] 와 같이 표현
    • x는 MiniC 코드가 들어간다.
  • emit(...) : 코드 생성 + 파일에 출력
ifeq L1 : 스택 최상단이 false(0)이면 L1으로 jump

Intliteral

  • EX. [[512]]
  • 값의 범위에 따라 다른 코드를 생성한다.
  • BIPUSH : byte int push
  • SIPUSH : short int push
  • LDC : load constant
  • Visitor 부분에서 함수를 사용한다.

Binary expression

  • lAST, rAST 가져옴
  • 연산자의 연산-타입, 종류 확인 후 emit 한다.

Equal Binary expression

  • ifeq L1
    • short circuit evaluation ( 앞이 False이면 뒷부분 평가 X ) 구현
  • 둘다 true이면 1을 스택에, 아니면 0을 스택에

Short circuit evaluation

  • and : 앞이 false면 false 리턴
  • or : 앞이 true면 true 리턴

Assignment statement

  • E의 결과를 찾아서
  • 1번 지역변수에 저장하는 예시

If statement

  • L1 : else
  • S1 : then
  • else 없으면 파란색 부분 생략 가능

While statement

  • S가 비어있어도 실행가능

Boolean literal

  • Lexeme 확인하고 ICONST_1 / ICONST_0

Float literal

  • Intliteral 처럼 값의 범위에 따라 다르게 emit

Fundecl Visitor

  • main 함수 여부에 따라 frame의 값이 바뀜

Method Frame

  • 메인함수 여부 : isMain
  • main 함수이면 local variable 0번에 argv가 들어가기에 1번부터 slot이 할당.

Local variable

  • index : local variable slot
  • global : 전역변수 여부

LHS == RHS

  • aload_1 : a 배열 레퍼런스를 불러옴
  • 2~4 번 줄 : index 계산
  • 4~6 번 줄 : RHS 계산
  • a > i+1 > j+5 > TOP 인 스택에 대해 배열 레퍼런스의 i+1 index에 j+5 를저장
    • iastore : integer address store

Return statement

  • ireturn / freturn 통해 스택 최상단을 리턴

Tree traversing


AST에는 괄호, keyword, type specifier 은 없어도 된다.

profile
만능 컴덕후 겸 번지 팬

0개의 댓글