Alpha Company
로그인
Alpha Company
로그인
컴파일러 CH.5 Code generation
Alpha, Orderly
·
2023년 6월 9일
팔로우
0
컴파일러
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 은 없어도 된다.
Alpha, Orderly
만능 컴덕후 겸 번지 팬
팔로우
이전 포스트
컴파일러 CH. 4 JVM
0개의 댓글
댓글 작성